diff --git a/contrib/pax_storage/src/test/regress/expected/bfv_partition.out b/contrib/pax_storage/src/test/regress/expected/bfv_partition.out index ec180b9855f..c0fb8100292 100644 --- a/contrib/pax_storage/src/test/regress/expected/bfv_partition.out +++ b/contrib/pax_storage/src/test/regress/expected/bfv_partition.out @@ -2240,9 +2240,9 @@ ERROR: syntax error at or near "`" LINE 1: ALTER TABLE qa147.sales SET SUBPARTITION TEMPLATE (`); ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 216}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 252}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName europe :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "europe" :location 291}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 216})) :location 208} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 191} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 252})) :location 244} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 226} {GPPARTDEFELEM :partName europe :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "europe" :location 291})) :location 283} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 263}) :encClauses <> :isTemplate true :fromCatalog false :location 189} (1 row) set client_min_messages='warning'; @@ -2277,9 +2277,9 @@ select relid::regclass, level, template from gp_partition_template where relid = ALTER TABLE qa147sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usa VALUES ('usa'), SUBPARTITION asia VALUES ('asia') ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76})) :location 68} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110})) :location 102} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 84}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Invalid subpartition @@ -2294,9 +2294,9 @@ ERROR: invalid boundary specification for LIST partition LINE 2: ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76})) :location 68} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110})) :location 102} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 84}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2308,9 +2308,9 @@ ERROR: invalid boundary specification for LIST partition LINE 4: SUBPARTITION usadate start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76})) :location 68} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110})) :location 102} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 84}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2322,9 +2322,9 @@ ERROR: invalid boundary specification for LIST partition LINE 3: SUBPARTITION usadate start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 76})) :location 68} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 110})) :location 102} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 84}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) drop table qa147sales; @@ -2352,17 +2352,17 @@ select relid::regclass, level, template from gp_partition_template where relid = ALTER TABLE qa147sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END (date '2008-02-01') EXCLUSIVE ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-02-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2} :partEvery <>} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-02-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2 :location 106} :partEvery <> :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) ALTER TABLE qa147sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END (date '2009-01-01') EXCLUSIVE EVERY (INTERVAL '1 month') ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2 :location 106} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1}) :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Invalid subpartition template @@ -2372,9 +2372,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 2: ( SUBPARTITION usa VALUES ('usa'), SUBPARTITION asia VALUES ... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2 :location 106} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1}) :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2386,9 +2386,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 3: SUBPARTITION usa1 VALUES('usa'), ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2 :location 106} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1}) :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2400,9 +2400,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 4: SUBPARTITION usa1 VALUES('usa')); ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147sales'::regclass; - relid | level | template -------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 82} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 77} :location -1}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 116} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 111} :location -1}) :edge 2 :location 106} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 156} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 147} :location -1}) :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 51}) :encClauses <> :isTemplate true :fromCatalog false :location 49} (1 row) drop table qa147sales; @@ -2437,9 +2437,9 @@ select relid::regclass, level, template from gp_partition_template where relid = ALTER TABLE qa147.sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usa VALUES ('usa'), SUBPARTITION asia VALUES ('asia') ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77})) :location 69} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111})) :location 103} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 85}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Invalid subpartition @@ -2454,9 +2454,9 @@ ERROR: invalid boundary specification for LIST partition LINE 2: ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77})) :location 69} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111})) :location 103} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 85}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2468,9 +2468,9 @@ ERROR: invalid boundary specification for LIST partition LINE 4: SUBPARTITION usadate start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77})) :location 69} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111})) :location 103} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 85}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2482,9 +2482,9 @@ ERROR: invalid boundary specification for LIST partition LINE 3: SUBPARTITION usadate start (date '2008-01-01') INCLUSIVE END... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usa :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "usa" :location 77})) :location 69} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52} {GPPARTDEFELEM :partName asia :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "asia" :location 111})) :location 103} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 85}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) DROP SCHEMA qa147 cascade; @@ -2519,17 +2519,17 @@ select relid::regclass, level, template from gp_partition_template where relid = ALTER TABLE qa147.sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END (date '2008-02-01') EXCLUSIVE ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-02-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2} :partEvery <>} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1 :location 71} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-02-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2 :location 107} :partEvery <> :location 71} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) ALTER TABLE qa147.sales SET SUBPARTITION TEMPLATE ( SUBPARTITION usam1 start (date '2008-01-01') INCLUSIVE END (date '2009-01-01') EXCLUSIVE EVERY (INTERVAL '1 month') ); select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1 :location 71} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2 :location 107} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1}) :location 71} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Invalid subpartition template @@ -2539,9 +2539,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 2: ( SUBPARTITION usa VALUES ('usa'), SUBPARTITION asia VALUES ... ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1 :location 71} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2 :location 107} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1}) :location 71} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2553,9 +2553,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 3: SUBPARTITION usa1 VALUES('usa'), ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1 :location 71} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2 :location 107} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1}) :location 71} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) -- Mix and Match RANGE/LIST . Expect to Error @@ -2567,9 +2567,9 @@ ERROR: invalid boundary specification for RANGE partition LINE 4: SUBPARTITION usa1 VALUES('usa')); ^ select relid::regclass, level, template from gp_partition_template where relid = 'qa147.sales'::regclass; - relid | level | template --------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +-------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + qa147.sales | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName usam1 :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2008-01-01" :location 83} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 78} :location -1}) :edge 1 :location 71} :partEnd {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2009-01-01" :location 117} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 112} :location -1}) :edge 2 :location 107} :partEvery ({TYPECAST :arg {A_CONST :val "\1\ month" :location 157} :typeName {TYPENAME :names ("pg_catalog" "interval") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 148} :location -1}) :location 71} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) drop schema qa147 cascade; @@ -2702,9 +2702,9 @@ alter table partsupp_def set subpartition template( subpartition aaa start(400) -- Note 2: We do not support this function yet, but if we are able to split default partition with default subpartition, would we -- be using the subpartition template to definte the "new" partition or the existing one. select relid::regclass, level, template from gp_partition_template where relid = 'partsupp_def'::regclass; - relid | level | template ---------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - partsupp_def | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName aaa :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 400 :location 75}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 600 :location 85}) :edge 2} :partEvery ({A_CONST :val 100 :location 96})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + partsupp_def | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName aaa :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 400 :location 75}) :edge 1 :location 69} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 600 :location 85}) :edge 2 :location 80} :partEvery ({A_CONST :val 100 :location 96}) :location 69} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 50} (1 row) alter table partsup_def add partition f1 start(0) end (300) every(100); @@ -2728,9 +2728,9 @@ HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sur alter table partsupp_def2 set subpartition template(); alter table partsupp_def2 set subpartition template( subpartition aaa start(400) end (600) every(100) ); select relid::regclass, level, template from gp_partition_template where relid = 'partsupp_def2'::regclass; - relid | level | template ----------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - partsupp_def2 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName aaa :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 400 :location 76}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 600 :location 86}) :edge 2} :partEvery ({A_CONST :val 100 :location 97})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + partsupp_def2 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName aaa :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 400 :location 76}) :edge 1 :location 70} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 600 :location 86}) :edge 2 :location 81} :partEvery ({A_CONST :val 100 :location 97}) :location 70} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 53}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) drop table partsupp_def; diff --git a/contrib/pax_storage/src/test/regress/expected/expressions.out b/contrib/pax_storage/src/test/regress/expected/expressions.out index 2bb3fbf11c1..667c54833bb 100644 --- a/contrib/pax_storage/src/test/regress/expected/expressions.out +++ b/contrib/pax_storage/src/test/regress/expected/expressions.out @@ -509,14 +509,12 @@ select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6 select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); a --- - -(1 row) +(0 rows) select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); a --- - -(1 row) +(0 rows) -- ensure the result matched with the non-hashed version. We simply remove -- some array elements so that we don't reach the hashing threshold. diff --git a/contrib/pax_storage/src/test/regress/expected/partition.out b/contrib/pax_storage/src/test/regress/expected/partition.out index 08551c49313..dde313f6ce0 100755 --- a/contrib/pax_storage/src/test/regress/expected/partition.out +++ b/contrib/pax_storage/src/test/regress/expected/partition.out @@ -2526,17 +2526,17 @@ select relid::regclass, level from gp_partition_template where relid = 'rank_set alter table rank_settemp set subpartition template (default subpartition def2); -- def2 is there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (default subpartition def2); -- Should still be there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); @@ -2544,9 +2544,9 @@ alter table rank_settemp add partition f1 values ('N'); alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); alter table rank_settemp add partition f2 values ('C'); select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1} :partEnd <> :partEvery <>} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1 :location 52} :partEnd <> :partEvery <> :location 52} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) drop table rank_settemp; @@ -3682,11 +3682,11 @@ alter table mpp5992 set subpartition template (subpartition l1 values (1,2,3), subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- Now we can add a new partition @@ -3936,11 +3936,11 @@ select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relnam (112 rows) select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- MPP-10223: split subpartitions @@ -4140,9 +4140,9 @@ subpartition template (start (1) end (10) every (1)) NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table. HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; - relid | level | template -----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2} :partEvery ({A_CONST :val 1 :location 141})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1 :location 115} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2 :location 125} :partEvery ({A_CONST :val 1 :location 141}) :location 115} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 115}) :encClauses <> :isTemplate true :fromCatalog false :location 114} (1 row) -- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes diff --git a/contrib/pax_storage/src/test/regress/expected/partition_optimizer.out b/contrib/pax_storage/src/test/regress/expected/partition_optimizer.out index ba5d6f5123f..f3b642974f9 100755 --- a/contrib/pax_storage/src/test/regress/expected/partition_optimizer.out +++ b/contrib/pax_storage/src/test/regress/expected/partition_optimizer.out @@ -2527,17 +2527,17 @@ select relid::regclass, level from gp_partition_template where relid = 'rank_set alter table rank_settemp set subpartition template (default subpartition def2); -- def2 is there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (default subpartition def2); -- Should still be there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); @@ -2545,9 +2545,9 @@ alter table rank_settemp add partition f1 values ('N'); alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); alter table rank_settemp add partition f2 values ('C'); select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1} :partEnd <> :partEvery <>} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1 :location 52} :partEnd <> :partEvery <> :location 52} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) drop table rank_settemp; @@ -3683,11 +3683,11 @@ alter table mpp5992 set subpartition template (subpartition l1 values (1,2,3), subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- Now we can add a new partition @@ -3937,11 +3937,11 @@ select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relnam (112 rows) select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- MPP-10223: split subpartitions @@ -4141,9 +4141,9 @@ subpartition template (start (1) end (10) every (1)) NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table. HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; - relid | level | template -----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2} :partEvery ({A_CONST :val 1 :location 141})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1 :location 115} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2 :location 125} :partEvery ({A_CONST :val 1 :location 141}) :location 115} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 115}) :encClauses <> :isTemplate true :fromCatalog false :location 114} (1 row) -- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes diff --git a/contrib/pax_storage/src/test/regress/expected/xml.out b/contrib/pax_storage/src/test/regress/expected/xml.out index 658b8fcbf24..8eb4294d264 100644 --- a/contrib/pax_storage/src/test/regress/expected/xml.out +++ b/contrib/pax_storage/src/test/regress/expected/xml.out @@ -829,7 +829,7 @@ SELECT table_name, view_definition FROM information_schema.views table_name | view_definition ------------+--------------------------------------------------------------------------------------------------------------------------------------- xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; - xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text NO INDENT) AS "xmlserialize"; + xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text INDENT) AS "xmlserialize"; xmlview11 | SELECT (XMLSERIALIZE(DOCUMENT '42'::xml AS character varying NO INDENT))::character varying AS "xmlserialize"; xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; diff --git a/gpcontrib/gp_stats_collector/src/stat_statements_parser/pg_stat_statements_parser.c b/gpcontrib/gp_stats_collector/src/stat_statements_parser/pg_stat_statements_parser.c index 8e7bd917541..c7b03c807f7 100644 --- a/gpcontrib/gp_stats_collector/src/stat_statements_parser/pg_stat_statements_parser.c +++ b/gpcontrib/gp_stats_collector/src/stat_statements_parser/pg_stat_statements_parser.c @@ -37,10 +37,10 @@ #include "lib/stringinfo.h" #include "mb/pg_wchar.h" #include "miscadmin.h" +#include "nodes/queryjumble.h" #include "parser/scanner.h" #include "utils/builtins.h" #include "utils/memutils.h" -#include "utils/queryjumble.h" #include "pg_stat_statements_parser.h" diff --git a/gpcontrib/pg_hint_plan/pg_hint_plan.c b/gpcontrib/pg_hint_plan/pg_hint_plan.c index 46fe8ca60de..53e976c330c 100644 --- a/gpcontrib/pg_hint_plan/pg_hint_plan.c +++ b/gpcontrib/pg_hint_plan/pg_hint_plan.c @@ -2963,7 +2963,7 @@ get_current_hint_string(ParseState *pstate, Query *query) if (jumblequery) { - jstate = JumbleQueryDirect(query, query_str); + jstate = JumbleQuery(query); /* * Normalize the query string by replacing constants with '?' diff --git a/src/backend/Makefile b/src/backend/Makefile index 675d97a6617..600560df631 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -210,8 +210,8 @@ submake-catalog-headers: $(MAKE) -C catalog distprep generated-header-symlinks # run this unconditionally to avoid needing to know its dependencies here: -#submake-nodes-headers: -# $(MAKE) -C nodes distprep generated-header-symlinks +submake-nodes-headers: + $(MAKE) -C nodes distprep generated-header-symlinks # run this unconditionally to avoid needing to know its dependencies here: submake-utils-headers: diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index b7d09e6bd79..63b4c323a61 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2215,7 +2215,7 @@ CheckTablespaceDirectory(void) snprintf(path, sizeof(path), "pg_tblspc/%s", de->d_name); if (get_dirent_type(path, de, false, ERROR) != PGFILETYPE_LNK) - ereport(allow_in_place_tablespaces ? WARNING : PANIC, + ereport(allow_in_place_tablespaces ? WARNING : WARNING, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("unexpected directory entry \"%s\" found in %s", de->d_name, "pg_tblspc/"), diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index cb00fea9fdf..582341e1fea 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -306,7 +306,7 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, query = castNode(Query, stmt->query); if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, pstate->p_sourcetext); + jstate = JumbleQuery(query); if (post_parse_analyze_hook) (*post_parse_analyze_hook) (pstate, query, jstate); diff --git a/src/backend/commands/explain_gp.c b/src/backend/commands/explain_gp.c index 27580fbd5fa..5e9ff3376bd 100644 --- a/src/backend/commands/explain_gp.c +++ b/src/backend/commands/explain_gp.c @@ -28,6 +28,7 @@ #include "cdb/cdbvars.h" /* GpIdentity.segindex */ #include "cdb/cdbendpoint.h" #include "cdb/memquota.h" +#include "commands/explain_gp.h" #include "libpq/pqformat.h" /* pq_beginmessage() etc. */ #include "miscadmin.h" #include "utils/resscheduler.h" @@ -40,74 +41,6 @@ /* Convert bytes into kilobytes */ #define kb(x) (floor((x + 1023.0) / 1024.0)) -/* EXPLAIN ANALYZE statistics for one plan node of a slice */ -typedef struct CdbExplain_StatInst -{ - NodeTag pstype; /* PlanState node type */ - - /* fields from Instrumentation struct */ - instr_time starttime; /* Start time of current iteration of node */ - instr_time counter; /* Accumulated runtime for this node */ - double firsttuple; /* Time for first tuple of this cycle */ - double startup; /* Total startup time (in seconds) */ - double total; /* Total total time (in seconds) */ - double ntuples; /* Total tuples produced */ - double ntuples2; - double nloops; /* # of run cycles for this node */ - double nfiltered1; - double nfiltered2; - bool prf_work; - double nfilteredPRF; - double execmemused; /* executor memory used (bytes) */ - double workmemused; /* work_mem actually used (bytes) */ - double workmemwanted; /* work_mem to avoid workfile i/o (bytes) */ - bool workfileCreated; /* workfile created in this node */ - instr_time firststart; /* Start time of first iteration of node */ - int numPartScanned; /* Number of part tables scanned */ - - TuplesortInstrumentation sortstats; /* Sort stats, if this is a Sort node */ - HashInstrumentation hashstats; /* Hash stats, if this is a Hash node */ - IncrementalSortGroupInfo fullsortGroupInfo; /* Full sort group info for Incremental Sort node */ - IncrementalSortGroupInfo prefixsortGroupInfo; /* Prefix sort group info for Incremental Sort node */ - int bnotes; /* Offset to beginning of node's extra text */ - int enotes; /* Offset to end of node's extra text */ - int nworkers_launched; /* Number of workers launched for this node */ - WalUsage walusage; /* add WAL usage */ -} CdbExplain_StatInst; - - -/* EXPLAIN ANALYZE statistics for one process working on one slice */ -typedef struct CdbExplain_SliceWorker -{ - double peakmemused; /* bytes alloc in per-query mem context tree */ - double vmem_reserved; /* vmem reserved by a QE */ - int nworkers_launched; /* Number of workers launched for this slice */ -} CdbExplain_SliceWorker; - - -/* Header of EXPLAIN ANALYZE statistics message sent from qExec to qDisp */ -typedef struct CdbExplain_StatHdr -{ - NodeTag type; /* T_CdbExplain_StatHdr */ - int segindex; /* segment id */ - int nInst; /* num of StatInst entries following StatHdr */ - int bnotes; /* offset to extra text area */ - int enotes; /* offset to end of extra text area */ - - CdbExplain_SliceWorker worker; /* qExec's overall stats for slice */ - - /* - * During serialization, we use this as a temporary StatInst and save - * "one-at-a-time" StatInst into this variable. We then write this - * variable into buffer (serialize it) and then "recycle" the same inst - * for next plan node's StatInst. During deserialization, an Array - * [0..nInst-1] of StatInst entries is appended starting here. - */ - CdbExplain_StatInst inst[1]; - - /* extra text is appended after that */ -} CdbExplain_StatHdr; - /* Dispatch status summarized over workers in a slice */ typedef struct CdbExplain_DispatchSummary diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index ff3f535bcea..d495e4d4c83 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -672,6 +672,13 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, opts.synchronous_commit = "off"; conninfo = stmt->conninfo; + /* + * conninfo can be an empty string, but the serialization + * doesn't distinguish an empty string from NULL. The + * code that executes the command in't prepared for a NULL. + */ + if (conninfo == NULL) + conninfo = pstrdup(""); publications = stmt->publication; /* Load the library providing us libpq calls. */ diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index ac2c65f6b02..6ede39dbcbb 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -226,7 +226,6 @@ ExecReScan(PlanState *node) break; case T_DynamicIndexScanState: - case T_DynamicIndexOnlyScanState: ExecReScanDynamicIndex((DynamicIndexScanState *) node); break; @@ -821,7 +820,6 @@ ExecSquelchNode(PlanState *node, bool force) case T_IndexScanState: case T_DynamicSeqScanState: case T_DynamicIndexScanState: - case T_DynamicIndexOnlyScanState: case T_IndexOnlyScanState: case T_DynamicBitmapIndexScanState: case T_BitmapIndexScanState: diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 3f98f99f267..cc5c7fc2b3e 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -893,7 +893,6 @@ ExecEndNode(PlanState *node) break; case T_DynamicIndexScanState: - case T_DynamicIndexOnlyScanState: ExecEndDynamicIndexScan((DynamicIndexScanState *) node); break; diff --git a/src/backend/nodes/.gitignore b/src/backend/nodes/.gitignore index b9f480cb3ee..cf464e13a83 100644 --- a/src/backend/nodes/.gitignore +++ b/src/backend/nodes/.gitignore @@ -1 +1,6 @@ /node-support-stamp +/nodetags.h +/*funcs.funcs.c +/*funcs.switch.c +/*fast.funcs.c +/*fast.switch.c diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile index 6111b2855cf..2bd1ee5a394 100644 --- a/src/backend/nodes/Makefile +++ b/src/backend/nodes/Makefile @@ -12,6 +12,8 @@ subdir = src/backend/nodes top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) + OBJS = \ bitmapset.o \ copyfuncs.o \ @@ -22,18 +24,95 @@ OBJS = \ multibitmapset.o \ nodeFuncs.o \ nodes.o \ - outfast.o \ outfuncs.o \ + outfast.o \ params.o \ print.o \ + queryjumblefuncs.o \ read.o \ - readfast.o \ readfuncs.o \ + readfast.o \ tidbitmap.o \ value.o -# readfast.c #includes readfuncs.c. Same with outfast.c and outfast.c -readfast.o: readfuncs.c readfast.c readfuncs_common.c -outfast.o: outfuncs.c outfast.c outfuncs_common.c - include $(top_srcdir)/src/backend/common.mk + +# The principal node-defining headers are listed in their inclusion order, +# to ensure cross-file subtyping works correctly. The rest can just be +# listed alphabetically. +# Caution: re-ordering this list risks ABI breakage! +node_headers = \ + nodes/nodes.h \ + nodes/primnodes.h \ + nodes/parsenodes.h \ + nodes/pathnodes.h \ + nodes/plannodes.h \ + nodes/execnodes.h \ + access/amapi.h \ + access/extprotocol.h \ + access/formatter.h \ + access/sdir.h \ + access/tableam.h \ + access/tsmapi.h \ + access/tupdesc.h \ + catalog/heap.h \ + cdb/cdbgang.h \ + commands/event_trigger.h \ + commands/explain_gp.h \ + commands/trigger.h \ + executor/execdesc.h \ + executor/tuptable.h \ + foreign/fdwapi.h \ + nodes/altertablenodes.h \ + nodes/bitmapset.h \ + nodes/extensible.h \ + nodes/lockoptions.h \ + nodes/miscnodes.h \ + nodes/replnodes.h \ + nodes/supportnodes.h \ + nodes/tidbitmap.h \ + nodes/value.h \ + utils/queryenvironment.h \ + utils/rel.h \ + catalog/gp_distribution_policy.h \ + cdb/cdbpathlocus.h + +# see also catalog/Makefile for an explanation of these make rules + +all: distprep generated-header-symlinks + +distprep: node-support-stamp + +.PHONY: generated-header-symlinks + +generated-header-symlinks: $(top_builddir)/src/include/nodes/header-stamp + +# node-support-stamp records the last time we ran gen_node_support.pl. +# We don't rely on the timestamps of the individual output files, +# because the Perl script won't update them if they didn't change (to +# avoid unnecessary recompiles). +node-support-stamp: gen_node_support.pl $(addprefix $(top_srcdir)/src/include/,$(node_headers)) + $(PERL) $^ + touch $@ + +# These generated headers must be symlinked into builddir/src/include/, +# using absolute links for the reasons explained in src/backend/Makefile. +# We use header-stamp to record that we've done this because the symlinks +# themselves may appear older than node-support-stamp. +$(top_builddir)/src/include/nodes/header-stamp: node-support-stamp + prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ + cd '$(dir $@)' && for file in nodetags.h; do \ + rm -f $$file && $(LN_S) "$$prereqdir/$$file" . ; \ + done + touch $@ + +copyfuncs.o: copyfuncs.c copyfuncs.funcs.c copyfuncs.switch.c | node-support-stamp +equalfuncs.o: equalfuncs.c equalfuncs.funcs.c equalfuncs.switch.c | node-support-stamp +outfuncs.o: outfuncs.c outfuncs.funcs.c outfuncs.switch.c | node-support-stamp +outfast.o: outfast.c outfast.funcs.c outfast.switch.c | node-support-stamp +queryjumblefuncs.o: queryjumblefuncs.c queryjumblefuncs.funcs.c queryjumblefuncs.switch.c | node-support-stamp +readfuncs.o: readfuncs.c readfuncs.funcs.c readfuncs.switch.c | node-support-stamp +readfast.o: readfast.c readfast.funcs.c readfast.switch.c | node-support-stamp + +maintainer-clean: clean + rm -f node-support-stamp $(addsuffix funcs.funcs.c,copy equal out queryjumble read) $(addsuffix funcs.switch.c,copy equal out queryjumble read) $(addsuffix fast.funcs.c, out read) $(addsuffix fast.switch.c, out read) nodetags.h diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index e2e61f521fb..9838bce045b 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -64,7 +64,7 @@ #define COPY_POINTER_FIELD(fldname, sz) \ do { \ Size _size = (sz); \ - if (_size > 0) \ + if (_size > 0 && from->fldname) \ { \ newnode->fldname = palloc(_size); \ memcpy(newnode->fldname, from->fldname, _size); \ @@ -197,6 +197,212 @@ _copyBitmapset(const Bitmapset *from) } +static ColumnDef * +_copyColumnDef(const ColumnDef *from) +{ + ColumnDef *newnode = makeNode(ColumnDef); + + COPY_STRING_FIELD(colname); + COPY_NODE_FIELD(typeName); + COPY_STRING_FIELD(compression); + COPY_SCALAR_FIELD(inhcount); + COPY_SCALAR_FIELD(is_local); + COPY_SCALAR_FIELD(is_not_null); + COPY_SCALAR_FIELD(is_from_type); + COPY_SCALAR_FIELD(attnum); + COPY_SCALAR_FIELD(storage); + COPY_STRING_FIELD(storage_name); + COPY_NODE_FIELD(raw_default); + COPY_NODE_FIELD(cooked_default); + COPY_SCALAR_FIELD(hasCookedMissingVal); + COPY_SCALAR_FIELD(missingIsNull); + if (from->hasCookedMissingVal && !from->missingIsNull) + newnode->missingVal = datumCopy(from->missingVal, false, -1); + COPY_SCALAR_FIELD(identity); + COPY_NODE_FIELD(identitySequence); + COPY_SCALAR_FIELD(generated); + COPY_NODE_FIELD(collClause); + COPY_SCALAR_FIELD(collOid); + COPY_NODE_FIELD(constraints); + COPY_NODE_FIELD(encoding); + COPY_NODE_FIELD(fdwoptions); + COPY_LOCATION_FIELD(location); + + return newnode; +} + +static SliceTable * +_copySliceTable(const SliceTable *from) +{ + SliceTable *newnode = makeNode(SliceTable); + + COPY_SCALAR_FIELD(localSlice); + COPY_SCALAR_FIELD(numSlices); + + newnode->slices = palloc0(from->numSlices * sizeof(ExecSlice)); + for (int i = 0; i < from->numSlices; i++) + { + COPY_SCALAR_FIELD(slices[i].sliceIndex); + COPY_SCALAR_FIELD(slices[i].rootIndex); + COPY_SCALAR_FIELD(slices[i].planNumSegments); + COPY_SCALAR_FIELD(slices[i].gangType); + COPY_NODE_FIELD(slices[i].segments); + COPY_SCALAR_FIELD(slices[i].useMppParallelMode); + COPY_SCALAR_FIELD(slices[i].parallel_workers); + + newnode->slices[i].primaryGang = from->slices[i].primaryGang; + COPY_SCALAR_FIELD(slices[i].parentIndex); + COPY_NODE_FIELD(slices[i].children); + COPY_NODE_FIELD(slices[i].primaryProcesses); + COPY_BITMAPSET_FIELD(slices[i].processesMap); + } + + COPY_SCALAR_FIELD(instrument_options); + COPY_SCALAR_FIELD(ic_instance_id); + + return newnode; +} + +static AlteredTableInfo * +_copyAlteredTableInfo(const AlteredTableInfo *from) +{ + int i; + + AlteredTableInfo *newnode = makeNode(AlteredTableInfo); + + COPY_SCALAR_FIELD(relid); + COPY_SCALAR_FIELD(relkind); + newnode->oldDesc = CreateTupleDescCopyConstr(from->oldDesc); + + for (i = 0; i < AT_NUM_PASSES; i++) + COPY_NODE_FIELD(subcmds[i]); + + COPY_NODE_FIELD(constraints); + COPY_NODE_FIELD(newvals); + COPY_NODE_FIELD(afterStmts); + COPY_SCALAR_FIELD(verify_new_notnull); + COPY_SCALAR_FIELD(rewrite); + COPY_SCALAR_FIELD(dist_opfamily_changed); + COPY_SCALAR_FIELD(new_opclass); + COPY_SCALAR_FIELD(newTableSpace); + COPY_SCALAR_FIELD(chgPersistence); + COPY_SCALAR_FIELD(newrelpersistence); + COPY_NODE_FIELD(partition_constraint); + COPY_SCALAR_FIELD(validate_default); + COPY_NODE_FIELD(changedConstraintOids); + COPY_NODE_FIELD(changedConstraintDefs); + COPY_NODE_FIELD(changedIndexOids); + COPY_NODE_FIELD(changedIndexDefs); + COPY_STRING_FIELD(replicaIdentityIndex); + COPY_STRING_FIELD(clusterOnIndex); + COPY_NODE_FIELD(beforeStmtLists); + COPY_NODE_FIELD(constraintLists); + + return newnode; +} + +static PlannedStmt * +_copyPlannedStmt(const PlannedStmt *from) +{ + PlannedStmt *newnode = makeNode(PlannedStmt); + + COPY_SCALAR_FIELD(commandType); + COPY_SCALAR_FIELD(planGen); + COPY_SCALAR_FIELD(queryId); + COPY_SCALAR_FIELD(hasReturning); + COPY_SCALAR_FIELD(hasModifyingCTE); + COPY_SCALAR_FIELD(canSetTag); + COPY_SCALAR_FIELD(transientPlan); + COPY_SCALAR_FIELD(oneoffPlan); + COPY_SCALAR_FIELD(simplyUpdatableRel); + COPY_SCALAR_FIELD(dependsOnRole); + COPY_SCALAR_FIELD(parallelModeNeeded); + COPY_SCALAR_FIELD(jitFlags); + COPY_NODE_FIELD(planTree); + COPY_SCALAR_FIELD(numSlices); + newnode->slices = palloc(from->numSlices * sizeof(PlanSlice)); + for (int i = 0; i < from->numSlices; i++) + { + COPY_SCALAR_FIELD(slices[i].sliceIndex); + COPY_SCALAR_FIELD(slices[i].parentIndex); + COPY_SCALAR_FIELD(slices[i].gangType); + COPY_SCALAR_FIELD(slices[i].numsegments); + COPY_SCALAR_FIELD(slices[i].parallel_workers); + COPY_SCALAR_FIELD(slices[i].segindex); + COPY_SCALAR_FIELD(slices[i].directDispatch.isDirectDispatch); + COPY_NODE_FIELD(slices[i].directDispatch.contentIds); + } + COPY_NODE_FIELD(rtable); + COPY_NODE_FIELD(permInfos); + COPY_NODE_FIELD(resultRelations); + COPY_NODE_FIELD(appendRelations); + COPY_NODE_FIELD(subplans); + COPY_POINTER_FIELD(subplan_sliceIds, list_length(from->subplans) * sizeof(int)); + COPY_BITMAPSET_FIELD(rewindPlanIDs); + COPY_NODE_FIELD(rowMarks); + COPY_NODE_FIELD(relationOids); + COPY_NODE_FIELD(invalItems); + COPY_NODE_FIELD(paramExecTypes); + COPY_NODE_FIELD(utilityStmt); + COPY_LOCATION_FIELD(stmt_location); + COPY_SCALAR_FIELD(stmt_len); + COPY_NODE_FIELD(intoPolicy); + COPY_SCALAR_FIELD(query_mem); + COPY_NODE_FIELD(intoClause); + COPY_NODE_FIELD(copyIntoClause); + COPY_NODE_FIELD(refreshClause); + COPY_SCALAR_FIELD(metricsQueryType); + COPY_NODE_FIELD(extensionContext); + + return newnode; +} + +static Motion * +_copyMotion(const Motion *from) +{ + Motion *newnode = makeNode(Motion); + + COPY_SCALAR_FIELD(plan.startup_cost); + COPY_SCALAR_FIELD(plan.total_cost); + COPY_SCALAR_FIELD(plan.plan_rows); + COPY_SCALAR_FIELD(plan.plan_width); + COPY_SCALAR_FIELD(plan.parallel_aware); + COPY_SCALAR_FIELD(plan.parallel_safe); + COPY_SCALAR_FIELD(plan.async_capable); + COPY_SCALAR_FIELD(plan.plan_node_id); + COPY_NODE_FIELD(plan.targetlist); + COPY_NODE_FIELD(plan.qual); + COPY_NODE_FIELD(plan.lefttree); + COPY_NODE_FIELD(plan.righttree); + COPY_NODE_FIELD(plan.initPlan); + COPY_BITMAPSET_FIELD(plan.extParam); + COPY_BITMAPSET_FIELD(plan.allParam); + COPY_NODE_FIELD(plan.flow); + COPY_SCALAR_FIELD(plan.locustype); + COPY_SCALAR_FIELD(plan.parallel); + COPY_SCALAR_FIELD(plan.operatorMemKB); + COPY_SCALAR_FIELD(motionType); + COPY_SCALAR_FIELD(sendSorted); + COPY_SCALAR_FIELD(motionID); + COPY_NODE_FIELD(hashExprs); + COPY_POINTER_FIELD(hashFuncs, list_length(from->hashExprs) * sizeof(Oid)); + COPY_SCALAR_FIELD(numHashSegments); + COPY_SCALAR_FIELD(segidColIdx); + COPY_SCALAR_FIELD(numSortCols); + COPY_POINTER_FIELD(sortColIdx, from->numSortCols * sizeof(AttrNumber)); + COPY_POINTER_FIELD(sortOperators, from->numSortCols * sizeof(Oid)); + COPY_POINTER_FIELD(collations, from->numSortCols * sizeof(Oid)); + COPY_POINTER_FIELD(nullsFirst, from->numSortCols * sizeof(bool)); + + if (from->senderSliceInfo) + { + newnode->senderSliceInfo = palloc(sizeof(PlanSlice)); + memcpy(newnode->senderSliceInfo, from->senderSliceInfo, sizeof(PlanSlice)); + } + + return newnode; +} + /* * copyObjectImpl -- implementation of copyObject(); see nodes/nodes.h * diff --git a/src/backend/nodes/copyfuncs.funcs.c b/src/backend/nodes/copyfuncs.funcs.c deleted file mode 100644 index 6f312d17574..00000000000 --- a/src/backend/nodes/copyfuncs.funcs.c +++ /dev/null @@ -1,6910 +0,0 @@ -/*------------------------------------------------------------------------- - * - * copyfuncs.funcs.c - * Generated node infrastructure code - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * NOTES - * ****************************** - * *** DO NOT EDIT THIS FILE! *** - * ****************************** - * - * It has been GENERATED by src/backend/nodes/gen_node_support.pl - * - *------------------------------------------------------------------------- - */ -#include "access/amapi.h" -#include "access/sdir.h" -#include "access/tableam.h" -#include "access/tsmapi.h" -#include "catalog/gp_distribution_policy.h" -#include "commands/event_trigger.h" -#include "commands/trigger.h" -#include "executor/tuptable.h" -#include "foreign/fdwapi.h" -#include "nodes/bitmapset.h" -#include "nodes/execnodes.h" -#include "nodes/extensible.h" -#include "nodes/lockoptions.h" -#include "nodes/miscnodes.h" -#include "nodes/nodes.h" -#include "nodes/parsenodes.h" -#include "nodes/pathnodes.h" -#include "nodes/plannodes.h" -#include "nodes/primnodes.h" -#include "nodes/replnodes.h" -#include "nodes/supportnodes.h" -#include "nodes/value.h" -#include "utils/rel.h" - -static GpPolicy * -_copyGpPolicy(const GpPolicy *from) -{ - GpPolicy *newnode = makeNode(GpPolicy); - - COPY_SCALAR_FIELD(ptype); - COPY_SCALAR_FIELD(numsegments); - COPY_SCALAR_FIELD(nattrs); - COPY_POINTER_FIELD(attrs, from->nattrs * sizeof(AttrNumber)); - COPY_POINTER_FIELD(opclasses, from->nattrs * sizeof(Oid)); - - return newnode; -} - -static Alias * -_copyAlias(const Alias *from) -{ - Alias *newnode = makeNode(Alias); - - COPY_STRING_FIELD(aliasname); - COPY_NODE_FIELD(colnames); - - return newnode; -} - -static RangeVar * -_copyRangeVar(const RangeVar *from) -{ - RangeVar *newnode = makeNode(RangeVar); - - COPY_STRING_FIELD(catalogname); - COPY_STRING_FIELD(schemaname); - COPY_STRING_FIELD(relname); - COPY_SCALAR_FIELD(inh); - COPY_SCALAR_FIELD(relpersistence); - COPY_NODE_FIELD(alias); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static TableFunc * -_copyTableFunc(const TableFunc *from) -{ - TableFunc *newnode = makeNode(TableFunc); - - COPY_NODE_FIELD(ns_uris); - COPY_NODE_FIELD(ns_names); - COPY_NODE_FIELD(docexpr); - COPY_NODE_FIELD(rowexpr); - COPY_NODE_FIELD(colnames); - COPY_NODE_FIELD(coltypes); - COPY_NODE_FIELD(coltypmods); - COPY_NODE_FIELD(colcollations); - COPY_NODE_FIELD(colexprs); - COPY_NODE_FIELD(coldefexprs); - COPY_BITMAPSET_FIELD(notnulls); - COPY_SCALAR_FIELD(ordinalitycol); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static IntoClause * -_copyIntoClause(const IntoClause *from) -{ - IntoClause *newnode = makeNode(IntoClause); - - COPY_NODE_FIELD(rel); - COPY_NODE_FIELD(colNames); - COPY_STRING_FIELD(accessMethod); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(onCommit); - COPY_STRING_FIELD(tableSpaceName); - COPY_NODE_FIELD(viewQuery); - COPY_SCALAR_FIELD(skipData); - COPY_NODE_FIELD(distributedBy); - COPY_SCALAR_FIELD(ivm); - COPY_SCALAR_FIELD(matviewOid); - COPY_STRING_FIELD(enrname); - COPY_SCALAR_FIELD(dynamicTbl); - COPY_STRING_FIELD(schedule); - - return newnode; -} - -static CopyIntoClause * -_copyCopyIntoClause(const CopyIntoClause *from) -{ - CopyIntoClause *newnode = makeNode(CopyIntoClause); - - COPY_NODE_FIELD(attlist); - COPY_SCALAR_FIELD(is_program); - COPY_STRING_FIELD(filename); - COPY_NODE_FIELD(options); - - return newnode; -} - -static RefreshClause * -_copyRefreshClause(const RefreshClause *from) -{ - RefreshClause *newnode = makeNode(RefreshClause); - - COPY_SCALAR_FIELD(concurrent); - COPY_SCALAR_FIELD(skipData); - COPY_NODE_FIELD(relation); - - return newnode; -} - -static Var * -_copyVar(const Var *from) -{ - Var *newnode = makeNode(Var); - - COPY_SCALAR_FIELD(varno); - COPY_SCALAR_FIELD(varattno); - COPY_SCALAR_FIELD(vartype); - COPY_SCALAR_FIELD(vartypmod); - COPY_SCALAR_FIELD(varcollid); - COPY_BITMAPSET_FIELD(varnullingrels); - COPY_SCALAR_FIELD(varlevelsup); - COPY_SCALAR_FIELD(varnosyn); - COPY_SCALAR_FIELD(varattnosyn); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static Param * -_copyParam(const Param *from) -{ - Param *newnode = makeNode(Param); - - COPY_SCALAR_FIELD(paramkind); - COPY_SCALAR_FIELD(paramid); - COPY_SCALAR_FIELD(paramtype); - COPY_SCALAR_FIELD(paramtypmod); - COPY_SCALAR_FIELD(paramcollid); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static Aggref * -_copyAggref(const Aggref *from) -{ - Aggref *newnode = makeNode(Aggref); - - COPY_SCALAR_FIELD(aggfnoid); - COPY_SCALAR_FIELD(aggtype); - COPY_SCALAR_FIELD(aggcollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_SCALAR_FIELD(aggtranstype); - COPY_NODE_FIELD(aggargtypes); - COPY_NODE_FIELD(aggdirectargs); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(aggorder); - COPY_NODE_FIELD(aggdistinct); - COPY_NODE_FIELD(aggfilter); - COPY_SCALAR_FIELD(aggstar); - COPY_SCALAR_FIELD(aggvariadic); - COPY_SCALAR_FIELD(aggkind); - COPY_SCALAR_FIELD(aggpresorted); - COPY_SCALAR_FIELD(agglevelsup); - COPY_SCALAR_FIELD(aggsplit); - COPY_SCALAR_FIELD(aggno); - COPY_SCALAR_FIELD(aggtransno); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(agg_expr_id); - - return newnode; -} - -static GroupId * -_copyGroupId(const GroupId *from) -{ - GroupId *newnode = makeNode(GroupId); - - COPY_SCALAR_FIELD(agglevelsup); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GroupingSetId * -_copyGroupingSetId(const GroupingSetId *from) -{ - GroupingSetId *newnode = makeNode(GroupingSetId); - - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static AggExprId * -_copyAggExprId(const AggExprId *from) -{ - AggExprId *newnode = makeNode(AggExprId); - - - return newnode; -} - -static RowIdExpr * -_copyRowIdExpr(const RowIdExpr *from) -{ - RowIdExpr *newnode = makeNode(RowIdExpr); - - COPY_SCALAR_FIELD(rowidexpr_id); - - return newnode; -} - -static GroupingFunc * -_copyGroupingFunc(const GroupingFunc *from) -{ - GroupingFunc *newnode = makeNode(GroupingFunc); - - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(refs); - COPY_NODE_FIELD(cols); - COPY_SCALAR_FIELD(agglevelsup); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static WindowFunc * -_copyWindowFunc(const WindowFunc *from) -{ - WindowFunc *newnode = makeNode(WindowFunc); - - COPY_SCALAR_FIELD(winfnoid); - COPY_SCALAR_FIELD(wintype); - COPY_SCALAR_FIELD(wincollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(aggfilter); - COPY_SCALAR_FIELD(winref); - COPY_SCALAR_FIELD(winstar); - COPY_SCALAR_FIELD(winagg); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(windistinct); - - return newnode; -} - -static SubscriptingRef * -_copySubscriptingRef(const SubscriptingRef *from) -{ - SubscriptingRef *newnode = makeNode(SubscriptingRef); - - COPY_SCALAR_FIELD(refcontainertype); - COPY_SCALAR_FIELD(refelemtype); - COPY_SCALAR_FIELD(refrestype); - COPY_SCALAR_FIELD(reftypmod); - COPY_SCALAR_FIELD(refcollid); - COPY_NODE_FIELD(refupperindexpr); - COPY_NODE_FIELD(reflowerindexpr); - COPY_NODE_FIELD(refexpr); - COPY_NODE_FIELD(refassgnexpr); - - return newnode; -} - -static FuncExpr * -_copyFuncExpr(const FuncExpr *from) -{ - FuncExpr *newnode = makeNode(FuncExpr); - - COPY_SCALAR_FIELD(funcid); - COPY_SCALAR_FIELD(funcresulttype); - COPY_SCALAR_FIELD(funcretset); - COPY_SCALAR_FIELD(funcvariadic); - COPY_SCALAR_FIELD(funcformat); - COPY_SCALAR_FIELD(funccollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(is_tablefunc); - - return newnode; -} - -static NamedArgExpr * -_copyNamedArgExpr(const NamedArgExpr *from) -{ - NamedArgExpr *newnode = makeNode(NamedArgExpr); - - COPY_NODE_FIELD(arg); - COPY_STRING_FIELD(name); - COPY_SCALAR_FIELD(argnumber); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static OpExpr * -_copyOpExpr(const OpExpr *from) -{ - OpExpr *newnode = makeNode(OpExpr); - - COPY_SCALAR_FIELD(opno); - COPY_SCALAR_FIELD(opfuncid); - COPY_SCALAR_FIELD(opresulttype); - COPY_SCALAR_FIELD(opretset); - COPY_SCALAR_FIELD(opcollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static DistinctExpr * -_copyDistinctExpr(const DistinctExpr *from) -{ - DistinctExpr *newnode = makeNode(DistinctExpr); - - COPY_SCALAR_FIELD(opno); - COPY_SCALAR_FIELD(opfuncid); - COPY_SCALAR_FIELD(opresulttype); - COPY_SCALAR_FIELD(opretset); - COPY_SCALAR_FIELD(opcollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static NullIfExpr * -_copyNullIfExpr(const NullIfExpr *from) -{ - NullIfExpr *newnode = makeNode(NullIfExpr); - - COPY_SCALAR_FIELD(opno); - COPY_SCALAR_FIELD(opfuncid); - COPY_SCALAR_FIELD(opresulttype); - COPY_SCALAR_FIELD(opretset); - COPY_SCALAR_FIELD(opcollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ScalarArrayOpExpr * -_copyScalarArrayOpExpr(const ScalarArrayOpExpr *from) -{ - ScalarArrayOpExpr *newnode = makeNode(ScalarArrayOpExpr); - - COPY_SCALAR_FIELD(opno); - COPY_SCALAR_FIELD(opfuncid); - COPY_SCALAR_FIELD(hashfuncid); - COPY_SCALAR_FIELD(negfuncid); - COPY_SCALAR_FIELD(useOr); - COPY_SCALAR_FIELD(inputcollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static BoolExpr * -_copyBoolExpr(const BoolExpr *from) -{ - BoolExpr *newnode = makeNode(BoolExpr); - - COPY_SCALAR_FIELD(boolop); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static TableValueExpr * -_copyTableValueExpr(const TableValueExpr *from) -{ - TableValueExpr *newnode = makeNode(TableValueExpr); - - COPY_NODE_FIELD(subquery); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static SubLink * -_copySubLink(const SubLink *from) -{ - SubLink *newnode = makeNode(SubLink); - - COPY_SCALAR_FIELD(subLinkType); - COPY_SCALAR_FIELD(subLinkId); - COPY_NODE_FIELD(testexpr); - COPY_NODE_FIELD(operName); - COPY_NODE_FIELD(subselect); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static SubPlan * -_copySubPlan(const SubPlan *from) -{ - SubPlan *newnode = makeNode(SubPlan); - - COPY_SCALAR_FIELD(subLinkType); - COPY_NODE_FIELD(testexpr); - COPY_NODE_FIELD(paramIds); - COPY_SCALAR_FIELD(plan_id); - COPY_STRING_FIELD(plan_name); - COPY_SCALAR_FIELD(firstColType); - COPY_SCALAR_FIELD(firstColTypmod); - COPY_SCALAR_FIELD(firstColCollation); - COPY_SCALAR_FIELD(useHashTable); - COPY_SCALAR_FIELD(unknownEqFalse); - COPY_SCALAR_FIELD(parallel_safe); - COPY_SCALAR_FIELD(is_initplan); - COPY_SCALAR_FIELD(is_multirow); - COPY_NODE_FIELD(setParam); - COPY_NODE_FIELD(parParam); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(extParam); - COPY_SCALAR_FIELD(startup_cost); - COPY_SCALAR_FIELD(per_call_cost); - - return newnode; -} - -static AlternativeSubPlan * -_copyAlternativeSubPlan(const AlternativeSubPlan *from) -{ - AlternativeSubPlan *newnode = makeNode(AlternativeSubPlan); - - COPY_NODE_FIELD(subplans); - - return newnode; -} - -static FieldSelect * -_copyFieldSelect(const FieldSelect *from) -{ - FieldSelect *newnode = makeNode(FieldSelect); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(fieldnum); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(resulttypmod); - COPY_SCALAR_FIELD(resultcollid); - - return newnode; -} - -static FieldStore * -_copyFieldStore(const FieldStore *from) -{ - FieldStore *newnode = makeNode(FieldStore); - - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(newvals); - COPY_NODE_FIELD(fieldnums); - COPY_SCALAR_FIELD(resulttype); - - return newnode; -} - -static RelabelType * -_copyRelabelType(const RelabelType *from) -{ - RelabelType *newnode = makeNode(RelabelType); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(resulttypmod); - COPY_SCALAR_FIELD(resultcollid); - COPY_SCALAR_FIELD(relabelformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CoerceViaIO * -_copyCoerceViaIO(const CoerceViaIO *from) -{ - CoerceViaIO *newnode = makeNode(CoerceViaIO); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(resultcollid); - COPY_SCALAR_FIELD(coerceformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ArrayCoerceExpr * -_copyArrayCoerceExpr(const ArrayCoerceExpr *from) -{ - ArrayCoerceExpr *newnode = makeNode(ArrayCoerceExpr); - - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(elemexpr); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(resulttypmod); - COPY_SCALAR_FIELD(resultcollid); - COPY_SCALAR_FIELD(coerceformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ConvertRowtypeExpr * -_copyConvertRowtypeExpr(const ConvertRowtypeExpr *from) -{ - ConvertRowtypeExpr *newnode = makeNode(ConvertRowtypeExpr); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(convertformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CollateExpr * -_copyCollateExpr(const CollateExpr *from) -{ - CollateExpr *newnode = makeNode(CollateExpr); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(collOid); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CaseExpr * -_copyCaseExpr(const CaseExpr *from) -{ - CaseExpr *newnode = makeNode(CaseExpr); - - COPY_SCALAR_FIELD(casetype); - COPY_SCALAR_FIELD(casecollid); - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(defresult); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CaseWhen * -_copyCaseWhen(const CaseWhen *from) -{ - CaseWhen *newnode = makeNode(CaseWhen); - - COPY_NODE_FIELD(expr); - COPY_NODE_FIELD(result); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CaseTestExpr * -_copyCaseTestExpr(const CaseTestExpr *from) -{ - CaseTestExpr *newnode = makeNode(CaseTestExpr); - - COPY_SCALAR_FIELD(typeId); - COPY_SCALAR_FIELD(typeMod); - COPY_SCALAR_FIELD(collation); - - return newnode; -} - -static ArrayExpr * -_copyArrayExpr(const ArrayExpr *from) -{ - ArrayExpr *newnode = makeNode(ArrayExpr); - - COPY_SCALAR_FIELD(array_typeid); - COPY_SCALAR_FIELD(array_collid); - COPY_SCALAR_FIELD(element_typeid); - COPY_NODE_FIELD(elements); - COPY_SCALAR_FIELD(multidims); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RowExpr * -_copyRowExpr(const RowExpr *from) -{ - RowExpr *newnode = makeNode(RowExpr); - - COPY_NODE_FIELD(args); - COPY_SCALAR_FIELD(row_typeid); - COPY_SCALAR_FIELD(row_format); - COPY_NODE_FIELD(colnames); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RowCompareExpr * -_copyRowCompareExpr(const RowCompareExpr *from) -{ - RowCompareExpr *newnode = makeNode(RowCompareExpr); - - COPY_SCALAR_FIELD(rctype); - COPY_NODE_FIELD(opnos); - COPY_NODE_FIELD(opfamilies); - COPY_NODE_FIELD(inputcollids); - COPY_NODE_FIELD(largs); - COPY_NODE_FIELD(rargs); - - return newnode; -} - -static CoalesceExpr * -_copyCoalesceExpr(const CoalesceExpr *from) -{ - CoalesceExpr *newnode = makeNode(CoalesceExpr); - - COPY_SCALAR_FIELD(coalescetype); - COPY_SCALAR_FIELD(coalescecollid); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static MinMaxExpr * -_copyMinMaxExpr(const MinMaxExpr *from) -{ - MinMaxExpr *newnode = makeNode(MinMaxExpr); - - COPY_SCALAR_FIELD(minmaxtype); - COPY_SCALAR_FIELD(minmaxcollid); - COPY_SCALAR_FIELD(inputcollid); - COPY_SCALAR_FIELD(op); - COPY_NODE_FIELD(args); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static SQLValueFunction * -_copySQLValueFunction(const SQLValueFunction *from) -{ - SQLValueFunction *newnode = makeNode(SQLValueFunction); - - COPY_SCALAR_FIELD(op); - COPY_SCALAR_FIELD(type); - COPY_SCALAR_FIELD(typmod); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static XmlExpr * -_copyXmlExpr(const XmlExpr *from) -{ - XmlExpr *newnode = makeNode(XmlExpr); - - COPY_SCALAR_FIELD(op); - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(named_args); - COPY_NODE_FIELD(arg_names); - COPY_NODE_FIELD(args); - COPY_SCALAR_FIELD(xmloption); - COPY_SCALAR_FIELD(indent); - COPY_SCALAR_FIELD(type); - COPY_SCALAR_FIELD(typmod); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonFormat * -_copyJsonFormat(const JsonFormat *from) -{ - JsonFormat *newnode = makeNode(JsonFormat); - - COPY_SCALAR_FIELD(format_type); - COPY_SCALAR_FIELD(encoding); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonReturning * -_copyJsonReturning(const JsonReturning *from) -{ - JsonReturning *newnode = makeNode(JsonReturning); - - COPY_NODE_FIELD(format); - COPY_SCALAR_FIELD(typid); - COPY_SCALAR_FIELD(typmod); - - return newnode; -} - -static JsonValueExpr * -_copyJsonValueExpr(const JsonValueExpr *from) -{ - JsonValueExpr *newnode = makeNode(JsonValueExpr); - - COPY_NODE_FIELD(raw_expr); - COPY_NODE_FIELD(formatted_expr); - COPY_NODE_FIELD(format); - - return newnode; -} - -static JsonConstructorExpr * -_copyJsonConstructorExpr(const JsonConstructorExpr *from) -{ - JsonConstructorExpr *newnode = makeNode(JsonConstructorExpr); - - COPY_SCALAR_FIELD(type); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(func); - COPY_NODE_FIELD(coercion); - COPY_NODE_FIELD(returning); - COPY_SCALAR_FIELD(absent_on_null); - COPY_SCALAR_FIELD(unique); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonIsPredicate * -_copyJsonIsPredicate(const JsonIsPredicate *from) -{ - JsonIsPredicate *newnode = makeNode(JsonIsPredicate); - - COPY_NODE_FIELD(expr); - COPY_NODE_FIELD(format); - COPY_SCALAR_FIELD(item_type); - COPY_SCALAR_FIELD(unique_keys); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static NullTest * -_copyNullTest(const NullTest *from) -{ - NullTest *newnode = makeNode(NullTest); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(nulltesttype); - COPY_SCALAR_FIELD(argisrow); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static BooleanTest * -_copyBooleanTest(const BooleanTest *from) -{ - BooleanTest *newnode = makeNode(BooleanTest); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(booltesttype); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CoerceToDomain * -_copyCoerceToDomain(const CoerceToDomain *from) -{ - CoerceToDomain *newnode = makeNode(CoerceToDomain); - - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(resulttype); - COPY_SCALAR_FIELD(resulttypmod); - COPY_SCALAR_FIELD(resultcollid); - COPY_SCALAR_FIELD(coercionformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CoerceToDomainValue * -_copyCoerceToDomainValue(const CoerceToDomainValue *from) -{ - CoerceToDomainValue *newnode = makeNode(CoerceToDomainValue); - - COPY_SCALAR_FIELD(typeId); - COPY_SCALAR_FIELD(typeMod); - COPY_SCALAR_FIELD(collation); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static SetToDefault * -_copySetToDefault(const SetToDefault *from) -{ - SetToDefault *newnode = makeNode(SetToDefault); - - COPY_SCALAR_FIELD(typeId); - COPY_SCALAR_FIELD(typeMod); - COPY_SCALAR_FIELD(collation); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CurrentOfExpr * -_copyCurrentOfExpr(const CurrentOfExpr *from) -{ - CurrentOfExpr *newnode = makeNode(CurrentOfExpr); - - COPY_STRING_FIELD(cursor_name); - COPY_SCALAR_FIELD(cursor_param); - COPY_SCALAR_FIELD(cvarno); - COPY_SCALAR_FIELD(target_relid); - - return newnode; -} - -static NextValueExpr * -_copyNextValueExpr(const NextValueExpr *from) -{ - NextValueExpr *newnode = makeNode(NextValueExpr); - - COPY_SCALAR_FIELD(seqid); - COPY_SCALAR_FIELD(typeId); - - return newnode; -} - -static InferenceElem * -_copyInferenceElem(const InferenceElem *from) -{ - InferenceElem *newnode = makeNode(InferenceElem); - - COPY_NODE_FIELD(expr); - COPY_SCALAR_FIELD(infercollid); - COPY_SCALAR_FIELD(inferopclass); - - return newnode; -} - -static TargetEntry * -_copyTargetEntry(const TargetEntry *from) -{ - TargetEntry *newnode = makeNode(TargetEntry); - - COPY_NODE_FIELD(expr); - COPY_SCALAR_FIELD(resno); - COPY_STRING_FIELD(resname); - COPY_SCALAR_FIELD(ressortgroupref); - COPY_SCALAR_FIELD(resorigtbl); - COPY_SCALAR_FIELD(resorigcol); - COPY_SCALAR_FIELD(resjunk); - - return newnode; -} - -static RangeTblRef * -_copyRangeTblRef(const RangeTblRef *from) -{ - RangeTblRef *newnode = makeNode(RangeTblRef); - - COPY_SCALAR_FIELD(rtindex); - - return newnode; -} - -static JoinExpr * -_copyJoinExpr(const JoinExpr *from) -{ - JoinExpr *newnode = makeNode(JoinExpr); - - COPY_SCALAR_FIELD(jointype); - COPY_SCALAR_FIELD(isNatural); - COPY_NODE_FIELD(larg); - COPY_NODE_FIELD(rarg); - COPY_NODE_FIELD(usingClause); - COPY_NODE_FIELD(join_using_alias); - COPY_NODE_FIELD(quals); - COPY_NODE_FIELD(alias); - COPY_SCALAR_FIELD(rtindex); - - return newnode; -} - -static FromExpr * -_copyFromExpr(const FromExpr *from) -{ - FromExpr *newnode = makeNode(FromExpr); - - COPY_NODE_FIELD(fromlist); - COPY_NODE_FIELD(quals); - - return newnode; -} - -static OnConflictExpr * -_copyOnConflictExpr(const OnConflictExpr *from) -{ - OnConflictExpr *newnode = makeNode(OnConflictExpr); - - COPY_SCALAR_FIELD(action); - COPY_NODE_FIELD(arbiterElems); - COPY_NODE_FIELD(arbiterWhere); - COPY_SCALAR_FIELD(constraint); - COPY_NODE_FIELD(onConflictSet); - COPY_NODE_FIELD(onConflictWhere); - COPY_SCALAR_FIELD(exclRelIndex); - COPY_NODE_FIELD(exclRelTlist); - - return newnode; -} - -static DMLActionExpr * -_copyDMLActionExpr(const DMLActionExpr *from) -{ - DMLActionExpr *newnode = makeNode(DMLActionExpr); - - - return newnode; -} - -static Query * -_copyQuery(const Query *from) -{ - Query *newnode = makeNode(Query); - - COPY_SCALAR_FIELD(commandType); - COPY_SCALAR_FIELD(querySource); - COPY_SCALAR_FIELD(queryId); - COPY_SCALAR_FIELD(canSetTag); - COPY_NODE_FIELD(utilityStmt); - COPY_SCALAR_FIELD(resultRelation); - COPY_SCALAR_FIELD(hasAggs); - COPY_SCALAR_FIELD(hasWindowFuncs); - COPY_SCALAR_FIELD(hasTargetSRFs); - COPY_SCALAR_FIELD(hasSubLinks); - COPY_SCALAR_FIELD(hasDistinctOn); - COPY_SCALAR_FIELD(hasRecursive); - COPY_SCALAR_FIELD(hasModifyingCTE); - COPY_SCALAR_FIELD(hasForUpdate); - COPY_SCALAR_FIELD(hasRowSecurity); - COPY_SCALAR_FIELD(isReturn); - COPY_SCALAR_FIELD(hasDynamicFunctions); - COPY_SCALAR_FIELD(hasFuncsWithExecRestrictions); - COPY_SCALAR_FIELD(canOptSelectLockingClause); - COPY_NODE_FIELD(cteList); - COPY_NODE_FIELD(rtable); - COPY_NODE_FIELD(rteperminfos); - COPY_NODE_FIELD(jointree); - COPY_NODE_FIELD(mergeActionList); - COPY_SCALAR_FIELD(mergeUseOuterJoin); - COPY_NODE_FIELD(targetList); - COPY_SCALAR_FIELD(override); - COPY_NODE_FIELD(onConflict); - COPY_NODE_FIELD(returningList); - COPY_NODE_FIELD(groupClause); - COPY_SCALAR_FIELD(groupDistinct); - COPY_NODE_FIELD(groupingSets); - COPY_NODE_FIELD(havingQual); - COPY_NODE_FIELD(windowClause); - COPY_NODE_FIELD(distinctClause); - COPY_NODE_FIELD(sortClause); - COPY_NODE_FIELD(scatterClause); - COPY_SCALAR_FIELD(isTableValueSelect); - COPY_NODE_FIELD(limitOffset); - COPY_NODE_FIELD(limitCount); - COPY_SCALAR_FIELD(limitOption); - COPY_NODE_FIELD(rowMarks); - COPY_NODE_FIELD(setOperations); - COPY_NODE_FIELD(constraintDeps); - COPY_NODE_FIELD(withCheckOptions); - COPY_NODE_FIELD(intoPolicy); - COPY_SCALAR_FIELD(parentStmtType); - COPY_LOCATION_FIELD(stmt_location); - COPY_SCALAR_FIELD(stmt_len); - COPY_SCALAR_FIELD(expandMatViews); - - return newnode; -} - -static TypeName * -_copyTypeName(const TypeName *from) -{ - TypeName *newnode = makeNode(TypeName); - - COPY_NODE_FIELD(names); - COPY_SCALAR_FIELD(typeOid); - COPY_SCALAR_FIELD(setof); - COPY_SCALAR_FIELD(pct_type); - COPY_NODE_FIELD(typmods); - COPY_SCALAR_FIELD(typemod); - COPY_NODE_FIELD(arrayBounds); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ColumnRef * -_copyColumnRef(const ColumnRef *from) -{ - ColumnRef *newnode = makeNode(ColumnRef); - - COPY_NODE_FIELD(fields); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ParamRef * -_copyParamRef(const ParamRef *from) -{ - ParamRef *newnode = makeNode(ParamRef); - - COPY_SCALAR_FIELD(number); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static A_Expr * -_copyA_Expr(const A_Expr *from) -{ - A_Expr *newnode = makeNode(A_Expr); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(name); - COPY_NODE_FIELD(lexpr); - COPY_NODE_FIELD(rexpr); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static TypeCast * -_copyTypeCast(const TypeCast *from) -{ - TypeCast *newnode = makeNode(TypeCast); - - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(typeName); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CollateClause * -_copyCollateClause(const CollateClause *from) -{ - CollateClause *newnode = makeNode(CollateClause); - - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(collname); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RoleSpec * -_copyRoleSpec(const RoleSpec *from) -{ - RoleSpec *newnode = makeNode(RoleSpec); - - COPY_SCALAR_FIELD(roletype); - COPY_STRING_FIELD(rolename); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static FuncCall * -_copyFuncCall(const FuncCall *from) -{ - FuncCall *newnode = makeNode(FuncCall); - - COPY_NODE_FIELD(funcname); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(agg_order); - COPY_NODE_FIELD(agg_filter); - COPY_NODE_FIELD(over); - COPY_SCALAR_FIELD(agg_within_group); - COPY_SCALAR_FIELD(agg_star); - COPY_SCALAR_FIELD(agg_distinct); - COPY_SCALAR_FIELD(func_variadic); - COPY_SCALAR_FIELD(funcformat); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static A_Star * -_copyA_Star(const A_Star *from) -{ - A_Star *newnode = makeNode(A_Star); - - - return newnode; -} - -static A_Indices * -_copyA_Indices(const A_Indices *from) -{ - A_Indices *newnode = makeNode(A_Indices); - - COPY_SCALAR_FIELD(is_slice); - COPY_NODE_FIELD(lidx); - COPY_NODE_FIELD(uidx); - - return newnode; -} - -static A_Indirection * -_copyA_Indirection(const A_Indirection *from) -{ - A_Indirection *newnode = makeNode(A_Indirection); - - COPY_NODE_FIELD(arg); - COPY_NODE_FIELD(indirection); - - return newnode; -} - -static A_ArrayExpr * -_copyA_ArrayExpr(const A_ArrayExpr *from) -{ - A_ArrayExpr *newnode = makeNode(A_ArrayExpr); - - COPY_NODE_FIELD(elements); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ResTarget * -_copyResTarget(const ResTarget *from) -{ - ResTarget *newnode = makeNode(ResTarget); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(indirection); - COPY_NODE_FIELD(val); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static MultiAssignRef * -_copyMultiAssignRef(const MultiAssignRef *from) -{ - MultiAssignRef *newnode = makeNode(MultiAssignRef); - - COPY_NODE_FIELD(source); - COPY_SCALAR_FIELD(colno); - COPY_SCALAR_FIELD(ncolumns); - - return newnode; -} - -static SortBy * -_copySortBy(const SortBy *from) -{ - SortBy *newnode = makeNode(SortBy); - - COPY_NODE_FIELD(node); - COPY_SCALAR_FIELD(sortby_dir); - COPY_SCALAR_FIELD(sortby_nulls); - COPY_NODE_FIELD(useOp); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static WindowDef * -_copyWindowDef(const WindowDef *from) -{ - WindowDef *newnode = makeNode(WindowDef); - - COPY_STRING_FIELD(name); - COPY_STRING_FIELD(refname); - COPY_NODE_FIELD(partitionClause); - COPY_NODE_FIELD(orderClause); - COPY_SCALAR_FIELD(frameOptions); - COPY_NODE_FIELD(startOffset); - COPY_NODE_FIELD(endOffset); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RangeSubselect * -_copyRangeSubselect(const RangeSubselect *from) -{ - RangeSubselect *newnode = makeNode(RangeSubselect); - - COPY_SCALAR_FIELD(lateral); - COPY_NODE_FIELD(subquery); - COPY_NODE_FIELD(alias); - - return newnode; -} - -static RangeFunction * -_copyRangeFunction(const RangeFunction *from) -{ - RangeFunction *newnode = makeNode(RangeFunction); - - COPY_SCALAR_FIELD(lateral); - COPY_SCALAR_FIELD(ordinality); - COPY_SCALAR_FIELD(is_rowsfrom); - COPY_NODE_FIELD(functions); - COPY_NODE_FIELD(alias); - COPY_NODE_FIELD(coldeflist); - - return newnode; -} - -static RangeTableFunc * -_copyRangeTableFunc(const RangeTableFunc *from) -{ - RangeTableFunc *newnode = makeNode(RangeTableFunc); - - COPY_SCALAR_FIELD(lateral); - COPY_NODE_FIELD(docexpr); - COPY_NODE_FIELD(rowexpr); - COPY_NODE_FIELD(namespaces); - COPY_NODE_FIELD(columns); - COPY_NODE_FIELD(alias); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RangeTableFuncCol * -_copyRangeTableFuncCol(const RangeTableFuncCol *from) -{ - RangeTableFuncCol *newnode = makeNode(RangeTableFuncCol); - - COPY_STRING_FIELD(colname); - COPY_NODE_FIELD(typeName); - COPY_SCALAR_FIELD(for_ordinality); - COPY_SCALAR_FIELD(is_not_null); - COPY_NODE_FIELD(colexpr); - COPY_NODE_FIELD(coldefexpr); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static RangeTableSample * -_copyRangeTableSample(const RangeTableSample *from) -{ - RangeTableSample *newnode = makeNode(RangeTableSample); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(method); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(repeatable); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static ColumnDef * -_copyColumnDef(const ColumnDef *from) -{ - ColumnDef *newnode = makeNode(ColumnDef); - - COPY_STRING_FIELD(colname); - COPY_NODE_FIELD(typeName); - COPY_STRING_FIELD(compression); - COPY_SCALAR_FIELD(inhcount); - COPY_SCALAR_FIELD(is_local); - COPY_SCALAR_FIELD(is_not_null); - COPY_SCALAR_FIELD(is_from_type); - COPY_SCALAR_FIELD(attnum); - COPY_SCALAR_FIELD(storage); - COPY_STRING_FIELD(storage_name); - COPY_NODE_FIELD(raw_default); - COPY_NODE_FIELD(cooked_default); - COPY_SCALAR_FIELD(hasCookedMissingVal); - COPY_SCALAR_FIELD(missingIsNull); - if (from->hasCookedMissingVal && !from->missingIsNull) - newnode->missingVal = datumCopy(from->missingVal, false, -1); - COPY_SCALAR_FIELD(identity); - COPY_NODE_FIELD(identitySequence); - COPY_SCALAR_FIELD(generated); - COPY_NODE_FIELD(collClause); - COPY_SCALAR_FIELD(collOid); - COPY_NODE_FIELD(constraints); - COPY_NODE_FIELD(encoding); - COPY_NODE_FIELD(fdwoptions); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static TableLikeClause * -_copyTableLikeClause(const TableLikeClause *from) -{ - TableLikeClause *newnode = makeNode(TableLikeClause); - - COPY_NODE_FIELD(relation); - COPY_SCALAR_FIELD(options); - COPY_SCALAR_FIELD(relationOid); - - return newnode; -} - -static IndexElem * -_copyIndexElem(const IndexElem *from) -{ - IndexElem *newnode = makeNode(IndexElem); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(expr); - COPY_STRING_FIELD(indexcolname); - COPY_NODE_FIELD(collation); - COPY_NODE_FIELD(opclass); - COPY_NODE_FIELD(opclassopts); - COPY_SCALAR_FIELD(ordering); - COPY_SCALAR_FIELD(nulls_ordering); - - return newnode; -} - -static ColumnReferenceStorageDirective * -_copyColumnReferenceStorageDirective(const ColumnReferenceStorageDirective *from) -{ - ColumnReferenceStorageDirective *newnode = makeNode(ColumnReferenceStorageDirective); - - COPY_STRING_FIELD(column); - COPY_SCALAR_FIELD(deflt); - COPY_NODE_FIELD(encoding); - - return newnode; -} - -static DefElem * -_copyDefElem(const DefElem *from) -{ - DefElem *newnode = makeNode(DefElem); - - COPY_STRING_FIELD(defnamespace); - COPY_STRING_FIELD(defname); - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(defaction); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static LockingClause * -_copyLockingClause(const LockingClause *from) -{ - LockingClause *newnode = makeNode(LockingClause); - - COPY_NODE_FIELD(lockedRels); - COPY_SCALAR_FIELD(strength); - COPY_SCALAR_FIELD(waitPolicy); - - return newnode; -} - -static XmlSerialize * -_copyXmlSerialize(const XmlSerialize *from) -{ - XmlSerialize *newnode = makeNode(XmlSerialize); - - COPY_SCALAR_FIELD(xmloption); - COPY_NODE_FIELD(expr); - COPY_NODE_FIELD(typeName); - COPY_SCALAR_FIELD(indent); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static DistributionKeyElem * -_copyDistributionKeyElem(const DistributionKeyElem *from) -{ - DistributionKeyElem *newnode = makeNode(DistributionKeyElem); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(opclass); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static PartitionElem * -_copyPartitionElem(const PartitionElem *from) -{ - PartitionElem *newnode = makeNode(PartitionElem); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(expr); - COPY_NODE_FIELD(collation); - COPY_NODE_FIELD(opclass); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static PartitionSpec * -_copyPartitionSpec(const PartitionSpec *from) -{ - PartitionSpec *newnode = makeNode(PartitionSpec); - - COPY_SCALAR_FIELD(strategy); - COPY_NODE_FIELD(partParams); - COPY_NODE_FIELD(gpPartDef); - COPY_NODE_FIELD(subPartSpec); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static PartitionBoundSpec * -_copyPartitionBoundSpec(const PartitionBoundSpec *from) -{ - PartitionBoundSpec *newnode = makeNode(PartitionBoundSpec); - - COPY_SCALAR_FIELD(strategy); - COPY_SCALAR_FIELD(is_default); - COPY_SCALAR_FIELD(modulus); - COPY_SCALAR_FIELD(remainder); - COPY_NODE_FIELD(listdatums); - COPY_NODE_FIELD(lowerdatums); - COPY_NODE_FIELD(upperdatums); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static PartitionRangeDatum * -_copyPartitionRangeDatum(const PartitionRangeDatum *from) -{ - PartitionRangeDatum *newnode = makeNode(PartitionRangeDatum); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(value); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static PartitionCmd * -_copyPartitionCmd(const PartitionCmd *from) -{ - PartitionCmd *newnode = makeNode(PartitionCmd); - - COPY_NODE_FIELD(name); - COPY_NODE_FIELD(bound); - COPY_SCALAR_FIELD(concurrent); - - return newnode; -} - -static RangeTblEntry * -_copyRangeTblEntry(const RangeTblEntry *from) -{ - RangeTblEntry *newnode = makeNode(RangeTblEntry); - - COPY_SCALAR_FIELD(rtekind); - COPY_SCALAR_FIELD(relid); - COPY_SCALAR_FIELD(relkind); - COPY_SCALAR_FIELD(rellockmode); - COPY_NODE_FIELD(tablesample); - COPY_SCALAR_FIELD(relisivm); - COPY_SCALAR_FIELD(perminfoindex); - COPY_NODE_FIELD(subquery); - COPY_SCALAR_FIELD(security_barrier); - COPY_NODE_FIELD(subquery_rtable); - COPY_NODE_FIELD(subquery_pathkeys); - COPY_SCALAR_FIELD(jointype); - COPY_SCALAR_FIELD(joinmergedcols); - COPY_NODE_FIELD(joinaliasvars); - COPY_NODE_FIELD(joinleftcols); - COPY_NODE_FIELD(joinrightcols); - COPY_NODE_FIELD(join_using_alias); - COPY_NODE_FIELD(functions); - COPY_SCALAR_FIELD(funcordinality); - COPY_NODE_FIELD(tablefunc); - COPY_NODE_FIELD(values_lists); - COPY_STRING_FIELD(ctename); - COPY_SCALAR_FIELD(ctelevelsup); - COPY_SCALAR_FIELD(self_reference); - COPY_NODE_FIELD(coltypes); - COPY_NODE_FIELD(coltypmods); - COPY_NODE_FIELD(colcollations); - COPY_STRING_FIELD(enrname); - COPY_SCALAR_FIELD(enrtuples); - COPY_SCALAR_FIELD(forceDistRandom); - COPY_NODE_FIELD(alias); - COPY_NODE_FIELD(eref); - COPY_SCALAR_FIELD(lateral); - COPY_SCALAR_FIELD(inh); - COPY_SCALAR_FIELD(inFromCl); - COPY_NODE_FIELD(securityQuals); - - return newnode; -} - -static RTEPermissionInfo * -_copyRTEPermissionInfo(const RTEPermissionInfo *from) -{ - RTEPermissionInfo *newnode = makeNode(RTEPermissionInfo); - - COPY_SCALAR_FIELD(relid); - COPY_SCALAR_FIELD(inh); - COPY_SCALAR_FIELD(requiredPerms); - COPY_SCALAR_FIELD(checkAsUser); - COPY_BITMAPSET_FIELD(selectedCols); - COPY_BITMAPSET_FIELD(insertedCols); - COPY_BITMAPSET_FIELD(updatedCols); - - return newnode; -} - -static RangeTblFunction * -_copyRangeTblFunction(const RangeTblFunction *from) -{ - RangeTblFunction *newnode = makeNode(RangeTblFunction); - - COPY_NODE_FIELD(funcexpr); - COPY_SCALAR_FIELD(funccolcount); - COPY_NODE_FIELD(funccolnames); - COPY_NODE_FIELD(funccoltypes); - COPY_NODE_FIELD(funccoltypmods); - COPY_NODE_FIELD(funccolcollations); - COPY_VARLENA_FIELD(funcuserdata, -1); - COPY_BITMAPSET_FIELD(funcparams); - - return newnode; -} - -static TableSampleClause * -_copyTableSampleClause(const TableSampleClause *from) -{ - TableSampleClause *newnode = makeNode(TableSampleClause); - - COPY_SCALAR_FIELD(tsmhandler); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(repeatable); - - return newnode; -} - -static WithCheckOption * -_copyWithCheckOption(const WithCheckOption *from) -{ - WithCheckOption *newnode = makeNode(WithCheckOption); - - COPY_SCALAR_FIELD(kind); - COPY_STRING_FIELD(relname); - COPY_STRING_FIELD(polname); - COPY_NODE_FIELD(qual); - COPY_SCALAR_FIELD(cascaded); - - return newnode; -} - -static SortGroupClause * -_copySortGroupClause(const SortGroupClause *from) -{ - SortGroupClause *newnode = makeNode(SortGroupClause); - - COPY_SCALAR_FIELD(tleSortGroupRef); - COPY_SCALAR_FIELD(eqop); - COPY_SCALAR_FIELD(sortop); - COPY_SCALAR_FIELD(nulls_first); - COPY_SCALAR_FIELD(hashable); - - return newnode; -} - -static GroupingSet * -_copyGroupingSet(const GroupingSet *from) -{ - GroupingSet *newnode = makeNode(GroupingSet); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(content); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static WindowClause * -_copyWindowClause(const WindowClause *from) -{ - WindowClause *newnode = makeNode(WindowClause); - - COPY_STRING_FIELD(name); - COPY_STRING_FIELD(refname); - COPY_NODE_FIELD(partitionClause); - COPY_NODE_FIELD(orderClause); - COPY_SCALAR_FIELD(frameOptions); - COPY_NODE_FIELD(startOffset); - COPY_NODE_FIELD(endOffset); - COPY_NODE_FIELD(runCondition); - COPY_SCALAR_FIELD(startInRangeFunc); - COPY_SCALAR_FIELD(endInRangeFunc); - COPY_SCALAR_FIELD(inRangeColl); - COPY_SCALAR_FIELD(inRangeAsc); - COPY_SCALAR_FIELD(inRangeNullsFirst); - COPY_SCALAR_FIELD(winref); - COPY_SCALAR_FIELD(copiedOrder); - - return newnode; -} - -static RowMarkClause * -_copyRowMarkClause(const RowMarkClause *from) -{ - RowMarkClause *newnode = makeNode(RowMarkClause); - - COPY_SCALAR_FIELD(rti); - COPY_SCALAR_FIELD(strength); - COPY_SCALAR_FIELD(waitPolicy); - COPY_SCALAR_FIELD(pushedDown); - - return newnode; -} - -static WithClause * -_copyWithClause(const WithClause *from) -{ - WithClause *newnode = makeNode(WithClause); - - COPY_NODE_FIELD(ctes); - COPY_SCALAR_FIELD(recursive); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static InferClause * -_copyInferClause(const InferClause *from) -{ - InferClause *newnode = makeNode(InferClause); - - COPY_NODE_FIELD(indexElems); - COPY_NODE_FIELD(whereClause); - COPY_STRING_FIELD(conname); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static OnConflictClause * -_copyOnConflictClause(const OnConflictClause *from) -{ - OnConflictClause *newnode = makeNode(OnConflictClause); - - COPY_SCALAR_FIELD(action); - COPY_NODE_FIELD(infer); - COPY_NODE_FIELD(targetList); - COPY_NODE_FIELD(whereClause); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CTESearchClause * -_copyCTESearchClause(const CTESearchClause *from) -{ - CTESearchClause *newnode = makeNode(CTESearchClause); - - COPY_NODE_FIELD(search_col_list); - COPY_SCALAR_FIELD(search_breadth_first); - COPY_STRING_FIELD(search_seq_column); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CTECycleClause * -_copyCTECycleClause(const CTECycleClause *from) -{ - CTECycleClause *newnode = makeNode(CTECycleClause); - - COPY_NODE_FIELD(cycle_col_list); - COPY_STRING_FIELD(cycle_mark_column); - COPY_NODE_FIELD(cycle_mark_value); - COPY_NODE_FIELD(cycle_mark_default); - COPY_STRING_FIELD(cycle_path_column); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(cycle_mark_type); - COPY_SCALAR_FIELD(cycle_mark_typmod); - COPY_SCALAR_FIELD(cycle_mark_collation); - COPY_SCALAR_FIELD(cycle_mark_neop); - - return newnode; -} - -static CommonTableExpr * -_copyCommonTableExpr(const CommonTableExpr *from) -{ - CommonTableExpr *newnode = makeNode(CommonTableExpr); - - COPY_STRING_FIELD(ctename); - COPY_NODE_FIELD(aliascolnames); - COPY_SCALAR_FIELD(ctematerialized); - COPY_NODE_FIELD(ctequery); - COPY_NODE_FIELD(search_clause); - COPY_NODE_FIELD(cycle_clause); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(cterecursive); - COPY_SCALAR_FIELD(cterefcount); - COPY_NODE_FIELD(ctecolnames); - COPY_NODE_FIELD(ctecoltypes); - COPY_NODE_FIELD(ctecoltypmods); - COPY_NODE_FIELD(ctecolcollations); - - return newnode; -} - -static MergeWhenClause * -_copyMergeWhenClause(const MergeWhenClause *from) -{ - MergeWhenClause *newnode = makeNode(MergeWhenClause); - - COPY_SCALAR_FIELD(matched); - COPY_SCALAR_FIELD(commandType); - COPY_SCALAR_FIELD(override); - COPY_NODE_FIELD(condition); - COPY_NODE_FIELD(targetList); - COPY_NODE_FIELD(values); - - return newnode; -} - -static MergeAction * -_copyMergeAction(const MergeAction *from) -{ - MergeAction *newnode = makeNode(MergeAction); - - COPY_SCALAR_FIELD(matched); - COPY_SCALAR_FIELD(commandType); - COPY_SCALAR_FIELD(override); - COPY_NODE_FIELD(qual); - COPY_NODE_FIELD(targetList); - COPY_NODE_FIELD(updateColnos); - - return newnode; -} - -static TriggerTransition * -_copyTriggerTransition(const TriggerTransition *from) -{ - TriggerTransition *newnode = makeNode(TriggerTransition); - - COPY_STRING_FIELD(name); - COPY_SCALAR_FIELD(isNew); - COPY_SCALAR_FIELD(isTable); - - return newnode; -} - -static JsonOutput * -_copyJsonOutput(const JsonOutput *from) -{ - JsonOutput *newnode = makeNode(JsonOutput); - - COPY_NODE_FIELD(typeName); - COPY_NODE_FIELD(returning); - - return newnode; -} - -static JsonKeyValue * -_copyJsonKeyValue(const JsonKeyValue *from) -{ - JsonKeyValue *newnode = makeNode(JsonKeyValue); - - COPY_NODE_FIELD(key); - COPY_NODE_FIELD(value); - - return newnode; -} - -static JsonObjectConstructor * -_copyJsonObjectConstructor(const JsonObjectConstructor *from) -{ - JsonObjectConstructor *newnode = makeNode(JsonObjectConstructor); - - COPY_NODE_FIELD(exprs); - COPY_NODE_FIELD(output); - COPY_SCALAR_FIELD(absent_on_null); - COPY_SCALAR_FIELD(unique); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonArrayConstructor * -_copyJsonArrayConstructor(const JsonArrayConstructor *from) -{ - JsonArrayConstructor *newnode = makeNode(JsonArrayConstructor); - - COPY_NODE_FIELD(exprs); - COPY_NODE_FIELD(output); - COPY_SCALAR_FIELD(absent_on_null); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonArrayQueryConstructor * -_copyJsonArrayQueryConstructor(const JsonArrayQueryConstructor *from) -{ - JsonArrayQueryConstructor *newnode = makeNode(JsonArrayQueryConstructor); - - COPY_NODE_FIELD(query); - COPY_NODE_FIELD(output); - COPY_NODE_FIELD(format); - COPY_SCALAR_FIELD(absent_on_null); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonAggConstructor * -_copyJsonAggConstructor(const JsonAggConstructor *from) -{ - JsonAggConstructor *newnode = makeNode(JsonAggConstructor); - - COPY_NODE_FIELD(output); - COPY_NODE_FIELD(agg_filter); - COPY_NODE_FIELD(agg_order); - COPY_NODE_FIELD(over); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static JsonObjectAgg * -_copyJsonObjectAgg(const JsonObjectAgg *from) -{ - JsonObjectAgg *newnode = makeNode(JsonObjectAgg); - - COPY_NODE_FIELD(constructor); - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(absent_on_null); - COPY_SCALAR_FIELD(unique); - - return newnode; -} - -static JsonArrayAgg * -_copyJsonArrayAgg(const JsonArrayAgg *from) -{ - JsonArrayAgg *newnode = makeNode(JsonArrayAgg); - - COPY_NODE_FIELD(constructor); - COPY_NODE_FIELD(arg); - COPY_SCALAR_FIELD(absent_on_null); - - return newnode; -} - -static RawStmt * -_copyRawStmt(const RawStmt *from) -{ - RawStmt *newnode = makeNode(RawStmt); - - COPY_NODE_FIELD(stmt); - COPY_LOCATION_FIELD(stmt_location); - COPY_SCALAR_FIELD(stmt_len); - - return newnode; -} - -static InsertStmt * -_copyInsertStmt(const InsertStmt *from) -{ - InsertStmt *newnode = makeNode(InsertStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(cols); - COPY_NODE_FIELD(selectStmt); - COPY_NODE_FIELD(onConflictClause); - COPY_NODE_FIELD(returningList); - COPY_NODE_FIELD(withClause); - COPY_SCALAR_FIELD(override); - - return newnode; -} - -static DeleteStmt * -_copyDeleteStmt(const DeleteStmt *from) -{ - DeleteStmt *newnode = makeNode(DeleteStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(usingClause); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(returningList); - COPY_NODE_FIELD(withClause); - - return newnode; -} - -static UpdateStmt * -_copyUpdateStmt(const UpdateStmt *from) -{ - UpdateStmt *newnode = makeNode(UpdateStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(targetList); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(fromClause); - COPY_NODE_FIELD(returningList); - COPY_NODE_FIELD(withClause); - - return newnode; -} - -static MergeStmt * -_copyMergeStmt(const MergeStmt *from) -{ - MergeStmt *newnode = makeNode(MergeStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(sourceRelation); - COPY_NODE_FIELD(joinCondition); - COPY_NODE_FIELD(mergeWhenClauses); - COPY_NODE_FIELD(withClause); - - return newnode; -} - -static DistributedBy * -_copyDistributedBy(const DistributedBy *from) -{ - DistributedBy *newnode = makeNode(DistributedBy); - - COPY_SCALAR_FIELD(ptype); - COPY_SCALAR_FIELD(numsegments); - COPY_NODE_FIELD(keyCols); - - return newnode; -} - -static SelectStmt * -_copySelectStmt(const SelectStmt *from) -{ - SelectStmt *newnode = makeNode(SelectStmt); - - COPY_NODE_FIELD(distinctClause); - COPY_NODE_FIELD(intoClause); - COPY_NODE_FIELD(targetList); - COPY_NODE_FIELD(fromClause); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(groupClause); - COPY_SCALAR_FIELD(groupDistinct); - COPY_NODE_FIELD(havingClause); - COPY_NODE_FIELD(windowClause); - COPY_NODE_FIELD(scatterClause); - COPY_NODE_FIELD(valuesLists); - COPY_NODE_FIELD(sortClause); - COPY_NODE_FIELD(limitOffset); - COPY_NODE_FIELD(limitCount); - COPY_SCALAR_FIELD(limitOption); - COPY_NODE_FIELD(lockingClause); - COPY_NODE_FIELD(withClause); - COPY_SCALAR_FIELD(op); - COPY_SCALAR_FIELD(all); - COPY_NODE_FIELD(larg); - COPY_NODE_FIELD(rarg); - COPY_SCALAR_FIELD(disableLockingOptimization); - - return newnode; -} - -static SetOperationStmt * -_copySetOperationStmt(const SetOperationStmt *from) -{ - SetOperationStmt *newnode = makeNode(SetOperationStmt); - - COPY_SCALAR_FIELD(op); - COPY_SCALAR_FIELD(all); - COPY_NODE_FIELD(larg); - COPY_NODE_FIELD(rarg); - COPY_NODE_FIELD(colTypes); - COPY_NODE_FIELD(colTypmods); - COPY_NODE_FIELD(colCollations); - COPY_NODE_FIELD(groupClauses); - - return newnode; -} - -static ReturnStmt * -_copyReturnStmt(const ReturnStmt *from) -{ - ReturnStmt *newnode = makeNode(ReturnStmt); - - COPY_NODE_FIELD(returnval); - - return newnode; -} - -static PLAssignStmt * -_copyPLAssignStmt(const PLAssignStmt *from) -{ - PLAssignStmt *newnode = makeNode(PLAssignStmt); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(indirection); - COPY_SCALAR_FIELD(nnames); - COPY_NODE_FIELD(val); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CreateSchemaStmt * -_copyCreateSchemaStmt(const CreateSchemaStmt *from) -{ - CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt); - - COPY_STRING_FIELD(schemaname); - COPY_NODE_FIELD(authrole); - COPY_NODE_FIELD(schemaElts); - COPY_SCALAR_FIELD(if_not_exists); - COPY_SCALAR_FIELD(istemp); - COPY_SCALAR_FIELD(pop_search_path); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static AlterSchemaStmt * -_copyAlterSchemaStmt(const AlterSchemaStmt *from) -{ - AlterSchemaStmt *newnode = makeNode(AlterSchemaStmt); - - COPY_STRING_FIELD(schemaname); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static CreateTagStmt * -_copyCreateTagStmt(const CreateTagStmt *from) -{ - CreateTagStmt *newnode = makeNode(CreateTagStmt); - - COPY_STRING_FIELD(tag_name); - COPY_SCALAR_FIELD(missing_ok); - COPY_NODE_FIELD(allowed_values); - - return newnode; -} - -static CompoundUtilityStmt * -_copyCompoundUtilityStmt(const CompoundUtilityStmt *from) -{ - CompoundUtilityStmt *newnode = makeNode(CompoundUtilityStmt); - - COPY_NODE_FIELD(schemaElts); - - return newnode; -} - -static AlterTableStmt * -_copyAlterTableStmt(const AlterTableStmt *from) -{ - AlterTableStmt *newnode = makeNode(AlterTableStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(cmds); - COPY_SCALAR_FIELD(objtype); - COPY_SCALAR_FIELD(missing_ok); - COPY_SCALAR_FIELD(lockmode); - COPY_NODE_FIELD(wqueue); - COPY_SCALAR_FIELD(is_internal); - - return newnode; -} - -static AlterTagStmt * -_copyAlterTagStmt(const AlterTagStmt *from) -{ - AlterTagStmt *newnode = makeNode(AlterTagStmt); - - COPY_STRING_FIELD(tag_name); - COPY_SCALAR_FIELD(action); - COPY_NODE_FIELD(tag_values); - COPY_SCALAR_FIELD(missing_ok); - COPY_SCALAR_FIELD(unset); - - return newnode; -} - -static ReplicaIdentityStmt * -_copyReplicaIdentityStmt(const ReplicaIdentityStmt *from) -{ - ReplicaIdentityStmt *newnode = makeNode(ReplicaIdentityStmt); - - COPY_SCALAR_FIELD(identity_type); - COPY_STRING_FIELD(name); - - return newnode; -} - -static AlterTableCmd * -_copyAlterTableCmd(const AlterTableCmd *from) -{ - AlterTableCmd *newnode = makeNode(AlterTableCmd); - - COPY_SCALAR_FIELD(subtype); - COPY_STRING_FIELD(name); - COPY_SCALAR_FIELD(num); - COPY_NODE_FIELD(newowner); - COPY_NODE_FIELD(def); - COPY_NODE_FIELD(transform); - COPY_SCALAR_FIELD(behavior); - COPY_SCALAR_FIELD(missing_ok); - COPY_SCALAR_FIELD(recurse); - COPY_SCALAR_FIELD(backendId); - COPY_STRING_FIELD(queryString); - COPY_NODE_FIELD(policy); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static GpAlterPartitionId * -_copyGpAlterPartitionId(const GpAlterPartitionId *from) -{ - GpAlterPartitionId *newnode = makeNode(GpAlterPartitionId); - - COPY_SCALAR_FIELD(idtype); - COPY_NODE_FIELD(partiddef); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpDropPartitionCmd * -_copyGpDropPartitionCmd(const GpDropPartitionCmd *from) -{ - GpDropPartitionCmd *newnode = makeNode(GpDropPartitionCmd); - - COPY_NODE_FIELD(partid); - COPY_SCALAR_FIELD(behavior); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static GpAlterPartitionCmd * -_copyGpAlterPartitionCmd(const GpAlterPartitionCmd *from) -{ - GpAlterPartitionCmd *newnode = makeNode(GpAlterPartitionCmd); - - COPY_NODE_FIELD(partid); - COPY_NODE_FIELD(arg); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpPartitionRangeItem * -_copyGpPartitionRangeItem(const GpPartitionRangeItem *from) -{ - GpPartitionRangeItem *newnode = makeNode(GpPartitionRangeItem); - - COPY_NODE_FIELD(val); - COPY_SCALAR_FIELD(edge); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpSplitPartitionCmd * -_copyGpSplitPartitionCmd(const GpSplitPartitionCmd *from) -{ - GpSplitPartitionCmd *newnode = makeNode(GpSplitPartitionCmd); - - COPY_NODE_FIELD(partid); - COPY_NODE_FIELD(start); - COPY_NODE_FIELD(end); - COPY_NODE_FIELD(at); - COPY_NODE_FIELD(arg2); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static AlterCollationStmt * -_copyAlterCollationStmt(const AlterCollationStmt *from) -{ - AlterCollationStmt *newnode = makeNode(AlterCollationStmt); - - COPY_NODE_FIELD(collname); - - return newnode; -} - -static AlterDomainStmt * -_copyAlterDomainStmt(const AlterDomainStmt *from) -{ - AlterDomainStmt *newnode = makeNode(AlterDomainStmt); - - COPY_SCALAR_FIELD(subtype); - COPY_NODE_FIELD(typeName); - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(def); - COPY_SCALAR_FIELD(behavior); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static GrantStmt * -_copyGrantStmt(const GrantStmt *from) -{ - GrantStmt *newnode = makeNode(GrantStmt); - - COPY_SCALAR_FIELD(is_grant); - COPY_SCALAR_FIELD(targtype); - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(objects); - COPY_NODE_FIELD(privileges); - COPY_NODE_FIELD(grantees); - COPY_SCALAR_FIELD(grant_option); - COPY_NODE_FIELD(grantor); - COPY_SCALAR_FIELD(behavior); - - return newnode; -} - -static ObjectWithArgs * -_copyObjectWithArgs(const ObjectWithArgs *from) -{ - ObjectWithArgs *newnode = makeNode(ObjectWithArgs); - - COPY_NODE_FIELD(objname); - COPY_NODE_FIELD(objargs); - COPY_NODE_FIELD(objfuncargs); - COPY_SCALAR_FIELD(args_unspecified); - - return newnode; -} - -static AccessPriv * -_copyAccessPriv(const AccessPriv *from) -{ - AccessPriv *newnode = makeNode(AccessPriv); - - COPY_STRING_FIELD(priv_name); - COPY_NODE_FIELD(cols); - - return newnode; -} - -static GrantRoleStmt * -_copyGrantRoleStmt(const GrantRoleStmt *from) -{ - GrantRoleStmt *newnode = makeNode(GrantRoleStmt); - - COPY_NODE_FIELD(granted_roles); - COPY_NODE_FIELD(grantee_roles); - COPY_SCALAR_FIELD(is_grant); - COPY_NODE_FIELD(opt); - COPY_NODE_FIELD(grantor); - COPY_SCALAR_FIELD(behavior); - - return newnode; -} - -static SingleRowErrorDesc * -_copySingleRowErrorDesc(const SingleRowErrorDesc *from) -{ - SingleRowErrorDesc *newnode = makeNode(SingleRowErrorDesc); - - COPY_SCALAR_FIELD(rejectlimit); - COPY_SCALAR_FIELD(is_limit_in_rows); - COPY_SCALAR_FIELD(log_error_type); - - return newnode; -} - -static AlterDefaultPrivilegesStmt * -_copyAlterDefaultPrivilegesStmt(const AlterDefaultPrivilegesStmt *from) -{ - AlterDefaultPrivilegesStmt *newnode = makeNode(AlterDefaultPrivilegesStmt); - - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(action); - - return newnode; -} - -static CopyStmt * -_copyCopyStmt(const CopyStmt *from) -{ - CopyStmt *newnode = makeNode(CopyStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(query); - COPY_NODE_FIELD(attlist); - COPY_SCALAR_FIELD(is_from); - COPY_SCALAR_FIELD(is_program); - COPY_STRING_FIELD(filename); - COPY_STRING_FIELD(dirfilename); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(sreh); - - return newnode; -} - -static VariableSetStmt * -_copyVariableSetStmt(const VariableSetStmt *from) -{ - VariableSetStmt *newnode = makeNode(VariableSetStmt); - - COPY_SCALAR_FIELD(kind); - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(args); - COPY_SCALAR_FIELD(is_local); - - return newnode; -} - -static VariableShowStmt * -_copyVariableShowStmt(const VariableShowStmt *from) -{ - VariableShowStmt *newnode = makeNode(VariableShowStmt); - - COPY_STRING_FIELD(name); - - return newnode; -} - -static CreateStmt * -_copyCreateStmt(const CreateStmt *from) -{ - CreateStmt *newnode = makeNode(CreateStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(tableElts); - COPY_NODE_FIELD(inhRelations); - COPY_NODE_FIELD(partbound); - COPY_NODE_FIELD(partspec); - COPY_NODE_FIELD(ofTypename); - COPY_NODE_FIELD(constraints); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(oncommit); - COPY_STRING_FIELD(tablespacename); - COPY_STRING_FIELD(accessMethod); - COPY_SCALAR_FIELD(if_not_exists); - COPY_SCALAR_FIELD(gp_style_alter_part); - COPY_NODE_FIELD(distributedBy); - COPY_NODE_FIELD(partitionBy); - COPY_SCALAR_FIELD(relKind); - COPY_SCALAR_FIELD(ownerid); - COPY_SCALAR_FIELD(buildAoBlkdir); - COPY_NODE_FIELD(attr_encodings); - COPY_SCALAR_FIELD(isCtas); - COPY_NODE_FIELD(intoQuery); - COPY_NODE_FIELD(intoPolicy); - COPY_NODE_FIELD(part_idx_oids); - COPY_NODE_FIELD(part_idx_names); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(origin); - - return newnode; -} - - -static ExtTableTypeDesc * -_copyExtTableTypeDesc(const ExtTableTypeDesc *from) -{ - ExtTableTypeDesc *newnode = makeNode(ExtTableTypeDesc); - - COPY_SCALAR_FIELD(exttabletype); - COPY_NODE_FIELD(location_list); - COPY_NODE_FIELD(on_clause); - COPY_STRING_FIELD(command_string); - - return newnode; -} - -static CreateExternalStmt * -_copyCreateExternalStmt(const CreateExternalStmt *from) -{ - CreateExternalStmt *newnode = makeNode(CreateExternalStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(tableElts); - COPY_NODE_FIELD(exttypedesc); - COPY_STRING_FIELD(format); - COPY_NODE_FIELD(formatOpts); - COPY_SCALAR_FIELD(isweb); - COPY_SCALAR_FIELD(iswritable); - COPY_NODE_FIELD(sreh); - COPY_NODE_FIELD(extOptions); - COPY_NODE_FIELD(encoding); - COPY_NODE_FIELD(distributedBy); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static CreateForeignStmt * -_copyCreateForeignStmt(const CreateForeignStmt *from) -{ - CreateForeignStmt *newnode = makeNode(CreateForeignStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(tableElts); - COPY_STRING_FIELD(srvname); - COPY_NODE_FIELD(options); - - return newnode; -} - -static Constraint * -_copyConstraint(const Constraint *from) -{ - Constraint *newnode = makeNode(Constraint); - - COPY_SCALAR_FIELD(contype); - COPY_STRING_FIELD(conname); - COPY_SCALAR_FIELD(deferrable); - COPY_SCALAR_FIELD(initdeferred); - COPY_LOCATION_FIELD(location); - COPY_SCALAR_FIELD(is_no_inherit); - COPY_NODE_FIELD(raw_expr); - COPY_STRING_FIELD(cooked_expr); - COPY_SCALAR_FIELD(generated_when); - COPY_SCALAR_FIELD(nulls_not_distinct); - COPY_NODE_FIELD(keys); - COPY_NODE_FIELD(including); - COPY_NODE_FIELD(exclusions); - COPY_NODE_FIELD(options); - COPY_STRING_FIELD(indexname); - COPY_STRING_FIELD(indexspace); - COPY_SCALAR_FIELD(reset_default_tblspc); - COPY_STRING_FIELD(access_method); - COPY_NODE_FIELD(where_clause); - COPY_NODE_FIELD(pktable); - COPY_NODE_FIELD(fk_attrs); - COPY_NODE_FIELD(pk_attrs); - COPY_SCALAR_FIELD(fk_matchtype); - COPY_SCALAR_FIELD(fk_upd_action); - COPY_SCALAR_FIELD(fk_del_action); - COPY_NODE_FIELD(fk_del_set_cols); - COPY_NODE_FIELD(old_conpfeqop); - COPY_SCALAR_FIELD(old_pktable_oid); - COPY_SCALAR_FIELD(skip_validation); - COPY_SCALAR_FIELD(initially_valid); - - return newnode; -} - -static GpPartDefElem * -_copyGpPartDefElem(const GpPartDefElem *from) -{ - GpPartDefElem *newnode = makeNode(GpPartDefElem); - - COPY_STRING_FIELD(partName); - COPY_NODE_FIELD(boundSpec); - COPY_NODE_FIELD(subSpec); - COPY_SCALAR_FIELD(isDefault); - COPY_NODE_FIELD(options); - COPY_STRING_FIELD(accessMethod); - COPY_STRING_FIELD(tablespacename); - COPY_NODE_FIELD(colencs); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpPartitionRangeSpec * -_copyGpPartitionRangeSpec(const GpPartitionRangeSpec *from) -{ - GpPartitionRangeSpec *newnode = makeNode(GpPartitionRangeSpec); - - COPY_NODE_FIELD(partStart); - COPY_NODE_FIELD(partEnd); - COPY_NODE_FIELD(partEvery); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpPartitionListSpec * -_copyGpPartitionListSpec(const GpPartitionListSpec *from) -{ - GpPartitionListSpec *newnode = makeNode(GpPartitionListSpec); - - COPY_NODE_FIELD(partValues); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static GpPartitionDefinition * -_copyGpPartitionDefinition(const GpPartitionDefinition *from) -{ - GpPartitionDefinition *newnode = makeNode(GpPartitionDefinition); - - COPY_NODE_FIELD(partDefElems); - COPY_NODE_FIELD(encClauses); - COPY_SCALAR_FIELD(isTemplate); - COPY_SCALAR_FIELD(fromCatalog); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CreateTableSpaceStmt * -_copyCreateTableSpaceStmt(const CreateTableSpaceStmt *from) -{ - CreateTableSpaceStmt *newnode = makeNode(CreateTableSpaceStmt); - - COPY_STRING_FIELD(tablespacename); - COPY_NODE_FIELD(owner); - COPY_STRING_FIELD(location); - COPY_NODE_FIELD(options); - COPY_STRING_FIELD(filehandler); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static DropTableSpaceStmt * -_copyDropTableSpaceStmt(const DropTableSpaceStmt *from) -{ - DropTableSpaceStmt *newnode = makeNode(DropTableSpaceStmt); - - COPY_STRING_FIELD(tablespacename); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static AlterTableSpaceOptionsStmt * -_copyAlterTableSpaceOptionsStmt(const AlterTableSpaceOptionsStmt *from) -{ - AlterTableSpaceOptionsStmt *newnode = makeNode(AlterTableSpaceOptionsStmt); - - COPY_STRING_FIELD(tablespacename); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(isReset); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static AlterTableMoveAllStmt * -_copyAlterTableMoveAllStmt(const AlterTableMoveAllStmt *from) -{ - AlterTableMoveAllStmt *newnode = makeNode(AlterTableMoveAllStmt); - - COPY_STRING_FIELD(orig_tablespacename); - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(roles); - COPY_STRING_FIELD(new_tablespacename); - COPY_SCALAR_FIELD(nowait); - - return newnode; -} - -static DropTagStmt * -_copyDropTagStmt(const DropTagStmt *from) -{ - DropTagStmt *newnode = makeNode(DropTagStmt); - - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateTaskStmt * -_copyCreateTaskStmt(const CreateTaskStmt *from) -{ - CreateTaskStmt *newnode = makeNode(CreateTaskStmt); - - COPY_STRING_FIELD(taskname); - COPY_STRING_FIELD(schedule); - COPY_STRING_FIELD(sql); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(if_not_exists); - - return newnode; -} - -static AlterTaskStmt * -_copyAlterTaskStmt(const AlterTaskStmt *from) -{ - AlterTaskStmt *newnode = makeNode(AlterTaskStmt); - - COPY_STRING_FIELD(taskname); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static DropTaskStmt * -_copyDropTaskStmt(const DropTaskStmt *from) -{ - DropTaskStmt *newnode = makeNode(DropTaskStmt); - - COPY_STRING_FIELD(taskname); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateExtensionStmt * -_copyCreateExtensionStmt(const CreateExtensionStmt *from) -{ - CreateExtensionStmt *newnode = makeNode(CreateExtensionStmt); - - COPY_STRING_FIELD(extname); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(create_ext_state); - - return newnode; -} - -static AlterExtensionStmt * -_copyAlterExtensionStmt(const AlterExtensionStmt *from) -{ - AlterExtensionStmt *newnode = makeNode(AlterExtensionStmt); - - COPY_STRING_FIELD(extname); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(update_ext_state); - - return newnode; -} - -static AlterExtensionContentsStmt * -_copyAlterExtensionContentsStmt(const AlterExtensionContentsStmt *from) -{ - AlterExtensionContentsStmt *newnode = makeNode(AlterExtensionContentsStmt); - - COPY_STRING_FIELD(extname); - COPY_SCALAR_FIELD(action); - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(object); - - return newnode; -} - -static CreateFdwStmt * -_copyCreateFdwStmt(const CreateFdwStmt *from) -{ - CreateFdwStmt *newnode = makeNode(CreateFdwStmt); - - COPY_STRING_FIELD(fdwname); - COPY_NODE_FIELD(func_options); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterFdwStmt * -_copyAlterFdwStmt(const AlterFdwStmt *from) -{ - AlterFdwStmt *newnode = makeNode(AlterFdwStmt); - - COPY_STRING_FIELD(fdwname); - COPY_NODE_FIELD(func_options); - COPY_NODE_FIELD(options); - - return newnode; -} - -static CreateForeignServerStmt * -_copyCreateForeignServerStmt(const CreateForeignServerStmt *from) -{ - CreateForeignServerStmt *newnode = makeNode(CreateForeignServerStmt); - - COPY_STRING_FIELD(servername); - COPY_STRING_FIELD(servertype); - COPY_STRING_FIELD(version); - COPY_STRING_FIELD(fdwname); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterForeignServerStmt * -_copyAlterForeignServerStmt(const AlterForeignServerStmt *from) -{ - AlterForeignServerStmt *newnode = makeNode(AlterForeignServerStmt); - - COPY_STRING_FIELD(servername); - COPY_STRING_FIELD(version); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(has_version); - - return newnode; -} - -static CreateStorageServerStmt * -_copyCreateStorageServerStmt(const CreateStorageServerStmt *from) -{ - CreateStorageServerStmt *newnode = makeNode(CreateStorageServerStmt); - - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterStorageServerStmt * -_copyAlterStorageServerStmt(const AlterStorageServerStmt *from) -{ - AlterStorageServerStmt *newnode = makeNode(AlterStorageServerStmt); - - COPY_STRING_FIELD(servername); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropStorageServerStmt * -_copyDropStorageServerStmt(const DropStorageServerStmt *from) -{ - DropStorageServerStmt *newnode = makeNode(DropStorageServerStmt); - - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateForeignTableStmt * -_copyCreateForeignTableStmt(const CreateForeignTableStmt *from) -{ - CreateForeignTableStmt *newnode = makeNode(CreateForeignTableStmt); - - COPY_NODE_FIELD(base.relation); - COPY_NODE_FIELD(base.tableElts); - COPY_NODE_FIELD(base.inhRelations); - COPY_NODE_FIELD(base.partbound); - COPY_NODE_FIELD(base.partspec); - COPY_NODE_FIELD(base.ofTypename); - COPY_NODE_FIELD(base.constraints); - COPY_NODE_FIELD(base.options); - COPY_SCALAR_FIELD(base.oncommit); - COPY_STRING_FIELD(base.tablespacename); - COPY_STRING_FIELD(base.accessMethod); - COPY_SCALAR_FIELD(base.if_not_exists); - COPY_SCALAR_FIELD(base.gp_style_alter_part); - COPY_NODE_FIELD(base.distributedBy); - COPY_NODE_FIELD(base.partitionBy); - COPY_SCALAR_FIELD(base.relKind); - COPY_SCALAR_FIELD(base.ownerid); - COPY_SCALAR_FIELD(base.buildAoBlkdir); - COPY_NODE_FIELD(base.attr_encodings); - COPY_SCALAR_FIELD(base.isCtas); - COPY_NODE_FIELD(base.intoQuery); - COPY_NODE_FIELD(base.intoPolicy); - COPY_NODE_FIELD(base.part_idx_oids); - COPY_NODE_FIELD(base.part_idx_names); - COPY_NODE_FIELD(base.tags); - COPY_SCALAR_FIELD(base.origin); - COPY_STRING_FIELD(servername); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(distributedBy); - - return newnode; -} - -static CreateUserMappingStmt * -_copyCreateUserMappingStmt(const CreateUserMappingStmt *from) -{ - CreateUserMappingStmt *newnode = makeNode(CreateUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterUserMappingStmt * -_copyAlterUserMappingStmt(const AlterUserMappingStmt *from) -{ - AlterUserMappingStmt *newnode = makeNode(AlterUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropUserMappingStmt * -_copyDropUserMappingStmt(const DropUserMappingStmt *from) -{ - DropUserMappingStmt *newnode = makeNode(DropUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateStorageUserMappingStmt * -_copyCreateStorageUserMappingStmt(const CreateStorageUserMappingStmt *from) -{ - CreateStorageUserMappingStmt *newnode = makeNode(CreateStorageUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterStorageUserMappingStmt * -_copyAlterStorageUserMappingStmt(const AlterStorageUserMappingStmt *from) -{ - AlterStorageUserMappingStmt *newnode = makeNode(AlterStorageUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropStorageUserMappingStmt * -_copyDropStorageUserMappingStmt(const DropStorageUserMappingStmt *from) -{ - DropStorageUserMappingStmt *newnode = makeNode(DropStorageUserMappingStmt); - - COPY_NODE_FIELD(user); - COPY_STRING_FIELD(servername); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static ImportForeignSchemaStmt * -_copyImportForeignSchemaStmt(const ImportForeignSchemaStmt *from) -{ - ImportForeignSchemaStmt *newnode = makeNode(ImportForeignSchemaStmt); - - COPY_STRING_FIELD(server_name); - COPY_STRING_FIELD(remote_schema); - COPY_STRING_FIELD(local_schema); - COPY_SCALAR_FIELD(list_type); - COPY_NODE_FIELD(table_list); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AddForeignSegStmt * -_copyAddForeignSegStmt(const AddForeignSegStmt *from) -{ - AddForeignSegStmt *newnode = makeNode(AddForeignSegStmt); - - COPY_STRING_FIELD(servername); - COPY_STRING_FIELD(tablename); - COPY_NODE_FIELD(options); - - return newnode; -} - -static CreatePolicyStmt * -_copyCreatePolicyStmt(const CreatePolicyStmt *from) -{ - CreatePolicyStmt *newnode = makeNode(CreatePolicyStmt); - - COPY_STRING_FIELD(policy_name); - COPY_NODE_FIELD(table); - COPY_STRING_FIELD(cmd_name); - COPY_SCALAR_FIELD(permissive); - COPY_NODE_FIELD(roles); - COPY_NODE_FIELD(qual); - COPY_NODE_FIELD(with_check); - - return newnode; -} - -static AlterPolicyStmt * -_copyAlterPolicyStmt(const AlterPolicyStmt *from) -{ - AlterPolicyStmt *newnode = makeNode(AlterPolicyStmt); - - COPY_STRING_FIELD(policy_name); - COPY_NODE_FIELD(table); - COPY_NODE_FIELD(roles); - COPY_NODE_FIELD(qual); - COPY_NODE_FIELD(with_check); - - return newnode; -} - -static CreateAmStmt * -_copyCreateAmStmt(const CreateAmStmt *from) -{ - CreateAmStmt *newnode = makeNode(CreateAmStmt); - - COPY_STRING_FIELD(amname); - COPY_NODE_FIELD(handler_name); - COPY_SCALAR_FIELD(amtype); - - return newnode; -} - -static CreateTrigStmt * -_copyCreateTrigStmt(const CreateTrigStmt *from) -{ - CreateTrigStmt *newnode = makeNode(CreateTrigStmt); - - COPY_SCALAR_FIELD(replace); - COPY_SCALAR_FIELD(isconstraint); - COPY_STRING_FIELD(trigname); - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(funcname); - COPY_NODE_FIELD(args); - COPY_SCALAR_FIELD(row); - COPY_SCALAR_FIELD(timing); - COPY_SCALAR_FIELD(events); - COPY_NODE_FIELD(columns); - COPY_NODE_FIELD(whenClause); - COPY_NODE_FIELD(transitionRels); - COPY_SCALAR_FIELD(deferrable); - COPY_SCALAR_FIELD(initdeferred); - COPY_NODE_FIELD(constrrel); - COPY_SCALAR_FIELD(matviewId); - - return newnode; -} - -static CreateEventTrigStmt * -_copyCreateEventTrigStmt(const CreateEventTrigStmt *from) -{ - CreateEventTrigStmt *newnode = makeNode(CreateEventTrigStmt); - - COPY_STRING_FIELD(trigname); - COPY_STRING_FIELD(eventname); - COPY_NODE_FIELD(whenclause); - COPY_NODE_FIELD(funcname); - - return newnode; -} - -static AlterEventTrigStmt * -_copyAlterEventTrigStmt(const AlterEventTrigStmt *from) -{ - AlterEventTrigStmt *newnode = makeNode(AlterEventTrigStmt); - - COPY_STRING_FIELD(trigname); - COPY_SCALAR_FIELD(tgenabled); - - return newnode; -} - -static CreatePLangStmt * -_copyCreatePLangStmt(const CreatePLangStmt *from) -{ - CreatePLangStmt *newnode = makeNode(CreatePLangStmt); - - COPY_SCALAR_FIELD(replace); - COPY_STRING_FIELD(plname); - COPY_NODE_FIELD(plhandler); - COPY_NODE_FIELD(plinline); - COPY_NODE_FIELD(plvalidator); - COPY_SCALAR_FIELD(pltrusted); - - return newnode; -} - -static CreateQueueStmt * -_copyCreateQueueStmt(const CreateQueueStmt *from) -{ - CreateQueueStmt *newnode = makeNode(CreateQueueStmt); - - COPY_STRING_FIELD(queue); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterQueueStmt * -_copyAlterQueueStmt(const AlterQueueStmt *from) -{ - AlterQueueStmt *newnode = makeNode(AlterQueueStmt); - - COPY_STRING_FIELD(queue); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropQueueStmt * -_copyDropQueueStmt(const DropQueueStmt *from) -{ - DropQueueStmt *newnode = makeNode(DropQueueStmt); - - COPY_STRING_FIELD(queue); - - return newnode; -} - -static CreateResourceGroupStmt * -_copyCreateResourceGroupStmt(const CreateResourceGroupStmt *from) -{ - CreateResourceGroupStmt *newnode = makeNode(CreateResourceGroupStmt); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropResourceGroupStmt * -_copyDropResourceGroupStmt(const DropResourceGroupStmt *from) -{ - DropResourceGroupStmt *newnode = makeNode(DropResourceGroupStmt); - - COPY_STRING_FIELD(name); - - return newnode; -} - -static AlterResourceGroupStmt * -_copyAlterResourceGroupStmt(const AlterResourceGroupStmt *from) -{ - AlterResourceGroupStmt *newnode = makeNode(AlterResourceGroupStmt); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(options); - - return newnode; -} - -static CreateRoleStmt * -_copyCreateRoleStmt(const CreateRoleStmt *from) -{ - CreateRoleStmt *newnode = makeNode(CreateRoleStmt); - - COPY_SCALAR_FIELD(stmt_type); - COPY_STRING_FIELD(role); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static AlterRoleStmt * -_copyAlterRoleStmt(const AlterRoleStmt *from) -{ - AlterRoleStmt *newnode = makeNode(AlterRoleStmt); - - COPY_NODE_FIELD(role); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(action); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static AlterRoleSetStmt * -_copyAlterRoleSetStmt(const AlterRoleSetStmt *from) -{ - AlterRoleSetStmt *newnode = makeNode(AlterRoleSetStmt); - - COPY_NODE_FIELD(role); - COPY_STRING_FIELD(database); - COPY_NODE_FIELD(setstmt); - - return newnode; -} - -static DropRoleStmt * -_copyDropRoleStmt(const DropRoleStmt *from) -{ - DropRoleStmt *newnode = makeNode(DropRoleStmt); - - COPY_NODE_FIELD(roles); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateProfileStmt * -_copyCreateProfileStmt(const CreateProfileStmt *from) -{ - CreateProfileStmt *newnode = makeNode(CreateProfileStmt); - - COPY_STRING_FIELD(profile_name); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterProfileStmt * -_copyAlterProfileStmt(const AlterProfileStmt *from) -{ - AlterProfileStmt *newnode = makeNode(AlterProfileStmt); - - COPY_STRING_FIELD(profile_name); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropProfileStmt * -_copyDropProfileStmt(const DropProfileStmt *from) -{ - DropProfileStmt *newnode = makeNode(DropProfileStmt); - - COPY_NODE_FIELD(profiles); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static DenyLoginPoint * -_copyDenyLoginPoint(const DenyLoginPoint *from) -{ - DenyLoginPoint *newnode = makeNode(DenyLoginPoint); - - COPY_NODE_FIELD(day); - COPY_NODE_FIELD(time); - - return newnode; -} - -static DenyLoginInterval * -_copyDenyLoginInterval(const DenyLoginInterval *from) -{ - DenyLoginInterval *newnode = makeNode(DenyLoginInterval); - - COPY_NODE_FIELD(start); - COPY_NODE_FIELD(end); - - return newnode; -} - -static CreateSeqStmt * -_copyCreateSeqStmt(const CreateSeqStmt *from) -{ - CreateSeqStmt *newnode = makeNode(CreateSeqStmt); - - COPY_NODE_FIELD(sequence); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(ownerId); - COPY_SCALAR_FIELD(for_identity); - COPY_SCALAR_FIELD(if_not_exists); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static AlterSeqStmt * -_copyAlterSeqStmt(const AlterSeqStmt *from) -{ - AlterSeqStmt *newnode = makeNode(AlterSeqStmt); - - COPY_NODE_FIELD(sequence); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(for_identity); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static DefineStmt * -_copyDefineStmt(const DefineStmt *from) -{ - DefineStmt *newnode = makeNode(DefineStmt); - - COPY_SCALAR_FIELD(kind); - COPY_SCALAR_FIELD(oldstyle); - COPY_NODE_FIELD(defnames); - COPY_NODE_FIELD(args); - COPY_NODE_FIELD(definition); - COPY_SCALAR_FIELD(if_not_exists); - COPY_SCALAR_FIELD(replace); - COPY_SCALAR_FIELD(trusted); - - return newnode; -} - -static CreateDomainStmt * -_copyCreateDomainStmt(const CreateDomainStmt *from) -{ - CreateDomainStmt *newnode = makeNode(CreateDomainStmt); - - COPY_NODE_FIELD(domainname); - COPY_NODE_FIELD(typeName); - COPY_NODE_FIELD(collClause); - COPY_NODE_FIELD(constraints); - - return newnode; -} - -static CreateOpClassStmt * -_copyCreateOpClassStmt(const CreateOpClassStmt *from) -{ - CreateOpClassStmt *newnode = makeNode(CreateOpClassStmt); - - COPY_NODE_FIELD(opclassname); - COPY_NODE_FIELD(opfamilyname); - COPY_STRING_FIELD(amname); - COPY_NODE_FIELD(datatype); - COPY_NODE_FIELD(items); - COPY_SCALAR_FIELD(isDefault); - - return newnode; -} - -static CreateOpClassItem * -_copyCreateOpClassItem(const CreateOpClassItem *from) -{ - CreateOpClassItem *newnode = makeNode(CreateOpClassItem); - - COPY_SCALAR_FIELD(itemtype); - COPY_NODE_FIELD(name); - COPY_SCALAR_FIELD(number); - COPY_NODE_FIELD(order_family); - COPY_NODE_FIELD(class_args); - COPY_NODE_FIELD(storedtype); - - return newnode; -} - -static CreateOpFamilyStmt * -_copyCreateOpFamilyStmt(const CreateOpFamilyStmt *from) -{ - CreateOpFamilyStmt *newnode = makeNode(CreateOpFamilyStmt); - - COPY_NODE_FIELD(opfamilyname); - COPY_STRING_FIELD(amname); - - return newnode; -} - -static AlterOpFamilyStmt * -_copyAlterOpFamilyStmt(const AlterOpFamilyStmt *from) -{ - AlterOpFamilyStmt *newnode = makeNode(AlterOpFamilyStmt); - - COPY_NODE_FIELD(opfamilyname); - COPY_STRING_FIELD(amname); - COPY_SCALAR_FIELD(isDrop); - COPY_NODE_FIELD(items); - - return newnode; -} - -static CreateDirectoryTableStmt * -_copyCreateDirectoryTableStmt(const CreateDirectoryTableStmt *from) -{ - CreateDirectoryTableStmt *newnode = makeNode(CreateDirectoryTableStmt); - - COPY_NODE_FIELD(base.relation); - COPY_NODE_FIELD(base.tableElts); - COPY_NODE_FIELD(base.inhRelations); - COPY_NODE_FIELD(base.partbound); - COPY_NODE_FIELD(base.partspec); - COPY_NODE_FIELD(base.ofTypename); - COPY_NODE_FIELD(base.constraints); - COPY_NODE_FIELD(base.options); - COPY_SCALAR_FIELD(base.oncommit); - COPY_STRING_FIELD(base.tablespacename); - COPY_STRING_FIELD(base.accessMethod); - COPY_SCALAR_FIELD(base.if_not_exists); - COPY_SCALAR_FIELD(base.gp_style_alter_part); - COPY_NODE_FIELD(base.distributedBy); - COPY_NODE_FIELD(base.partitionBy); - COPY_SCALAR_FIELD(base.relKind); - COPY_SCALAR_FIELD(base.ownerid); - COPY_SCALAR_FIELD(base.buildAoBlkdir); - COPY_NODE_FIELD(base.attr_encodings); - COPY_SCALAR_FIELD(base.isCtas); - COPY_NODE_FIELD(base.intoQuery); - COPY_NODE_FIELD(base.intoPolicy); - COPY_NODE_FIELD(base.part_idx_oids); - COPY_NODE_FIELD(base.part_idx_names); - COPY_NODE_FIELD(base.tags); - COPY_SCALAR_FIELD(base.origin); - COPY_STRING_FIELD(tablespacename); - COPY_STRING_FIELD(location); - - return newnode; -} - -static AlterDirectoryTableStmt * -_copyAlterDirectoryTableStmt(const AlterDirectoryTableStmt *from) -{ - AlterDirectoryTableStmt *newnode = makeNode(AlterDirectoryTableStmt); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static DropStmt * -_copyDropStmt(const DropStmt *from) -{ - DropStmt *newnode = makeNode(DropStmt); - - COPY_NODE_FIELD(objects); - COPY_SCALAR_FIELD(removeType); - COPY_SCALAR_FIELD(behavior); - COPY_SCALAR_FIELD(missing_ok); - COPY_SCALAR_FIELD(concurrent); - COPY_SCALAR_FIELD(isdynamic); - - return newnode; -} - -static DropDirectoryTableStmt * -_copyDropDirectoryTableStmt(const DropDirectoryTableStmt *from) -{ - DropDirectoryTableStmt *newnode = makeNode(DropDirectoryTableStmt); - - COPY_NODE_FIELD(base.objects); - COPY_SCALAR_FIELD(base.removeType); - COPY_SCALAR_FIELD(base.behavior); - COPY_SCALAR_FIELD(base.missing_ok); - COPY_SCALAR_FIELD(base.concurrent); - COPY_SCALAR_FIELD(base.isdynamic); - COPY_SCALAR_FIELD(with_content); - - return newnode; -} - -static TruncateStmt * -_copyTruncateStmt(const TruncateStmt *from) -{ - TruncateStmt *newnode = makeNode(TruncateStmt); - - COPY_NODE_FIELD(relations); - COPY_SCALAR_FIELD(restart_seqs); - COPY_SCALAR_FIELD(behavior); - - return newnode; -} - -static CommentStmt * -_copyCommentStmt(const CommentStmt *from) -{ - CommentStmt *newnode = makeNode(CommentStmt); - - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(object); - COPY_STRING_FIELD(comment); - - return newnode; -} - -static SecLabelStmt * -_copySecLabelStmt(const SecLabelStmt *from) -{ - SecLabelStmt *newnode = makeNode(SecLabelStmt); - - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(object); - COPY_STRING_FIELD(provider); - COPY_STRING_FIELD(label); - - return newnode; -} - -static DeclareCursorStmt * -_copyDeclareCursorStmt(const DeclareCursorStmt *from) -{ - DeclareCursorStmt *newnode = makeNode(DeclareCursorStmt); - - COPY_STRING_FIELD(portalname); - COPY_SCALAR_FIELD(options); - COPY_NODE_FIELD(query); - - return newnode; -} - -static ClosePortalStmt * -_copyClosePortalStmt(const ClosePortalStmt *from) -{ - ClosePortalStmt *newnode = makeNode(ClosePortalStmt); - - COPY_STRING_FIELD(portalname); - - return newnode; -} - -static FetchStmt * -_copyFetchStmt(const FetchStmt *from) -{ - FetchStmt *newnode = makeNode(FetchStmt); - - COPY_SCALAR_FIELD(direction); - COPY_SCALAR_FIELD(howMany); - COPY_STRING_FIELD(portalname); - COPY_SCALAR_FIELD(ismove); - - return newnode; -} - -static IndexStmt * -_copyIndexStmt(const IndexStmt *from) -{ - IndexStmt *newnode = makeNode(IndexStmt); - - COPY_STRING_FIELD(idxname); - COPY_NODE_FIELD(relation); - COPY_SCALAR_FIELD(relationOid); - COPY_STRING_FIELD(accessMethod); - COPY_STRING_FIELD(tableSpace); - COPY_NODE_FIELD(indexParams); - COPY_NODE_FIELD(indexIncludingParams); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(excludeOpNames); - COPY_STRING_FIELD(idxcomment); - COPY_SCALAR_FIELD(indexOid); - COPY_SCALAR_FIELD(oldNumber); - COPY_SCALAR_FIELD(oldCreateSubid); - COPY_SCALAR_FIELD(oldFirstRelfilelocatorSubid); - COPY_SCALAR_FIELD(unique); - COPY_SCALAR_FIELD(nulls_not_distinct); - COPY_SCALAR_FIELD(primary); - COPY_SCALAR_FIELD(isconstraint); - COPY_SCALAR_FIELD(deferrable); - COPY_SCALAR_FIELD(initdeferred); - COPY_SCALAR_FIELD(transformed); - COPY_SCALAR_FIELD(concurrent); - COPY_SCALAR_FIELD(if_not_exists); - COPY_SCALAR_FIELD(reset_default_tblspc); - COPY_SCALAR_FIELD(concurrentlyPhase); - COPY_SCALAR_FIELD(indexRelationOid); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static CreateStatsStmt * -_copyCreateStatsStmt(const CreateStatsStmt *from) -{ - CreateStatsStmt *newnode = makeNode(CreateStatsStmt); - - COPY_NODE_FIELD(defnames); - COPY_NODE_FIELD(stat_types); - COPY_NODE_FIELD(exprs); - COPY_NODE_FIELD(relations); - COPY_STRING_FIELD(stxcomment); - COPY_SCALAR_FIELD(transformed); - COPY_SCALAR_FIELD(if_not_exists); - - return newnode; -} - -static StatsElem * -_copyStatsElem(const StatsElem *from) -{ - StatsElem *newnode = makeNode(StatsElem); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(expr); - - return newnode; -} - -static AlterStatsStmt * -_copyAlterStatsStmt(const AlterStatsStmt *from) -{ - AlterStatsStmt *newnode = makeNode(AlterStatsStmt); - - COPY_NODE_FIELD(defnames); - COPY_SCALAR_FIELD(stxstattarget); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static CreateFunctionStmt * -_copyCreateFunctionStmt(const CreateFunctionStmt *from) -{ - CreateFunctionStmt *newnode = makeNode(CreateFunctionStmt); - - COPY_SCALAR_FIELD(is_procedure); - COPY_SCALAR_FIELD(replace); - COPY_NODE_FIELD(funcname); - COPY_NODE_FIELD(parameters); - COPY_NODE_FIELD(returnType); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(sql_body); - - return newnode; -} - -static FunctionParameter * -_copyFunctionParameter(const FunctionParameter *from) -{ - FunctionParameter *newnode = makeNode(FunctionParameter); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(argType); - COPY_SCALAR_FIELD(mode); - COPY_NODE_FIELD(defexpr); - - return newnode; -} - -static AlterFunctionStmt * -_copyAlterFunctionStmt(const AlterFunctionStmt *from) -{ - AlterFunctionStmt *newnode = makeNode(AlterFunctionStmt); - - COPY_SCALAR_FIELD(objtype); - COPY_NODE_FIELD(func); - COPY_NODE_FIELD(actions); - - return newnode; -} - -static DoStmt * -_copyDoStmt(const DoStmt *from) -{ - DoStmt *newnode = makeNode(DoStmt); - - COPY_NODE_FIELD(args); - - return newnode; -} - -static CallStmt * -_copyCallStmt(const CallStmt *from) -{ - CallStmt *newnode = makeNode(CallStmt); - - COPY_NODE_FIELD(funccall); - COPY_NODE_FIELD(funcexpr); - COPY_NODE_FIELD(outargs); - - return newnode; -} - -static RenameStmt * -_copyRenameStmt(const RenameStmt *from) -{ - RenameStmt *newnode = makeNode(RenameStmt); - - COPY_SCALAR_FIELD(renameType); - COPY_SCALAR_FIELD(relationType); - COPY_NODE_FIELD(relation); - COPY_SCALAR_FIELD(objid); - COPY_NODE_FIELD(object); - COPY_STRING_FIELD(subname); - COPY_STRING_FIELD(newname); - COPY_SCALAR_FIELD(behavior); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static AlterObjectDependsStmt * -_copyAlterObjectDependsStmt(const AlterObjectDependsStmt *from) -{ - AlterObjectDependsStmt *newnode = makeNode(AlterObjectDependsStmt); - - COPY_SCALAR_FIELD(objectType); - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(object); - COPY_NODE_FIELD(extname); - COPY_SCALAR_FIELD(remove); - - return newnode; -} - -static AlterObjectSchemaStmt * -_copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from) -{ - AlterObjectSchemaStmt *newnode = makeNode(AlterObjectSchemaStmt); - - COPY_SCALAR_FIELD(objectType); - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(object); - COPY_STRING_FIELD(newschema); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static AlterOwnerStmt * -_copyAlterOwnerStmt(const AlterOwnerStmt *from) -{ - AlterOwnerStmt *newnode = makeNode(AlterOwnerStmt); - - COPY_SCALAR_FIELD(objectType); - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(object); - COPY_NODE_FIELD(newowner); - - return newnode; -} - -static AlterOperatorStmt * -_copyAlterOperatorStmt(const AlterOperatorStmt *from) -{ - AlterOperatorStmt *newnode = makeNode(AlterOperatorStmt); - - COPY_NODE_FIELD(opername); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterTypeStmt * -_copyAlterTypeStmt(const AlterTypeStmt *from) -{ - AlterTypeStmt *newnode = makeNode(AlterTypeStmt); - - COPY_NODE_FIELD(typeName); - COPY_NODE_FIELD(options); - - return newnode; -} - -static RuleStmt * -_copyRuleStmt(const RuleStmt *from) -{ - RuleStmt *newnode = makeNode(RuleStmt); - - COPY_NODE_FIELD(relation); - COPY_STRING_FIELD(rulename); - COPY_NODE_FIELD(whereClause); - COPY_SCALAR_FIELD(event); - COPY_SCALAR_FIELD(instead); - COPY_NODE_FIELD(actions); - COPY_SCALAR_FIELD(replace); - - return newnode; -} - -static NotifyStmt * -_copyNotifyStmt(const NotifyStmt *from) -{ - NotifyStmt *newnode = makeNode(NotifyStmt); - - COPY_STRING_FIELD(conditionname); - COPY_STRING_FIELD(payload); - - return newnode; -} - -static ListenStmt * -_copyListenStmt(const ListenStmt *from) -{ - ListenStmt *newnode = makeNode(ListenStmt); - - COPY_STRING_FIELD(conditionname); - - return newnode; -} - -static UnlistenStmt * -_copyUnlistenStmt(const UnlistenStmt *from) -{ - UnlistenStmt *newnode = makeNode(UnlistenStmt); - - COPY_STRING_FIELD(conditionname); - - return newnode; -} - -static TransactionStmt * -_copyTransactionStmt(const TransactionStmt *from) -{ - TransactionStmt *newnode = makeNode(TransactionStmt); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(options); - COPY_STRING_FIELD(savepoint_name); - COPY_STRING_FIELD(gid); - COPY_SCALAR_FIELD(chain); - - return newnode; -} - -static CompositeTypeStmt * -_copyCompositeTypeStmt(const CompositeTypeStmt *from) -{ - CompositeTypeStmt *newnode = makeNode(CompositeTypeStmt); - - COPY_NODE_FIELD(typevar); - COPY_NODE_FIELD(coldeflist); - - return newnode; -} - -static CreateEnumStmt * -_copyCreateEnumStmt(const CreateEnumStmt *from) -{ - CreateEnumStmt *newnode = makeNode(CreateEnumStmt); - - COPY_NODE_FIELD(typeName); - COPY_NODE_FIELD(vals); - - return newnode; -} - -static CreateRangeStmt * -_copyCreateRangeStmt(const CreateRangeStmt *from) -{ - CreateRangeStmt *newnode = makeNode(CreateRangeStmt); - - COPY_NODE_FIELD(typeName); - COPY_NODE_FIELD(params); - - return newnode; -} - -static AlterEnumStmt * -_copyAlterEnumStmt(const AlterEnumStmt *from) -{ - AlterEnumStmt *newnode = makeNode(AlterEnumStmt); - - COPY_NODE_FIELD(typeName); - COPY_STRING_FIELD(oldVal); - COPY_STRING_FIELD(newVal); - COPY_STRING_FIELD(newValNeighbor); - COPY_SCALAR_FIELD(newValIsAfter); - COPY_SCALAR_FIELD(skipIfNewValExists); - - return newnode; -} - -static ViewStmt * -_copyViewStmt(const ViewStmt *from) -{ - ViewStmt *newnode = makeNode(ViewStmt); - - COPY_NODE_FIELD(view); - COPY_NODE_FIELD(aliases); - COPY_NODE_FIELD(query); - COPY_SCALAR_FIELD(replace); - COPY_NODE_FIELD(options); - COPY_SCALAR_FIELD(withCheckOption); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static LoadStmt * -_copyLoadStmt(const LoadStmt *from) -{ - LoadStmt *newnode = makeNode(LoadStmt); - - COPY_STRING_FIELD(filename); - - return newnode; -} - -static CreatedbStmt * -_copyCreatedbStmt(const CreatedbStmt *from) -{ - CreatedbStmt *newnode = makeNode(CreatedbStmt); - - COPY_STRING_FIELD(dbname); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static AlterDatabaseStmt * -_copyAlterDatabaseStmt(const AlterDatabaseStmt *from) -{ - AlterDatabaseStmt *newnode = makeNode(AlterDatabaseStmt); - - COPY_STRING_FIELD(dbname); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tags); - COPY_SCALAR_FIELD(unsettag); - - return newnode; -} - -static AlterDatabaseRefreshCollStmt * -_copyAlterDatabaseRefreshCollStmt(const AlterDatabaseRefreshCollStmt *from) -{ - AlterDatabaseRefreshCollStmt *newnode = makeNode(AlterDatabaseRefreshCollStmt); - - COPY_STRING_FIELD(dbname); - - return newnode; -} - -static AlterDatabaseSetStmt * -_copyAlterDatabaseSetStmt(const AlterDatabaseSetStmt *from) -{ - AlterDatabaseSetStmt *newnode = makeNode(AlterDatabaseSetStmt); - - COPY_STRING_FIELD(dbname); - COPY_NODE_FIELD(setstmt); - - return newnode; -} - -static DropdbStmt * -_copyDropdbStmt(const DropdbStmt *from) -{ - DropdbStmt *newnode = makeNode(DropdbStmt); - - COPY_STRING_FIELD(dbname); - COPY_SCALAR_FIELD(missing_ok); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterSystemStmt * -_copyAlterSystemStmt(const AlterSystemStmt *from) -{ - AlterSystemStmt *newnode = makeNode(AlterSystemStmt); - - COPY_NODE_FIELD(setstmt); - - return newnode; -} - -static ClusterStmt * -_copyClusterStmt(const ClusterStmt *from) -{ - ClusterStmt *newnode = makeNode(ClusterStmt); - - COPY_NODE_FIELD(relation); - COPY_STRING_FIELD(indexname); - COPY_NODE_FIELD(params); - - return newnode; -} - -static VacuumStmt * -_copyVacuumStmt(const VacuumStmt *from) -{ - VacuumStmt *newnode = makeNode(VacuumStmt); - - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(rels); - COPY_SCALAR_FIELD(is_vacuumcmd); - - return newnode; -} - -static VacuumRelation * -_copyVacuumRelation(const VacuumRelation *from) -{ - VacuumRelation *newnode = makeNode(VacuumRelation); - - COPY_NODE_FIELD(relation); - COPY_SCALAR_FIELD(oid); - COPY_NODE_FIELD(va_cols); - - return newnode; -} - -static ExplainStmt * -_copyExplainStmt(const ExplainStmt *from) -{ - ExplainStmt *newnode = makeNode(ExplainStmt); - - COPY_NODE_FIELD(query); - COPY_NODE_FIELD(options); - - return newnode; -} - -static CreateTableAsStmt * -_copyCreateTableAsStmt(const CreateTableAsStmt *from) -{ - CreateTableAsStmt *newnode = makeNode(CreateTableAsStmt); - - COPY_NODE_FIELD(query); - COPY_NODE_FIELD(into); - COPY_SCALAR_FIELD(objtype); - COPY_SCALAR_FIELD(is_select_into); - COPY_SCALAR_FIELD(if_not_exists); - - return newnode; -} - -static RefreshMatViewStmt * -_copyRefreshMatViewStmt(const RefreshMatViewStmt *from) -{ - RefreshMatViewStmt *newnode = makeNode(RefreshMatViewStmt); - - COPY_SCALAR_FIELD(concurrent); - COPY_SCALAR_FIELD(skipData); - COPY_NODE_FIELD(relation); - COPY_SCALAR_FIELD(isdynamic); - - return newnode; -} - -static CheckPointStmt * -_copyCheckPointStmt(const CheckPointStmt *from) -{ - CheckPointStmt *newnode = makeNode(CheckPointStmt); - - - return newnode; -} - -static DiscardStmt * -_copyDiscardStmt(const DiscardStmt *from) -{ - DiscardStmt *newnode = makeNode(DiscardStmt); - - COPY_SCALAR_FIELD(target); - - return newnode; -} - -static LockStmt * -_copyLockStmt(const LockStmt *from) -{ - LockStmt *newnode = makeNode(LockStmt); - - COPY_NODE_FIELD(relations); - COPY_SCALAR_FIELD(mode); - COPY_SCALAR_FIELD(nowait); - - return newnode; -} - -static ConstraintsSetStmt * -_copyConstraintsSetStmt(const ConstraintsSetStmt *from) -{ - ConstraintsSetStmt *newnode = makeNode(ConstraintsSetStmt); - - COPY_NODE_FIELD(constraints); - COPY_SCALAR_FIELD(deferred); - - return newnode; -} - -static ReindexIndexInfo * -_copyReindexIndexInfo(const ReindexIndexInfo *from) -{ - ReindexIndexInfo *newnode = makeNode(ReindexIndexInfo); - - COPY_SCALAR_FIELD(indexId); - COPY_SCALAR_FIELD(tableId); - COPY_SCALAR_FIELD(amId); - COPY_SCALAR_FIELD(safe); - COPY_STRING_FIELD(ccNewName); - COPY_STRING_FIELD(ccOldName); - - return newnode; -} - -static ReindexStmt * -_copyReindexStmt(const ReindexStmt *from) -{ - ReindexStmt *newnode = makeNode(ReindexStmt); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(relation); - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(params); - COPY_SCALAR_FIELD(relid); - COPY_SCALAR_FIELD(concurrentlyPhase); - COPY_NODE_FIELD(newIndexInfo); - COPY_NODE_FIELD(oldIndexInfo); - - return newnode; -} - -static CreateConversionStmt * -_copyCreateConversionStmt(const CreateConversionStmt *from) -{ - CreateConversionStmt *newnode = makeNode(CreateConversionStmt); - - COPY_NODE_FIELD(conversion_name); - COPY_STRING_FIELD(for_encoding_name); - COPY_STRING_FIELD(to_encoding_name); - COPY_NODE_FIELD(func_name); - COPY_SCALAR_FIELD(def); - - return newnode; -} - -static CreateCastStmt * -_copyCreateCastStmt(const CreateCastStmt *from) -{ - CreateCastStmt *newnode = makeNode(CreateCastStmt); - - COPY_NODE_FIELD(sourcetype); - COPY_NODE_FIELD(targettype); - COPY_NODE_FIELD(func); - COPY_SCALAR_FIELD(context); - COPY_SCALAR_FIELD(inout); - - return newnode; -} - -static CreateTransformStmt * -_copyCreateTransformStmt(const CreateTransformStmt *from) -{ - CreateTransformStmt *newnode = makeNode(CreateTransformStmt); - - COPY_SCALAR_FIELD(replace); - COPY_NODE_FIELD(type_name); - COPY_STRING_FIELD(lang); - COPY_NODE_FIELD(fromsql); - COPY_NODE_FIELD(tosql); - - return newnode; -} - -static PrepareStmt * -_copyPrepareStmt(const PrepareStmt *from) -{ - PrepareStmt *newnode = makeNode(PrepareStmt); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(argtypes); - COPY_NODE_FIELD(query); - - return newnode; -} - -static ExecuteStmt * -_copyExecuteStmt(const ExecuteStmt *from) -{ - ExecuteStmt *newnode = makeNode(ExecuteStmt); - - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(params); - - return newnode; -} - -static DeallocateStmt * -_copyDeallocateStmt(const DeallocateStmt *from) -{ - DeallocateStmt *newnode = makeNode(DeallocateStmt); - - COPY_STRING_FIELD(name); - - return newnode; -} - -static DropOwnedStmt * -_copyDropOwnedStmt(const DropOwnedStmt *from) -{ - DropOwnedStmt *newnode = makeNode(DropOwnedStmt); - - COPY_NODE_FIELD(roles); - COPY_SCALAR_FIELD(behavior); - - return newnode; -} - -static ReassignOwnedStmt * -_copyReassignOwnedStmt(const ReassignOwnedStmt *from) -{ - ReassignOwnedStmt *newnode = makeNode(ReassignOwnedStmt); - - COPY_NODE_FIELD(roles); - COPY_NODE_FIELD(newrole); - - return newnode; -} - -static AlterTSDictionaryStmt * -_copyAlterTSDictionaryStmt(const AlterTSDictionaryStmt *from) -{ - AlterTSDictionaryStmt *newnode = makeNode(AlterTSDictionaryStmt); - - COPY_NODE_FIELD(dictname); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterTSConfigurationStmt * -_copyAlterTSConfigurationStmt(const AlterTSConfigurationStmt *from) -{ - AlterTSConfigurationStmt *newnode = makeNode(AlterTSConfigurationStmt); - - COPY_SCALAR_FIELD(kind); - COPY_NODE_FIELD(cfgname); - COPY_NODE_FIELD(tokentype); - COPY_NODE_FIELD(dicts); - COPY_SCALAR_FIELD(override); - COPY_SCALAR_FIELD(replace); - COPY_SCALAR_FIELD(missing_ok); - - return newnode; -} - -static PublicationTable * -_copyPublicationTable(const PublicationTable *from) -{ - PublicationTable *newnode = makeNode(PublicationTable); - - COPY_NODE_FIELD(relation); - COPY_NODE_FIELD(whereClause); - COPY_NODE_FIELD(columns); - - return newnode; -} - -static PublicationObjSpec * -_copyPublicationObjSpec(const PublicationObjSpec *from) -{ - PublicationObjSpec *newnode = makeNode(PublicationObjSpec); - - COPY_SCALAR_FIELD(pubobjtype); - COPY_STRING_FIELD(name); - COPY_NODE_FIELD(pubtable); - COPY_LOCATION_FIELD(location); - - return newnode; -} - -static CreatePublicationStmt * -_copyCreatePublicationStmt(const CreatePublicationStmt *from) -{ - CreatePublicationStmt *newnode = makeNode(CreatePublicationStmt); - - COPY_STRING_FIELD(pubname); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(pubobjects); - COPY_SCALAR_FIELD(for_all_tables); - - return newnode; -} - -static AlterPublicationStmt * -_copyAlterPublicationStmt(const AlterPublicationStmt *from) -{ - AlterPublicationStmt *newnode = makeNode(AlterPublicationStmt); - - COPY_STRING_FIELD(pubname); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(pubobjects); - COPY_SCALAR_FIELD(for_all_tables); - COPY_SCALAR_FIELD(action); - - return newnode; -} - -static CreateSubscriptionStmt * -_copyCreateSubscriptionStmt(const CreateSubscriptionStmt *from) -{ - CreateSubscriptionStmt *newnode = makeNode(CreateSubscriptionStmt); - - COPY_STRING_FIELD(subname); - COPY_STRING_FIELD(conninfo); - COPY_NODE_FIELD(publication); - COPY_NODE_FIELD(options); - - return newnode; -} - -static AlterSubscriptionStmt * -_copyAlterSubscriptionStmt(const AlterSubscriptionStmt *from) -{ - AlterSubscriptionStmt *newnode = makeNode(AlterSubscriptionStmt); - - COPY_SCALAR_FIELD(kind); - COPY_STRING_FIELD(subname); - COPY_STRING_FIELD(conninfo); - COPY_NODE_FIELD(publication); - COPY_NODE_FIELD(options); - - return newnode; -} - -static DropSubscriptionStmt * -_copyDropSubscriptionStmt(const DropSubscriptionStmt *from) -{ - DropSubscriptionStmt *newnode = makeNode(DropSubscriptionStmt); - - COPY_STRING_FIELD(subname); - COPY_SCALAR_FIELD(missing_ok); - COPY_SCALAR_FIELD(behavior); - - return newnode; -} - -static RetrieveStmt * -_copyRetrieveStmt(const RetrieveStmt *from) -{ - RetrieveStmt *newnode = makeNode(RetrieveStmt); - - COPY_STRING_FIELD(endpoint_name); - COPY_SCALAR_FIELD(count); - COPY_SCALAR_FIELD(is_all); - - return newnode; -} - -static CreateWarehouseStmt * -_copyCreateWarehouseStmt(const CreateWarehouseStmt *from) -{ - CreateWarehouseStmt *newnode = makeNode(CreateWarehouseStmt); - - COPY_STRING_FIELD(whname); - COPY_NODE_FIELD(options); - COPY_NODE_FIELD(tags); - - return newnode; -} - -static DropWarehouseStmt * -_copyDropWarehouseStmt(const DropWarehouseStmt *from) -{ - DropWarehouseStmt *newnode = makeNode(DropWarehouseStmt); - - COPY_STRING_FIELD(whname); - - return newnode; -} - -static PathKey * -_copyPathKey(const PathKey *from) -{ - PathKey *newnode = makeNode(PathKey); - - COPY_SCALAR_FIELD(pk_eclass); - COPY_SCALAR_FIELD(pk_opfamily); - COPY_SCALAR_FIELD(pk_strategy); - COPY_SCALAR_FIELD(pk_nulls_first); - - return newnode; -} - -static DistributionKey * -_copyDistributionKey(const DistributionKey *from) -{ - DistributionKey *newnode = makeNode(DistributionKey); - - COPY_NODE_FIELD(dk_eclasses); - COPY_SCALAR_FIELD(dk_opfamily); - - return newnode; -} - -static RestrictInfo * -_copyRestrictInfo(const RestrictInfo *from) -{ - RestrictInfo *newnode = makeNode(RestrictInfo); - - COPY_NODE_FIELD(clause); - COPY_SCALAR_FIELD(is_pushed_down); - COPY_SCALAR_FIELD(can_join); - COPY_SCALAR_FIELD(pseudoconstant); - COPY_SCALAR_FIELD(has_clone); - COPY_SCALAR_FIELD(is_clone); - COPY_SCALAR_FIELD(leakproof); - COPY_SCALAR_FIELD(has_volatile); - COPY_SCALAR_FIELD(security_level); - COPY_SCALAR_FIELD(contain_outer_query_references); - COPY_SCALAR_FIELD(num_base_rels); - COPY_BITMAPSET_FIELD(clause_relids); - COPY_BITMAPSET_FIELD(required_relids); - COPY_BITMAPSET_FIELD(incompatible_relids); - COPY_BITMAPSET_FIELD(outer_relids); - COPY_BITMAPSET_FIELD(left_relids); - COPY_BITMAPSET_FIELD(right_relids); - COPY_NODE_FIELD(orclause); - COPY_SCALAR_FIELD(rinfo_serial); - COPY_SCALAR_FIELD(parent_ec); - COPY_SCALAR_FIELD(eval_cost); - COPY_SCALAR_FIELD(norm_selec); - COPY_SCALAR_FIELD(outer_selec); - COPY_NODE_FIELD(mergeopfamilies); - COPY_SCALAR_FIELD(left_ec); - COPY_SCALAR_FIELD(right_ec); - COPY_SCALAR_FIELD(left_em); - COPY_SCALAR_FIELD(right_em); - COPY_SCALAR_FIELD(hasheqoperator); - newnode->scansel_cache = NIL; - COPY_SCALAR_FIELD(outer_is_left); - COPY_SCALAR_FIELD(hashjoinoperator); - COPY_SCALAR_FIELD(left_bucketsize); - COPY_SCALAR_FIELD(right_bucketsize); - COPY_SCALAR_FIELD(left_mcvfreq); - COPY_SCALAR_FIELD(right_mcvfreq); - COPY_SCALAR_FIELD(left_hasheqoperator); - COPY_SCALAR_FIELD(right_hasheqoperator); - - return newnode; -} - -static PlaceHolderVar * -_copyPlaceHolderVar(const PlaceHolderVar *from) -{ - PlaceHolderVar *newnode = makeNode(PlaceHolderVar); - - COPY_NODE_FIELD(phexpr); - COPY_BITMAPSET_FIELD(phrels); - COPY_BITMAPSET_FIELD(phnullingrels); - COPY_SCALAR_FIELD(phid); - COPY_SCALAR_FIELD(phlevelsup); - - return newnode; -} - -static SpecialJoinInfo * -_copySpecialJoinInfo(const SpecialJoinInfo *from) -{ - SpecialJoinInfo *newnode = makeNode(SpecialJoinInfo); - - COPY_BITMAPSET_FIELD(min_lefthand); - COPY_BITMAPSET_FIELD(min_righthand); - COPY_BITMAPSET_FIELD(syn_lefthand); - COPY_BITMAPSET_FIELD(syn_righthand); - COPY_SCALAR_FIELD(jointype); - COPY_SCALAR_FIELD(ojrelid); - COPY_BITMAPSET_FIELD(commute_above_l); - COPY_BITMAPSET_FIELD(commute_above_r); - COPY_BITMAPSET_FIELD(commute_below_l); - COPY_BITMAPSET_FIELD(commute_below_r); - COPY_SCALAR_FIELD(lhs_strict); - COPY_SCALAR_FIELD(semi_can_btree); - COPY_SCALAR_FIELD(semi_can_hash); - COPY_NODE_FIELD(semi_operators); - COPY_NODE_FIELD(semi_rhs_exprs); - - return newnode; -} - -static AppendRelInfo * -_copyAppendRelInfo(const AppendRelInfo *from) -{ - AppendRelInfo *newnode = makeNode(AppendRelInfo); - - COPY_SCALAR_FIELD(parent_relid); - COPY_SCALAR_FIELD(child_relid); - COPY_SCALAR_FIELD(parent_reltype); - COPY_SCALAR_FIELD(child_reltype); - COPY_NODE_FIELD(translated_vars); - COPY_SCALAR_FIELD(num_child_cols); - COPY_POINTER_FIELD(parent_colnos, from->num_child_cols * sizeof(AttrNumber)); - COPY_SCALAR_FIELD(parent_reloid); - - return newnode; -} - -static PlaceHolderInfo * -_copyPlaceHolderInfo(const PlaceHolderInfo *from) -{ - PlaceHolderInfo *newnode = makeNode(PlaceHolderInfo); - - COPY_SCALAR_FIELD(phid); - COPY_NODE_FIELD(ph_var); - COPY_BITMAPSET_FIELD(ph_eval_at); - COPY_BITMAPSET_FIELD(ph_lateral); - COPY_BITMAPSET_FIELD(ph_needed); - COPY_SCALAR_FIELD(ph_width); - - return newnode; -} - -static GroupedVarInfo * -_copyGroupedVarInfo(const GroupedVarInfo *from) -{ - GroupedVarInfo *newnode = makeNode(GroupedVarInfo); - - COPY_NODE_FIELD(gvexpr); - COPY_NODE_FIELD(agg_partial); - COPY_SCALAR_FIELD(sortgroupref); - COPY_BITMAPSET_FIELD(gv_eval_at); - - return newnode; -} - -static SegfileMapNode * -_copySegfileMapNode(const SegfileMapNode *from) -{ - SegfileMapNode *newnode = makeNode(SegfileMapNode); - - COPY_SCALAR_FIELD(relid); - COPY_SCALAR_FIELD(segno); - - return newnode; -} - -static PlannedStmt * -_copyPlannedStmt(const PlannedStmt *from) -{ - PlannedStmt *newnode = makeNode(PlannedStmt); - - COPY_SCALAR_FIELD(commandType); - COPY_SCALAR_FIELD(planGen); - COPY_SCALAR_FIELD(queryId); - COPY_SCALAR_FIELD(hasReturning); - COPY_SCALAR_FIELD(hasModifyingCTE); - COPY_SCALAR_FIELD(canSetTag); - COPY_SCALAR_FIELD(transientPlan); - COPY_SCALAR_FIELD(oneoffPlan); - COPY_SCALAR_FIELD(simplyUpdatableRel); - COPY_SCALAR_FIELD(dependsOnRole); - COPY_SCALAR_FIELD(parallelModeNeeded); - COPY_SCALAR_FIELD(jitFlags); - COPY_NODE_FIELD(planTree); - COPY_SCALAR_FIELD(numSlices); - newnode->slices = palloc(from->numSlices * sizeof(PlanSlice)); - for (int i = 0; i < from->numSlices; i++) - { - COPY_SCALAR_FIELD(slices[i].sliceIndex); - COPY_SCALAR_FIELD(slices[i].parentIndex); - COPY_SCALAR_FIELD(slices[i].gangType); - COPY_SCALAR_FIELD(slices[i].numsegments); - COPY_SCALAR_FIELD(slices[i].parallel_workers); - COPY_SCALAR_FIELD(slices[i].segindex); - COPY_SCALAR_FIELD(slices[i].directDispatch.isDirectDispatch); - COPY_NODE_FIELD(slices[i].directDispatch.contentIds); - } - COPY_NODE_FIELD(rtable); - COPY_NODE_FIELD(permInfos); - COPY_NODE_FIELD(resultRelations); - COPY_NODE_FIELD(appendRelations); - COPY_NODE_FIELD(subplans); - COPY_POINTER_FIELD(subplan_sliceIds, list_length(from->subplans) * sizeof(int)); - COPY_BITMAPSET_FIELD(rewindPlanIDs); - COPY_NODE_FIELD(rowMarks); - COPY_NODE_FIELD(relationOids); - COPY_NODE_FIELD(invalItems); - COPY_NODE_FIELD(paramExecTypes); - COPY_NODE_FIELD(utilityStmt); - COPY_LOCATION_FIELD(stmt_location); - COPY_SCALAR_FIELD(stmt_len); - COPY_NODE_FIELD(intoPolicy); - COPY_SCALAR_FIELD(query_mem); - COPY_NODE_FIELD(intoClause); - COPY_NODE_FIELD(copyIntoClause); - COPY_NODE_FIELD(refreshClause); - COPY_SCALAR_FIELD(metricsQueryType); - COPY_NODE_FIELD(extensionContext); - - return newnode; -} - -static Flow * -_copyFlow(const Flow *from) -{ - Flow *newnode = makeNode(Flow); - - COPY_SCALAR_FIELD(flotype); - COPY_SCALAR_FIELD(locustype); - COPY_SCALAR_FIELD(segindex); - COPY_SCALAR_FIELD(numsegments); - - return newnode; -} - -static Result * -_copyResult(const Result *from) -{ - Result *newnode = makeNode(Result); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(resconstantqual); - COPY_SCALAR_FIELD(numHashFilterCols); - COPY_POINTER_FIELD(hashFilterColIdx, from->numHashFilterCols * sizeof(int16)); - COPY_POINTER_FIELD(hashFilterFuncs, from->numHashFilterCols * sizeof(Oid)); - - return newnode; -} - -static ProjectSet * -_copyProjectSet(const ProjectSet *from) -{ - ProjectSet *newnode = makeNode(ProjectSet); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - - return newnode; -} - -static ModifyTable * -_copyModifyTable(const ModifyTable *from) -{ - ModifyTable *newnode = makeNode(ModifyTable); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(operation); - COPY_SCALAR_FIELD(canSetTag); - COPY_SCALAR_FIELD(nominalRelation); - COPY_SCALAR_FIELD(rootRelation); - COPY_SCALAR_FIELD(partColsUpdated); - COPY_SCALAR_FIELD(splitUpdate); - COPY_NODE_FIELD(resultRelations); - COPY_NODE_FIELD(updateColnosLists); - COPY_NODE_FIELD(withCheckOptionLists); - COPY_NODE_FIELD(returningLists); - COPY_NODE_FIELD(fdwPrivLists); - COPY_BITMAPSET_FIELD(fdwDirectModifyPlans); - COPY_NODE_FIELD(rowMarks); - COPY_SCALAR_FIELD(epqParam); - COPY_SCALAR_FIELD(onConflictAction); - COPY_NODE_FIELD(arbiterIndexes); - COPY_NODE_FIELD(onConflictSet); - COPY_NODE_FIELD(onConflictCols); - COPY_NODE_FIELD(onConflictWhere); - COPY_SCALAR_FIELD(exclRelRTI); - COPY_NODE_FIELD(exclRelTlist); - COPY_SCALAR_FIELD(forceTupleRouting); - COPY_NODE_FIELD(mergeActionLists); - - return newnode; -} - -static Append * -_copyAppend(const Append *from) -{ - Append *newnode = makeNode(Append); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_BITMAPSET_FIELD(apprelids); - COPY_NODE_FIELD(appendplans); - COPY_SCALAR_FIELD(nasyncplans); - COPY_SCALAR_FIELD(first_partial_plan); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static MergeAppend * -_copyMergeAppend(const MergeAppend *from) -{ - MergeAppend *newnode = makeNode(MergeAppend); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_BITMAPSET_FIELD(apprelids); - COPY_NODE_FIELD(mergeplans); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool)); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static Sequence * -_copySequence(const Sequence *from) -{ - Sequence *newnode = makeNode(Sequence); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(subplans); - - return newnode; -} - -static RecursiveUnion * -_copyRecursiveUnion(const RecursiveUnion *from) -{ - RecursiveUnion *newnode = makeNode(RecursiveUnion); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(wtParam); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(dupOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(dupCollations, from->numCols * sizeof(Oid)); - COPY_SCALAR_FIELD(numGroups); - - return newnode; -} - -static BitmapAnd * -_copyBitmapAnd(const BitmapAnd *from) -{ - BitmapAnd *newnode = makeNode(BitmapAnd); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(bitmapplans); - - return newnode; -} - -static BitmapOr * -_copyBitmapOr(const BitmapOr *from) -{ - BitmapOr *newnode = makeNode(BitmapOr); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(isshared); - COPY_NODE_FIELD(bitmapplans); - - return newnode; -} - -static SeqScan * -_copySeqScan(const SeqScan *from) -{ - SeqScan *newnode = makeNode(SeqScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - - return newnode; -} - -static SampleScan * -_copySampleScan(const SampleScan *from) -{ - SampleScan *newnode = makeNode(SampleScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(tablesample); - - return newnode; -} - -static IndexScan * -_copyIndexScan(const IndexScan *from) -{ - IndexScan *newnode = makeNode(IndexScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(indexid); - COPY_NODE_FIELD(indexqual); - COPY_NODE_FIELD(indexqualorig); - COPY_NODE_FIELD(indexorderby); - COPY_NODE_FIELD(indexorderbyorig); - COPY_NODE_FIELD(indexorderbyops); - COPY_SCALAR_FIELD(indexorderdir); - - return newnode; -} - -static DynamicIndexScan * -_copyDynamicIndexScan(const DynamicIndexScan *from) -{ - DynamicIndexScan *newnode = makeNode(DynamicIndexScan); - - COPY_SCALAR_FIELD(indexscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(indexscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(indexscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(indexscan.scan.plan.targetlist); - COPY_NODE_FIELD(indexscan.scan.plan.qual); - COPY_NODE_FIELD(indexscan.scan.plan.lefttree); - COPY_NODE_FIELD(indexscan.scan.plan.righttree); - COPY_NODE_FIELD(indexscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(indexscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(indexscan.scan.plan.allParam); - COPY_NODE_FIELD(indexscan.scan.plan.flow); - COPY_SCALAR_FIELD(indexscan.scan.plan.locustype); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel); - COPY_SCALAR_FIELD(indexscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(indexscan.scan.scanrelid); - COPY_SCALAR_FIELD(indexscan.indexid); - COPY_NODE_FIELD(indexscan.indexqual); - COPY_NODE_FIELD(indexscan.indexqualorig); - COPY_NODE_FIELD(indexscan.indexorderby); - COPY_NODE_FIELD(indexscan.indexorderbyorig); - COPY_NODE_FIELD(indexscan.indexorderbyops); - COPY_SCALAR_FIELD(indexscan.indexorderdir); - COPY_NODE_FIELD(partOids); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static IndexOnlyScan * -_copyIndexOnlyScan(const IndexOnlyScan *from) -{ - IndexOnlyScan *newnode = makeNode(IndexOnlyScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(indexid); - COPY_NODE_FIELD(indexqual); - COPY_NODE_FIELD(indexqualorig); - COPY_NODE_FIELD(recheckqual); - COPY_NODE_FIELD(indexorderby); - COPY_NODE_FIELD(indextlist); - COPY_SCALAR_FIELD(indexorderdir); - - return newnode; -} - -static DynamicIndexOnlyScan * -_copyDynamicIndexOnlyScan(const DynamicIndexOnlyScan *from) -{ - DynamicIndexOnlyScan *newnode = makeNode(DynamicIndexOnlyScan); - - COPY_SCALAR_FIELD(indexscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(indexscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(indexscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(indexscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(indexscan.scan.plan.targetlist); - COPY_NODE_FIELD(indexscan.scan.plan.qual); - COPY_NODE_FIELD(indexscan.scan.plan.lefttree); - COPY_NODE_FIELD(indexscan.scan.plan.righttree); - COPY_NODE_FIELD(indexscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(indexscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(indexscan.scan.plan.allParam); - COPY_NODE_FIELD(indexscan.scan.plan.flow); - COPY_SCALAR_FIELD(indexscan.scan.plan.locustype); - COPY_SCALAR_FIELD(indexscan.scan.plan.parallel); - COPY_SCALAR_FIELD(indexscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(indexscan.scan.scanrelid); - COPY_SCALAR_FIELD(indexscan.indexid); - COPY_NODE_FIELD(indexscan.indexqual); - COPY_NODE_FIELD(indexscan.indexqualorig); - COPY_NODE_FIELD(indexscan.recheckqual); - COPY_NODE_FIELD(indexscan.indexorderby); - COPY_NODE_FIELD(indexscan.indextlist); - COPY_SCALAR_FIELD(indexscan.indexorderdir); - COPY_NODE_FIELD(partOids); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static BitmapIndexScan * -_copyBitmapIndexScan(const BitmapIndexScan *from) -{ - BitmapIndexScan *newnode = makeNode(BitmapIndexScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(indexid); - COPY_SCALAR_FIELD(isshared); - COPY_NODE_FIELD(indexqual); - COPY_NODE_FIELD(indexqualorig); - - return newnode; -} - -static DynamicBitmapIndexScan * -_copyDynamicBitmapIndexScan(const DynamicBitmapIndexScan *from) -{ - DynamicBitmapIndexScan *newnode = makeNode(DynamicBitmapIndexScan); - - COPY_SCALAR_FIELD(biscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(biscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(biscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(biscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(biscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(biscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(biscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(biscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(biscan.scan.plan.targetlist); - COPY_NODE_FIELD(biscan.scan.plan.qual); - COPY_NODE_FIELD(biscan.scan.plan.lefttree); - COPY_NODE_FIELD(biscan.scan.plan.righttree); - COPY_NODE_FIELD(biscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(biscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(biscan.scan.plan.allParam); - COPY_NODE_FIELD(biscan.scan.plan.flow); - COPY_SCALAR_FIELD(biscan.scan.plan.locustype); - COPY_SCALAR_FIELD(biscan.scan.plan.parallel); - COPY_SCALAR_FIELD(biscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(biscan.scan.scanrelid); - COPY_SCALAR_FIELD(biscan.indexid); - COPY_SCALAR_FIELD(biscan.isshared); - COPY_NODE_FIELD(biscan.indexqual); - COPY_NODE_FIELD(biscan.indexqualorig); - - return newnode; -} - -static BitmapHeapScan * -_copyBitmapHeapScan(const BitmapHeapScan *from) -{ - BitmapHeapScan *newnode = makeNode(BitmapHeapScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(bitmapqualorig); - - return newnode; -} - -static DynamicBitmapHeapScan * -_copyDynamicBitmapHeapScan(const DynamicBitmapHeapScan *from) -{ - DynamicBitmapHeapScan *newnode = makeNode(DynamicBitmapHeapScan); - - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.targetlist); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.qual); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.lefttree); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.righttree); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(bitmapheapscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(bitmapheapscan.scan.plan.allParam); - COPY_NODE_FIELD(bitmapheapscan.scan.plan.flow); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.locustype); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.parallel); - COPY_SCALAR_FIELD(bitmapheapscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(bitmapheapscan.scan.scanrelid); - COPY_NODE_FIELD(bitmapheapscan.bitmapqualorig); - COPY_NODE_FIELD(partOids); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static DynamicSeqScan * -_copyDynamicSeqScan(const DynamicSeqScan *from) -{ - DynamicSeqScan *newnode = makeNode(DynamicSeqScan); - - COPY_SCALAR_FIELD(seqscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(seqscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(seqscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(seqscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(seqscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(seqscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(seqscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(seqscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(seqscan.scan.plan.targetlist); - COPY_NODE_FIELD(seqscan.scan.plan.qual); - COPY_NODE_FIELD(seqscan.scan.plan.lefttree); - COPY_NODE_FIELD(seqscan.scan.plan.righttree); - COPY_NODE_FIELD(seqscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(seqscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(seqscan.scan.plan.allParam); - COPY_NODE_FIELD(seqscan.scan.plan.flow); - COPY_SCALAR_FIELD(seqscan.scan.plan.locustype); - COPY_SCALAR_FIELD(seqscan.scan.plan.parallel); - COPY_SCALAR_FIELD(seqscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(seqscan.scan.scanrelid); - COPY_NODE_FIELD(partOids); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - - return newnode; -} - -static TidScan * -_copyTidScan(const TidScan *from) -{ - TidScan *newnode = makeNode(TidScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(tidquals); - - return newnode; -} - -static TidRangeScan * -_copyTidRangeScan(const TidRangeScan *from) -{ - TidRangeScan *newnode = makeNode(TidRangeScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(tidrangequals); - - return newnode; -} - -static SubqueryScan * -_copySubqueryScan(const SubqueryScan *from) -{ - SubqueryScan *newnode = makeNode(SubqueryScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(subplan); - COPY_SCALAR_FIELD(scanstatus); - - return newnode; -} - -static FunctionScan * -_copyFunctionScan(const FunctionScan *from) -{ - FunctionScan *newnode = makeNode(FunctionScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(functions); - COPY_SCALAR_FIELD(funcordinality); - COPY_NODE_FIELD(param); - COPY_SCALAR_FIELD(resultInTupleStore); - COPY_SCALAR_FIELD(initplanId); - - return newnode; -} - -static TableFunctionScan * -_copyTableFunctionScan(const TableFunctionScan *from) -{ - TableFunctionScan *newnode = makeNode(TableFunctionScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(function); - - return newnode; -} - -static ValuesScan * -_copyValuesScan(const ValuesScan *from) -{ - ValuesScan *newnode = makeNode(ValuesScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(values_lists); - - return newnode; -} - -static TableFuncScan * -_copyTableFuncScan(const TableFuncScan *from) -{ - TableFuncScan *newnode = makeNode(TableFuncScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_NODE_FIELD(tablefunc); - - return newnode; -} - -static CteScan * -_copyCteScan(const CteScan *from) -{ - CteScan *newnode = makeNode(CteScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(ctePlanId); - COPY_SCALAR_FIELD(cteParam); - - return newnode; -} - -static NamedTuplestoreScan * -_copyNamedTuplestoreScan(const NamedTuplestoreScan *from) -{ - NamedTuplestoreScan *newnode = makeNode(NamedTuplestoreScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_STRING_FIELD(enrname); - - return newnode; -} - -static WorkTableScan * -_copyWorkTableScan(const WorkTableScan *from) -{ - WorkTableScan *newnode = makeNode(WorkTableScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(wtParam); - - return newnode; -} - -static ExternalScanInfo * -_copyExternalScanInfo(const ExternalScanInfo *from) -{ - ExternalScanInfo *newnode = makeNode(ExternalScanInfo); - - COPY_NODE_FIELD(uriList); - COPY_SCALAR_FIELD(fmtType); - COPY_SCALAR_FIELD(isMasterOnly); - COPY_SCALAR_FIELD(rejLimit); - COPY_SCALAR_FIELD(rejLimitInRows); - COPY_SCALAR_FIELD(logErrors); - COPY_SCALAR_FIELD(encoding); - COPY_SCALAR_FIELD(scancounter); - COPY_NODE_FIELD(extOptions); - - return newnode; -} - -static ForeignScan * -_copyForeignScan(const ForeignScan *from) -{ - ForeignScan *newnode = makeNode(ForeignScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(operation); - COPY_SCALAR_FIELD(resultRelation); - COPY_SCALAR_FIELD(checkAsUser); - COPY_SCALAR_FIELD(fs_server); - COPY_NODE_FIELD(fdw_exprs); - COPY_NODE_FIELD(fdw_private); - COPY_NODE_FIELD(fdw_scan_tlist); - COPY_NODE_FIELD(fdw_recheck_quals); - COPY_BITMAPSET_FIELD(fs_relids); - COPY_BITMAPSET_FIELD(fs_base_relids); - COPY_SCALAR_FIELD(fsSystemCol); - - return newnode; -} - -static DynamicForeignScan * -_copyDynamicForeignScan(const DynamicForeignScan *from) -{ - DynamicForeignScan *newnode = makeNode(DynamicForeignScan); - - COPY_SCALAR_FIELD(foreignscan.scan.plan.startup_cost); - COPY_SCALAR_FIELD(foreignscan.scan.plan.total_cost); - COPY_SCALAR_FIELD(foreignscan.scan.plan.plan_rows); - COPY_SCALAR_FIELD(foreignscan.scan.plan.plan_width); - COPY_SCALAR_FIELD(foreignscan.scan.plan.parallel_aware); - COPY_SCALAR_FIELD(foreignscan.scan.plan.parallel_safe); - COPY_SCALAR_FIELD(foreignscan.scan.plan.async_capable); - COPY_SCALAR_FIELD(foreignscan.scan.plan.plan_node_id); - COPY_NODE_FIELD(foreignscan.scan.plan.targetlist); - COPY_NODE_FIELD(foreignscan.scan.plan.qual); - COPY_NODE_FIELD(foreignscan.scan.plan.lefttree); - COPY_NODE_FIELD(foreignscan.scan.plan.righttree); - COPY_NODE_FIELD(foreignscan.scan.plan.initPlan); - COPY_BITMAPSET_FIELD(foreignscan.scan.plan.extParam); - COPY_BITMAPSET_FIELD(foreignscan.scan.plan.allParam); - COPY_NODE_FIELD(foreignscan.scan.plan.flow); - COPY_SCALAR_FIELD(foreignscan.scan.plan.locustype); - COPY_SCALAR_FIELD(foreignscan.scan.plan.parallel); - COPY_SCALAR_FIELD(foreignscan.scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(foreignscan.scan.scanrelid); - COPY_SCALAR_FIELD(foreignscan.operation); - COPY_SCALAR_FIELD(foreignscan.resultRelation); - COPY_SCALAR_FIELD(foreignscan.checkAsUser); - COPY_SCALAR_FIELD(foreignscan.fs_server); - COPY_NODE_FIELD(foreignscan.fdw_exprs); - COPY_NODE_FIELD(foreignscan.fdw_private); - COPY_NODE_FIELD(foreignscan.fdw_scan_tlist); - COPY_NODE_FIELD(foreignscan.fdw_recheck_quals); - COPY_BITMAPSET_FIELD(foreignscan.fs_relids); - COPY_BITMAPSET_FIELD(foreignscan.fs_base_relids); - COPY_SCALAR_FIELD(foreignscan.fsSystemCol); - COPY_NODE_FIELD(partOids); - COPY_NODE_FIELD(part_prune_info); - COPY_NODE_FIELD(join_prune_paramids); - COPY_NODE_FIELD(fdw_private_list); - - return newnode; -} - -static CustomScan * -_copyCustomScan(const CustomScan *from) -{ - CustomScan *newnode = makeNode(CustomScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(flags); - COPY_NODE_FIELD(custom_plans); - COPY_NODE_FIELD(custom_exprs); - COPY_NODE_FIELD(custom_private); - COPY_NODE_FIELD(custom_scan_tlist); - COPY_BITMAPSET_FIELD(custom_relids); - COPY_SCALAR_FIELD(methods); - - return newnode; -} - -static NestLoop * -_copyNestLoop(const NestLoop *from) -{ - NestLoop *newnode = makeNode(NestLoop); - - COPY_SCALAR_FIELD(join.plan.startup_cost); - COPY_SCALAR_FIELD(join.plan.total_cost); - COPY_SCALAR_FIELD(join.plan.plan_rows); - COPY_SCALAR_FIELD(join.plan.plan_width); - COPY_SCALAR_FIELD(join.plan.parallel_aware); - COPY_SCALAR_FIELD(join.plan.parallel_safe); - COPY_SCALAR_FIELD(join.plan.async_capable); - COPY_SCALAR_FIELD(join.plan.plan_node_id); - COPY_NODE_FIELD(join.plan.targetlist); - COPY_NODE_FIELD(join.plan.qual); - COPY_NODE_FIELD(join.plan.lefttree); - COPY_NODE_FIELD(join.plan.righttree); - COPY_NODE_FIELD(join.plan.initPlan); - COPY_BITMAPSET_FIELD(join.plan.extParam); - COPY_BITMAPSET_FIELD(join.plan.allParam); - COPY_NODE_FIELD(join.plan.flow); - COPY_SCALAR_FIELD(join.plan.locustype); - COPY_SCALAR_FIELD(join.plan.parallel); - COPY_SCALAR_FIELD(join.plan.operatorMemKB); - COPY_SCALAR_FIELD(join.jointype); - COPY_SCALAR_FIELD(join.inner_unique); - COPY_NODE_FIELD(join.joinqual); - COPY_SCALAR_FIELD(join.prefetch_inner); - COPY_SCALAR_FIELD(join.prefetch_joinqual); - COPY_SCALAR_FIELD(join.prefetch_qual); - COPY_NODE_FIELD(nestParams); - COPY_SCALAR_FIELD(shared_outer); - COPY_SCALAR_FIELD(singleton_outer); - - return newnode; -} - -static NestLoopParam * -_copyNestLoopParam(const NestLoopParam *from) -{ - NestLoopParam *newnode = makeNode(NestLoopParam); - - COPY_SCALAR_FIELD(paramno); - COPY_NODE_FIELD(paramval); - - return newnode; -} - -static MergeJoin * -_copyMergeJoin(const MergeJoin *from) -{ - MergeJoin *newnode = makeNode(MergeJoin); - - COPY_SCALAR_FIELD(join.plan.startup_cost); - COPY_SCALAR_FIELD(join.plan.total_cost); - COPY_SCALAR_FIELD(join.plan.plan_rows); - COPY_SCALAR_FIELD(join.plan.plan_width); - COPY_SCALAR_FIELD(join.plan.parallel_aware); - COPY_SCALAR_FIELD(join.plan.parallel_safe); - COPY_SCALAR_FIELD(join.plan.async_capable); - COPY_SCALAR_FIELD(join.plan.plan_node_id); - COPY_NODE_FIELD(join.plan.targetlist); - COPY_NODE_FIELD(join.plan.qual); - COPY_NODE_FIELD(join.plan.lefttree); - COPY_NODE_FIELD(join.plan.righttree); - COPY_NODE_FIELD(join.plan.initPlan); - COPY_BITMAPSET_FIELD(join.plan.extParam); - COPY_BITMAPSET_FIELD(join.plan.allParam); - COPY_NODE_FIELD(join.plan.flow); - COPY_SCALAR_FIELD(join.plan.locustype); - COPY_SCALAR_FIELD(join.plan.parallel); - COPY_SCALAR_FIELD(join.plan.operatorMemKB); - COPY_SCALAR_FIELD(join.jointype); - COPY_SCALAR_FIELD(join.inner_unique); - COPY_NODE_FIELD(join.joinqual); - COPY_SCALAR_FIELD(join.prefetch_inner); - COPY_SCALAR_FIELD(join.prefetch_joinqual); - COPY_SCALAR_FIELD(join.prefetch_qual); - COPY_SCALAR_FIELD(skip_mark_restore); - COPY_NODE_FIELD(mergeclauses); - COPY_POINTER_FIELD(mergeFamilies, list_length(from->mergeclauses) * sizeof(Oid)); - COPY_POINTER_FIELD(mergeCollations, list_length(from->mergeclauses) * sizeof(Oid)); - COPY_POINTER_FIELD(mergeStrategies, list_length(from->mergeclauses) * sizeof(int)); - COPY_POINTER_FIELD(mergeNullsFirst, list_length(from->mergeclauses) * sizeof(bool)); - COPY_SCALAR_FIELD(unique_outer); - - return newnode; -} - -static HashJoin * -_copyHashJoin(const HashJoin *from) -{ - HashJoin *newnode = makeNode(HashJoin); - - COPY_SCALAR_FIELD(join.plan.startup_cost); - COPY_SCALAR_FIELD(join.plan.total_cost); - COPY_SCALAR_FIELD(join.plan.plan_rows); - COPY_SCALAR_FIELD(join.plan.plan_width); - COPY_SCALAR_FIELD(join.plan.parallel_aware); - COPY_SCALAR_FIELD(join.plan.parallel_safe); - COPY_SCALAR_FIELD(join.plan.async_capable); - COPY_SCALAR_FIELD(join.plan.plan_node_id); - COPY_NODE_FIELD(join.plan.targetlist); - COPY_NODE_FIELD(join.plan.qual); - COPY_NODE_FIELD(join.plan.lefttree); - COPY_NODE_FIELD(join.plan.righttree); - COPY_NODE_FIELD(join.plan.initPlan); - COPY_BITMAPSET_FIELD(join.plan.extParam); - COPY_BITMAPSET_FIELD(join.plan.allParam); - COPY_NODE_FIELD(join.plan.flow); - COPY_SCALAR_FIELD(join.plan.locustype); - COPY_SCALAR_FIELD(join.plan.parallel); - COPY_SCALAR_FIELD(join.plan.operatorMemKB); - COPY_SCALAR_FIELD(join.jointype); - COPY_SCALAR_FIELD(join.inner_unique); - COPY_NODE_FIELD(join.joinqual); - COPY_SCALAR_FIELD(join.prefetch_inner); - COPY_SCALAR_FIELD(join.prefetch_joinqual); - COPY_SCALAR_FIELD(join.prefetch_qual); - COPY_NODE_FIELD(hashclauses); - COPY_NODE_FIELD(hashoperators); - COPY_NODE_FIELD(hashcollations); - COPY_NODE_FIELD(hashkeys); - COPY_NODE_FIELD(hashqualclauses); - COPY_SCALAR_FIELD(batch0_barrier); - COPY_SCALAR_FIELD(outer_motionhazard); - - return newnode; -} - -static ShareInputScan * -_copyShareInputScan(const ShareInputScan *from) -{ - ShareInputScan *newnode = makeNode(ShareInputScan); - - COPY_SCALAR_FIELD(scan.plan.startup_cost); - COPY_SCALAR_FIELD(scan.plan.total_cost); - COPY_SCALAR_FIELD(scan.plan.plan_rows); - COPY_SCALAR_FIELD(scan.plan.plan_width); - COPY_SCALAR_FIELD(scan.plan.parallel_aware); - COPY_SCALAR_FIELD(scan.plan.parallel_safe); - COPY_SCALAR_FIELD(scan.plan.async_capable); - COPY_SCALAR_FIELD(scan.plan.plan_node_id); - COPY_NODE_FIELD(scan.plan.targetlist); - COPY_NODE_FIELD(scan.plan.qual); - COPY_NODE_FIELD(scan.plan.lefttree); - COPY_NODE_FIELD(scan.plan.righttree); - COPY_NODE_FIELD(scan.plan.initPlan); - COPY_BITMAPSET_FIELD(scan.plan.extParam); - COPY_BITMAPSET_FIELD(scan.plan.allParam); - COPY_NODE_FIELD(scan.plan.flow); - COPY_SCALAR_FIELD(scan.plan.locustype); - COPY_SCALAR_FIELD(scan.plan.parallel); - COPY_SCALAR_FIELD(scan.plan.operatorMemKB); - COPY_SCALAR_FIELD(scan.scanrelid); - COPY_SCALAR_FIELD(cross_slice); - COPY_SCALAR_FIELD(share_id); - COPY_SCALAR_FIELD(producer_slice_id); - COPY_SCALAR_FIELD(this_slice_id); - COPY_SCALAR_FIELD(nconsumers); - COPY_SCALAR_FIELD(discard_output); - - return newnode; -} - -static Material * -_copyMaterial(const Material *from) -{ - Material *newnode = makeNode(Material); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(cdb_strict); - COPY_SCALAR_FIELD(cdb_shield_child_from_rescans); - - return newnode; -} - -static Memoize * -_copyMemoize(const Memoize *from) -{ - Memoize *newnode = makeNode(Memoize); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numKeys); - COPY_POINTER_FIELD(hashOperators, from->numKeys * sizeof(Oid)); - COPY_POINTER_FIELD(collations, from->numKeys * sizeof(Oid)); - COPY_NODE_FIELD(param_exprs); - COPY_SCALAR_FIELD(singlerow); - COPY_SCALAR_FIELD(binary_mode); - COPY_SCALAR_FIELD(est_entries); - COPY_BITMAPSET_FIELD(keyparamids); - - return newnode; -} - -static Sort * -_copySort(const Sort *from) -{ - Sort *newnode = makeNode(Sort); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool)); - - return newnode; -} - -static IncrementalSort * -_copyIncrementalSort(const IncrementalSort *from) -{ - IncrementalSort *newnode = makeNode(IncrementalSort); - - COPY_SCALAR_FIELD(sort.plan.startup_cost); - COPY_SCALAR_FIELD(sort.plan.total_cost); - COPY_SCALAR_FIELD(sort.plan.plan_rows); - COPY_SCALAR_FIELD(sort.plan.plan_width); - COPY_SCALAR_FIELD(sort.plan.parallel_aware); - COPY_SCALAR_FIELD(sort.plan.parallel_safe); - COPY_SCALAR_FIELD(sort.plan.async_capable); - COPY_SCALAR_FIELD(sort.plan.plan_node_id); - COPY_NODE_FIELD(sort.plan.targetlist); - COPY_NODE_FIELD(sort.plan.qual); - COPY_NODE_FIELD(sort.plan.lefttree); - COPY_NODE_FIELD(sort.plan.righttree); - COPY_NODE_FIELD(sort.plan.initPlan); - COPY_BITMAPSET_FIELD(sort.plan.extParam); - COPY_BITMAPSET_FIELD(sort.plan.allParam); - COPY_NODE_FIELD(sort.plan.flow); - COPY_SCALAR_FIELD(sort.plan.locustype); - COPY_SCALAR_FIELD(sort.plan.parallel); - COPY_SCALAR_FIELD(sort.plan.operatorMemKB); - COPY_SCALAR_FIELD(sort.numCols); - COPY_POINTER_FIELD(sort.sortColIdx, from->sort.numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(sort.sortOperators, from->sort.numCols * sizeof(Oid)); - COPY_POINTER_FIELD(sort.collations, from->sort.numCols * sizeof(Oid)); - COPY_POINTER_FIELD(sort.nullsFirst, from->sort.numCols * sizeof(bool)); - COPY_SCALAR_FIELD(nPresortedCols); - - return newnode; -} - -static Group * -_copyGroup(const Group *from) -{ - Group *newnode = makeNode(Group); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(grpCollations, from->numCols * sizeof(Oid)); - - return newnode; -} - -static Agg * -_copyAgg(const Agg *from) -{ - Agg *newnode = makeNode(Agg); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(aggstrategy); - COPY_SCALAR_FIELD(aggsplit); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(grpCollations, from->numCols * sizeof(Oid)); - COPY_SCALAR_FIELD(numGroups); - COPY_SCALAR_FIELD(transitionSpace); - COPY_BITMAPSET_FIELD(aggParams); - COPY_NODE_FIELD(groupingSets); - COPY_NODE_FIELD(chain); - COPY_SCALAR_FIELD(streaming); - COPY_SCALAR_FIELD(agg_expr_id); - - return newnode; -} - -static TupleSplit * -_copyTupleSplit(const TupleSplit *from) -{ - TupleSplit *newnode = makeNode(TupleSplit); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber)); - COPY_NODE_FIELD(dqa_expr_lst); - - return newnode; -} - -static WindowAgg * -_copyWindowAgg(const WindowAgg *from) -{ - WindowAgg *newnode = makeNode(WindowAgg); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(winref); - COPY_SCALAR_FIELD(partNumCols); - COPY_POINTER_FIELD(partColIdx, from->partNumCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(partOperators, from->partNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(partCollations, from->partNumCols * sizeof(Oid)); - COPY_SCALAR_FIELD(ordNumCols); - COPY_POINTER_FIELD(ordColIdx, from->ordNumCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(ordOperators, from->ordNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(ordCollations, from->ordNumCols * sizeof(Oid)); - COPY_SCALAR_FIELD(frameOptions); - COPY_NODE_FIELD(startOffset); - COPY_NODE_FIELD(endOffset); - COPY_NODE_FIELD(runCondition); - COPY_NODE_FIELD(runConditionOrig); - COPY_SCALAR_FIELD(firstOrderCol); - COPY_SCALAR_FIELD(firstOrderCmpOperator); - COPY_SCALAR_FIELD(firstOrderNullsFirst); - COPY_SCALAR_FIELD(startInRangeFunc); - COPY_SCALAR_FIELD(endInRangeFunc); - COPY_SCALAR_FIELD(inRangeColl); - COPY_SCALAR_FIELD(inRangeAsc); - COPY_SCALAR_FIELD(inRangeNullsFirst); - COPY_SCALAR_FIELD(topWindow); - - return newnode; -} - -static Unique * -_copyUnique(const Unique *from) -{ - Unique *newnode = makeNode(Unique); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(uniqColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(uniqOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(uniqCollations, from->numCols * sizeof(Oid)); - - return newnode; -} - -static Gather * -_copyGather(const Gather *from) -{ - Gather *newnode = makeNode(Gather); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(num_workers); - COPY_SCALAR_FIELD(rescan_param); - COPY_SCALAR_FIELD(single_copy); - COPY_SCALAR_FIELD(invisible); - COPY_BITMAPSET_FIELD(initParam); - - return newnode; -} - -static GatherMerge * -_copyGatherMerge(const GatherMerge *from) -{ - GatherMerge *newnode = makeNode(GatherMerge); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(num_workers); - COPY_SCALAR_FIELD(rescan_param); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool)); - COPY_BITMAPSET_FIELD(initParam); - - return newnode; -} - -static Hash * -_copyHash(const Hash *from) -{ - Hash *newnode = makeNode(Hash); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(hashkeys); - COPY_SCALAR_FIELD(skewTable); - COPY_SCALAR_FIELD(skewColumn); - COPY_SCALAR_FIELD(skewInherit); - COPY_SCALAR_FIELD(rows_total); - COPY_SCALAR_FIELD(rescannable); - COPY_SCALAR_FIELD(sync_barrier); - - return newnode; -} - -static RuntimeFilter * -_copyRuntimeFilter(const RuntimeFilter *from) -{ - RuntimeFilter *newnode = makeNode(RuntimeFilter); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - - return newnode; -} - -static SetOp * -_copySetOp(const SetOp *from) -{ - SetOp *newnode = makeNode(SetOp); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(cmd); - COPY_SCALAR_FIELD(strategy); - COPY_SCALAR_FIELD(numCols); - COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(dupOperators, from->numCols * sizeof(Oid)); - COPY_POINTER_FIELD(dupCollations, from->numCols * sizeof(Oid)); - COPY_SCALAR_FIELD(flagColIdx); - COPY_SCALAR_FIELD(firstFlag); - COPY_SCALAR_FIELD(numGroups); - - return newnode; -} - -static LockRows * -_copyLockRows(const LockRows *from) -{ - LockRows *newnode = makeNode(LockRows); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(rowMarks); - COPY_SCALAR_FIELD(epqParam); - - return newnode; -} - -static Limit * -_copyLimit(const Limit *from) -{ - Limit *newnode = makeNode(Limit); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(limitOffset); - COPY_NODE_FIELD(limitCount); - COPY_SCALAR_FIELD(limitOption); - COPY_SCALAR_FIELD(uniqNumCols); - COPY_POINTER_FIELD(uniqColIdx, from->uniqNumCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(uniqOperators, from->uniqNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(uniqCollations, from->uniqNumCols * sizeof(Oid)); - - return newnode; -} - -static Motion * -_copyMotion(const Motion *from) -{ - Motion *newnode = makeNode(Motion); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(motionType); - COPY_SCALAR_FIELD(sendSorted); - COPY_SCALAR_FIELD(motionID); - COPY_NODE_FIELD(hashExprs); - COPY_POINTER_FIELD(hashFuncs, list_length(from->hashExprs) * sizeof(Oid)); - COPY_SCALAR_FIELD(numHashSegments); - COPY_SCALAR_FIELD(segidColIdx); - COPY_SCALAR_FIELD(numSortCols); - COPY_POINTER_FIELD(sortColIdx, from->numSortCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(sortOperators, from->numSortCols * sizeof(Oid)); - COPY_POINTER_FIELD(collations, from->numSortCols * sizeof(Oid)); - COPY_POINTER_FIELD(nullsFirst, from->numSortCols * sizeof(bool)); - - if (from->senderSliceInfo) - { - newnode->senderSliceInfo = palloc(sizeof(PlanSlice)); - memcpy(newnode->senderSliceInfo, from->senderSliceInfo, sizeof(PlanSlice)); - } - - return newnode; -} - -static SplitUpdate * -_copySplitUpdate(const SplitUpdate *from) -{ - SplitUpdate *newnode = makeNode(SplitUpdate); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(actionColIdx); - COPY_NODE_FIELD(insertColIdx); - COPY_NODE_FIELD(deleteColIdx); - COPY_SCALAR_FIELD(numHashAttrs); - COPY_POINTER_FIELD(hashAttnos, from->numHashAttrs * sizeof(AttrNumber)); - COPY_POINTER_FIELD(hashFuncs, from->numHashAttrs * sizeof(Oid)); - COPY_SCALAR_FIELD(numHashSegments); - - return newnode; -} - -static SplitMerge * -_copySplitMerge(const SplitMerge *from) -{ - SplitMerge *newnode = makeNode(SplitMerge); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(numHashAttrs); - COPY_POINTER_FIELD(hashAttnos, from->numHashAttrs * sizeof(AttrNumber)); - COPY_POINTER_FIELD(hashFuncs, from->numHashAttrs * sizeof(Oid)); - COPY_SCALAR_FIELD(numHashSegments); - COPY_NODE_FIELD(resultRelations); - COPY_NODE_FIELD(mergeActionLists); - COPY_SCALAR_FIELD(hasSplitUpdate); - COPY_SCALAR_FIELD(rootResultRelation); - - return newnode; -} - -static AssertOp * -_copyAssertOp(const AssertOp *from) -{ - AssertOp *newnode = makeNode(AssertOp); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_SCALAR_FIELD(errcode); - COPY_NODE_FIELD(errmessage); - - return newnode; -} - -static PlanRowMark * -_copyPlanRowMark(const PlanRowMark *from) -{ - PlanRowMark *newnode = makeNode(PlanRowMark); - - COPY_SCALAR_FIELD(rti); - COPY_SCALAR_FIELD(prti); - COPY_SCALAR_FIELD(rowmarkId); - COPY_SCALAR_FIELD(markType); - COPY_SCALAR_FIELD(allMarkTypes); - COPY_SCALAR_FIELD(strength); - COPY_SCALAR_FIELD(waitPolicy); - COPY_SCALAR_FIELD(isParent); - - return newnode; -} - -static PartitionPruneInfo * -_copyPartitionPruneInfo(const PartitionPruneInfo *from) -{ - PartitionPruneInfo *newnode = makeNode(PartitionPruneInfo); - - COPY_NODE_FIELD(prune_infos); - COPY_BITMAPSET_FIELD(other_subplans); - - return newnode; -} - -static PartitionedRelPruneInfo * -_copyPartitionedRelPruneInfo(const PartitionedRelPruneInfo *from) -{ - PartitionedRelPruneInfo *newnode = makeNode(PartitionedRelPruneInfo); - - COPY_SCALAR_FIELD(rtindex); - COPY_BITMAPSET_FIELD(present_parts); - COPY_SCALAR_FIELD(nparts); - COPY_POINTER_FIELD(subplan_map, from->nparts * sizeof(int)); - COPY_POINTER_FIELD(subpart_map, from->nparts * sizeof(int)); - COPY_POINTER_FIELD(relid_map, from->nparts * sizeof(Oid)); - COPY_NODE_FIELD(initial_pruning_steps); - COPY_NODE_FIELD(exec_pruning_steps); - COPY_BITMAPSET_FIELD(execparamids); - - return newnode; -} - -static PartitionPruneStepOp * -_copyPartitionPruneStepOp(const PartitionPruneStepOp *from) -{ - PartitionPruneStepOp *newnode = makeNode(PartitionPruneStepOp); - - COPY_SCALAR_FIELD(step.step_id); - COPY_SCALAR_FIELD(opstrategy); - COPY_NODE_FIELD(exprs); - COPY_NODE_FIELD(cmpfns); - COPY_BITMAPSET_FIELD(nullkeys); - - return newnode; -} - -static PartitionPruneStepCombine * -_copyPartitionPruneStepCombine(const PartitionPruneStepCombine *from) -{ - PartitionPruneStepCombine *newnode = makeNode(PartitionPruneStepCombine); - - COPY_SCALAR_FIELD(step.step_id); - COPY_SCALAR_FIELD(combineOp); - COPY_NODE_FIELD(source_stepids); - - return newnode; -} - -static PlanInvalItem * -_copyPlanInvalItem(const PlanInvalItem *from) -{ - PlanInvalItem *newnode = makeNode(PlanInvalItem); - - COPY_SCALAR_FIELD(cacheId); - COPY_SCALAR_FIELD(hashValue); - - return newnode; -} - -static PartitionSelector * -_copyPartitionSelector(const PartitionSelector *from) -{ - PartitionSelector *newnode = makeNode(PartitionSelector); - - COPY_SCALAR_FIELD(plan.startup_cost); - COPY_SCALAR_FIELD(plan.total_cost); - COPY_SCALAR_FIELD(plan.plan_rows); - COPY_SCALAR_FIELD(plan.plan_width); - COPY_SCALAR_FIELD(plan.parallel_aware); - COPY_SCALAR_FIELD(plan.parallel_safe); - COPY_SCALAR_FIELD(plan.async_capable); - COPY_SCALAR_FIELD(plan.plan_node_id); - COPY_NODE_FIELD(plan.targetlist); - COPY_NODE_FIELD(plan.qual); - COPY_NODE_FIELD(plan.lefttree); - COPY_NODE_FIELD(plan.righttree); - COPY_NODE_FIELD(plan.initPlan); - COPY_BITMAPSET_FIELD(plan.extParam); - COPY_BITMAPSET_FIELD(plan.allParam); - COPY_NODE_FIELD(plan.flow); - COPY_SCALAR_FIELD(plan.locustype); - COPY_SCALAR_FIELD(plan.parallel); - COPY_SCALAR_FIELD(plan.operatorMemKB); - COPY_NODE_FIELD(part_prune_info); - COPY_SCALAR_FIELD(paramid); - - return newnode; -} - -static Integer * -_copyInteger(const Integer *from) -{ - Integer *newnode = makeNode(Integer); - - COPY_SCALAR_FIELD(ival); - - return newnode; -} - -static Float * -_copyFloat(const Float *from) -{ - Float *newnode = makeNode(Float); - - COPY_STRING_FIELD(fval); - - return newnode; -} - -static Boolean * -_copyBoolean(const Boolean *from) -{ - Boolean *newnode = makeNode(Boolean); - - COPY_SCALAR_FIELD(boolval); - - return newnode; -} - -static String * -_copyString(const String *from) -{ - String *newnode = makeNode(String); - - COPY_STRING_FIELD(sval); - - return newnode; -} - -static BitString * -_copyBitString(const BitString *from) -{ - BitString *newnode = makeNode(BitString); - - COPY_STRING_FIELD(bsval); - - return newnode; -} - -static ForeignKeyCacheInfo * -_copyForeignKeyCacheInfo(const ForeignKeyCacheInfo *from) -{ - ForeignKeyCacheInfo *newnode = makeNode(ForeignKeyCacheInfo); - - COPY_SCALAR_FIELD(conoid); - COPY_SCALAR_FIELD(conrelid); - COPY_SCALAR_FIELD(confrelid); - COPY_SCALAR_FIELD(nkeys); - COPY_ARRAY_FIELD(conkey); - COPY_ARRAY_FIELD(confkey); - COPY_ARRAY_FIELD(conpfeqop); - - return newnode; -} - -static OidAssignment * -_copyOidAssignment(const OidAssignment *from) -{ - OidAssignment *newnode = makeNode(OidAssignment); - - COPY_SCALAR_FIELD(catalog); - COPY_STRING_FIELD(objname); - COPY_SCALAR_FIELD(namespaceOid); - COPY_SCALAR_FIELD(keyOid1); - COPY_SCALAR_FIELD(keyOid2); - COPY_SCALAR_FIELD(oid); - - return newnode; -} - -static SliceTable * -_copySliceTable(const SliceTable *from) -{ - SliceTable *newnode = makeNode(SliceTable); - - COPY_SCALAR_FIELD(localSlice); - COPY_SCALAR_FIELD(numSlices); - - newnode->slices = palloc0(from->numSlices * sizeof(ExecSlice)); - for (int i = 0; i < from->numSlices; i++) - { - COPY_SCALAR_FIELD(slices[i].sliceIndex); - COPY_SCALAR_FIELD(slices[i].rootIndex); - COPY_SCALAR_FIELD(slices[i].planNumSegments); - COPY_SCALAR_FIELD(slices[i].gangType); - COPY_NODE_FIELD(slices[i].segments); - COPY_SCALAR_FIELD(slices[i].useMppParallelMode); - COPY_SCALAR_FIELD(slices[i].parallel_workers); - - newnode->slices[i].primaryGang = from->slices[i].primaryGang; - COPY_SCALAR_FIELD(slices[i].parentIndex); - COPY_NODE_FIELD(slices[i].children); - COPY_NODE_FIELD(slices[i].primaryProcesses); - COPY_BITMAPSET_FIELD(slices[i].processesMap); - } - - COPY_SCALAR_FIELD(instrument_options); - COPY_SCALAR_FIELD(ic_instance_id); - - return newnode; -} - -static CdbProcess * -_copyCdbProcess(const CdbProcess *from) -{ - CdbProcess *newnode = makeNode(CdbProcess); - - COPY_STRING_FIELD(listenerAddr); - COPY_SCALAR_FIELD(listenerPort); - COPY_SCALAR_FIELD(pid); - COPY_SCALAR_FIELD(contentid); - COPY_SCALAR_FIELD(dbid); - - return newnode; -} - -static CursorPosInfo * -_copyCursorPosInfo(const CursorPosInfo *from) -{ - CursorPosInfo *newnode = makeNode(CursorPosInfo); - - COPY_STRING_FIELD(cursor_name); - COPY_SCALAR_FIELD(gp_segment_id); - COPY_BINARY_FIELD(ctid, sizeof(ItemPointerData)); - COPY_SCALAR_FIELD(table_oid); - - return newnode; -} - -/* - * _copyPathTarget - */ -static PathTarget * -_copyPathTarget(const PathTarget *from) -{ - PathTarget *newnode = makeNode(PathTarget); - - COPY_NODE_FIELD(exprs); - if (from->sortgrouprefs) - { - int numCols = list_length(from->exprs); - if (numCols > 0) - COPY_POINTER_FIELD(sortgrouprefs, numCols * sizeof(Index)); - } - COPY_SCALAR_FIELD(cost); - COPY_SCALAR_FIELD(width); - - return newnode; -} - -static AlteredTableInfo * -_copyAlteredTableInfo(const AlteredTableInfo *from) -{ - int i; - - AlteredTableInfo *newnode = makeNode(AlteredTableInfo); - - COPY_SCALAR_FIELD(relid); - COPY_SCALAR_FIELD(relkind); - newnode->oldDesc = CreateTupleDescCopyConstr(from->oldDesc); - - for (i = 0; i < AT_NUM_PASSES; i++) - COPY_NODE_FIELD(subcmds[i]); - - COPY_NODE_FIELD(constraints); - COPY_NODE_FIELD(newvals); - COPY_NODE_FIELD(afterStmts); - COPY_SCALAR_FIELD(verify_new_notnull); - COPY_SCALAR_FIELD(rewrite); - COPY_SCALAR_FIELD(dist_opfamily_changed); - COPY_SCALAR_FIELD(new_opclass); - COPY_SCALAR_FIELD(newTableSpace); - COPY_SCALAR_FIELD(chgPersistence); - COPY_SCALAR_FIELD(newrelpersistence); - COPY_NODE_FIELD(partition_constraint); - COPY_SCALAR_FIELD(validate_default); - COPY_NODE_FIELD(changedConstraintOids); - COPY_NODE_FIELD(changedConstraintDefs); - COPY_NODE_FIELD(changedIndexOids); - COPY_NODE_FIELD(changedIndexDefs); - COPY_STRING_FIELD(replicaIdentityIndex); - COPY_STRING_FIELD(clusterOnIndex); - COPY_NODE_FIELD(beforeStmtLists); - COPY_NODE_FIELD(constraintLists); - - return newnode; -} - -static CookedConstraint * -_copyCookedConstraint(const CookedConstraint *from) -{ - CookedConstraint *newnode = makeNode(CookedConstraint); - - COPY_SCALAR_FIELD(contype); - COPY_STRING_FIELD(name); - COPY_SCALAR_FIELD(attnum); - COPY_NODE_FIELD(expr); - COPY_SCALAR_FIELD(is_local); - COPY_SCALAR_FIELD(inhcount); - COPY_SCALAR_FIELD(is_no_inherit); - - return newnode; -} - -/* - * CopyPlanFields - * - * This function copies the fields of the Plan node. It is used by - * all the copy functions for classes which inherit from Plan. - */ -static void -CopyPlanFields(const Plan *from, Plan *newnode) -{ - COPY_SCALAR_FIELD(plan_node_id); - - COPY_SCALAR_FIELD(startup_cost); - COPY_SCALAR_FIELD(total_cost); - COPY_SCALAR_FIELD(plan_rows); - COPY_SCALAR_FIELD(plan_width); - COPY_SCALAR_FIELD(parallel_aware); - COPY_SCALAR_FIELD(parallel_safe); - COPY_SCALAR_FIELD(async_capable); - COPY_SCALAR_FIELD(plan_node_id); - COPY_NODE_FIELD(targetlist); - COPY_NODE_FIELD(qual); - COPY_NODE_FIELD(lefttree); - COPY_NODE_FIELD(righttree); - COPY_NODE_FIELD(initPlan); - COPY_BITMAPSET_FIELD(extParam); - COPY_BITMAPSET_FIELD(allParam); - COPY_NODE_FIELD(flow); - COPY_SCALAR_FIELD(locustype); - COPY_SCALAR_FIELD(parallel); - - COPY_SCALAR_FIELD(operatorMemKB); -} - -/* - * _copyWindowHashAgg - */ -static WindowHashAgg * -_copyWindowHashAgg(const WindowHashAgg *from) -{ - WindowHashAgg *newnode = makeNode(WindowHashAgg); - - CopyPlanFields((const Plan *) from, (Plan *) newnode); - - COPY_SCALAR_FIELD(winref); - COPY_SCALAR_FIELD(partNumCols); - COPY_POINTER_FIELD(partColIdx, from->partNumCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(partOperators, from->partNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(partCollations, from->partNumCols * sizeof(Oid)); - COPY_SCALAR_FIELD(ordNumCols); - - if (from->ordNumCols > 0) - { - COPY_POINTER_FIELD(ordColIdx, from->ordNumCols * sizeof(AttrNumber)); - COPY_POINTER_FIELD(ordOperators, from->ordNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(ordCollations, from->ordNumCols * sizeof(Oid)); - COPY_POINTER_FIELD(ordNullsFirst, from->ordNumCols * sizeof(bool)); - } - - COPY_SCALAR_FIELD(frameOptions); - COPY_NODE_FIELD(startOffset); - COPY_NODE_FIELD(endOffset); - COPY_SCALAR_FIELD(startInRangeFunc); - COPY_SCALAR_FIELD(endInRangeFunc); - COPY_SCALAR_FIELD(inRangeColl); - COPY_SCALAR_FIELD(inRangeAsc); - COPY_SCALAR_FIELD(inRangeNullsFirst); - - return newnode; -} diff --git a/src/backend/nodes/copyfuncs.switch.c b/src/backend/nodes/copyfuncs.switch.c deleted file mode 100644 index 69dcef19150..00000000000 --- a/src/backend/nodes/copyfuncs.switch.c +++ /dev/null @@ -1,1201 +0,0 @@ -/*------------------------------------------------------------------------- - * - * copyfuncs.switch.c - * Generated node infrastructure code - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * NOTES - * ****************************** - * *** DO NOT EDIT THIS FILE! *** - * ****************************** - * - * It has been GENERATED by src/backend/nodes/gen_node_support.pl - * - *------------------------------------------------------------------------- - */ - case T_GpPolicy: - retval = _copyGpPolicy(from); - break; - case T_Alias: - retval = _copyAlias(from); - break; - case T_RangeVar: - retval = _copyRangeVar(from); - break; - case T_TableFunc: - retval = _copyTableFunc(from); - break; - case T_IntoClause: - retval = _copyIntoClause(from); - break; - case T_CopyIntoClause: - retval = _copyCopyIntoClause(from); - break; - case T_RefreshClause: - retval = _copyRefreshClause(from); - break; - case T_Var: - retval = _copyVar(from); - break; - case T_Const: - retval = _copyConst(from); - break; - case T_Param: - retval = _copyParam(from); - break; - case T_Aggref: - retval = _copyAggref(from); - break; - case T_GroupId: - retval = _copyGroupId(from); - break; - case T_GroupingSetId: - retval = _copyGroupingSetId(from); - break; - case T_AggExprId: - retval = _copyAggExprId(from); - break; - case T_RowIdExpr: - retval = _copyRowIdExpr(from); - break; - case T_GroupingFunc: - retval = _copyGroupingFunc(from); - break; - case T_WindowFunc: - retval = _copyWindowFunc(from); - break; - case T_SubscriptingRef: - retval = _copySubscriptingRef(from); - break; - case T_FuncExpr: - retval = _copyFuncExpr(from); - break; - case T_NamedArgExpr: - retval = _copyNamedArgExpr(from); - break; - case T_OpExpr: - retval = _copyOpExpr(from); - break; - case T_DistinctExpr: - retval = _copyDistinctExpr(from); - break; - case T_NullIfExpr: - retval = _copyNullIfExpr(from); - break; - case T_ScalarArrayOpExpr: - retval = _copyScalarArrayOpExpr(from); - break; - case T_BoolExpr: - retval = _copyBoolExpr(from); - break; - case T_TableValueExpr: - retval = _copyTableValueExpr(from); - break; - case T_SubLink: - retval = _copySubLink(from); - break; - case T_SubPlan: - retval = _copySubPlan(from); - break; - case T_AlternativeSubPlan: - retval = _copyAlternativeSubPlan(from); - break; - case T_FieldSelect: - retval = _copyFieldSelect(from); - break; - case T_FieldStore: - retval = _copyFieldStore(from); - break; - case T_RelabelType: - retval = _copyRelabelType(from); - break; - case T_CoerceViaIO: - retval = _copyCoerceViaIO(from); - break; - case T_ArrayCoerceExpr: - retval = _copyArrayCoerceExpr(from); - break; - case T_ConvertRowtypeExpr: - retval = _copyConvertRowtypeExpr(from); - break; - case T_CollateExpr: - retval = _copyCollateExpr(from); - break; - case T_CaseExpr: - retval = _copyCaseExpr(from); - break; - case T_CaseWhen: - retval = _copyCaseWhen(from); - break; - case T_CaseTestExpr: - retval = _copyCaseTestExpr(from); - break; - case T_ArrayExpr: - retval = _copyArrayExpr(from); - break; - case T_RowExpr: - retval = _copyRowExpr(from); - break; - case T_RowCompareExpr: - retval = _copyRowCompareExpr(from); - break; - case T_CoalesceExpr: - retval = _copyCoalesceExpr(from); - break; - case T_MinMaxExpr: - retval = _copyMinMaxExpr(from); - break; - case T_SQLValueFunction: - retval = _copySQLValueFunction(from); - break; - case T_XmlExpr: - retval = _copyXmlExpr(from); - break; - case T_JsonFormat: - retval = _copyJsonFormat(from); - break; - case T_JsonReturning: - retval = _copyJsonReturning(from); - break; - case T_JsonValueExpr: - retval = _copyJsonValueExpr(from); - break; - case T_JsonConstructorExpr: - retval = _copyJsonConstructorExpr(from); - break; - case T_JsonIsPredicate: - retval = _copyJsonIsPredicate(from); - break; - case T_NullTest: - retval = _copyNullTest(from); - break; - case T_BooleanTest: - retval = _copyBooleanTest(from); - break; - case T_CoerceToDomain: - retval = _copyCoerceToDomain(from); - break; - case T_CoerceToDomainValue: - retval = _copyCoerceToDomainValue(from); - break; - case T_SetToDefault: - retval = _copySetToDefault(from); - break; - case T_CurrentOfExpr: - retval = _copyCurrentOfExpr(from); - break; - case T_NextValueExpr: - retval = _copyNextValueExpr(from); - break; - case T_InferenceElem: - retval = _copyInferenceElem(from); - break; - case T_TargetEntry: - retval = _copyTargetEntry(from); - break; - case T_RangeTblRef: - retval = _copyRangeTblRef(from); - break; - case T_JoinExpr: - retval = _copyJoinExpr(from); - break; - case T_FromExpr: - retval = _copyFromExpr(from); - break; - case T_OnConflictExpr: - retval = _copyOnConflictExpr(from); - break; - case T_DMLActionExpr: - retval = _copyDMLActionExpr(from); - break; - case T_Query: - retval = _copyQuery(from); - break; - case T_TypeName: - retval = _copyTypeName(from); - break; - case T_ColumnRef: - retval = _copyColumnRef(from); - break; - case T_ParamRef: - retval = _copyParamRef(from); - break; - case T_A_Expr: - retval = _copyA_Expr(from); - break; - case T_A_Const: - retval = _copyA_Const(from); - break; - case T_TypeCast: - retval = _copyTypeCast(from); - break; - case T_CollateClause: - retval = _copyCollateClause(from); - break; - case T_RoleSpec: - retval = _copyRoleSpec(from); - break; - case T_FuncCall: - retval = _copyFuncCall(from); - break; - case T_A_Star: - retval = _copyA_Star(from); - break; - case T_A_Indices: - retval = _copyA_Indices(from); - break; - case T_A_Indirection: - retval = _copyA_Indirection(from); - break; - case T_A_ArrayExpr: - retval = _copyA_ArrayExpr(from); - break; - case T_ResTarget: - retval = _copyResTarget(from); - break; - case T_MultiAssignRef: - retval = _copyMultiAssignRef(from); - break; - case T_SortBy: - retval = _copySortBy(from); - break; - case T_WindowDef: - retval = _copyWindowDef(from); - break; - case T_RangeSubselect: - retval = _copyRangeSubselect(from); - break; - case T_RangeFunction: - retval = _copyRangeFunction(from); - break; - case T_RangeTableFunc: - retval = _copyRangeTableFunc(from); - break; - case T_RangeTableFuncCol: - retval = _copyRangeTableFuncCol(from); - break; - case T_RangeTableSample: - retval = _copyRangeTableSample(from); - break; - case T_ColumnDef: - retval = _copyColumnDef(from); - break; - case T_TableLikeClause: - retval = _copyTableLikeClause(from); - break; - case T_IndexElem: - retval = _copyIndexElem(from); - break; - case T_ColumnReferenceStorageDirective: - retval = _copyColumnReferenceStorageDirective(from); - break; - case T_DefElem: - retval = _copyDefElem(from); - break; - case T_LockingClause: - retval = _copyLockingClause(from); - break; - case T_XmlSerialize: - retval = _copyXmlSerialize(from); - break; - case T_DistributionKeyElem: - retval = _copyDistributionKeyElem(from); - break; - case T_PartitionElem: - retval = _copyPartitionElem(from); - break; - case T_PartitionSpec: - retval = _copyPartitionSpec(from); - break; - case T_PartitionBoundSpec: - retval = _copyPartitionBoundSpec(from); - break; - case T_PartitionRangeDatum: - retval = _copyPartitionRangeDatum(from); - break; - case T_PartitionCmd: - retval = _copyPartitionCmd(from); - break; - case T_RangeTblEntry: - retval = _copyRangeTblEntry(from); - break; - case T_RTEPermissionInfo: - retval = _copyRTEPermissionInfo(from); - break; - case T_RangeTblFunction: - retval = _copyRangeTblFunction(from); - break; - case T_TableSampleClause: - retval = _copyTableSampleClause(from); - break; - case T_WithCheckOption: - retval = _copyWithCheckOption(from); - break; - case T_SortGroupClause: - retval = _copySortGroupClause(from); - break; - case T_GroupingSet: - retval = _copyGroupingSet(from); - break; - case T_WindowClause: - retval = _copyWindowClause(from); - break; - case T_RowMarkClause: - retval = _copyRowMarkClause(from); - break; - case T_WithClause: - retval = _copyWithClause(from); - break; - case T_InferClause: - retval = _copyInferClause(from); - break; - case T_OnConflictClause: - retval = _copyOnConflictClause(from); - break; - case T_CTESearchClause: - retval = _copyCTESearchClause(from); - break; - case T_CTECycleClause: - retval = _copyCTECycleClause(from); - break; - case T_CommonTableExpr: - retval = _copyCommonTableExpr(from); - break; - case T_MergeWhenClause: - retval = _copyMergeWhenClause(from); - break; - case T_MergeAction: - retval = _copyMergeAction(from); - break; - case T_TriggerTransition: - retval = _copyTriggerTransition(from); - break; - case T_JsonOutput: - retval = _copyJsonOutput(from); - break; - case T_JsonKeyValue: - retval = _copyJsonKeyValue(from); - break; - case T_JsonObjectConstructor: - retval = _copyJsonObjectConstructor(from); - break; - case T_JsonArrayConstructor: - retval = _copyJsonArrayConstructor(from); - break; - case T_JsonArrayQueryConstructor: - retval = _copyJsonArrayQueryConstructor(from); - break; - case T_JsonAggConstructor: - retval = _copyJsonAggConstructor(from); - break; - case T_JsonObjectAgg: - retval = _copyJsonObjectAgg(from); - break; - case T_JsonArrayAgg: - retval = _copyJsonArrayAgg(from); - break; - case T_RawStmt: - retval = _copyRawStmt(from); - break; - case T_InsertStmt: - retval = _copyInsertStmt(from); - break; - case T_DeleteStmt: - retval = _copyDeleteStmt(from); - break; - case T_UpdateStmt: - retval = _copyUpdateStmt(from); - break; - case T_MergeStmt: - retval = _copyMergeStmt(from); - break; - case T_DistributedBy: - retval = _copyDistributedBy(from); - break; - case T_SelectStmt: - retval = _copySelectStmt(from); - break; - case T_SetOperationStmt: - retval = _copySetOperationStmt(from); - break; - case T_ReturnStmt: - retval = _copyReturnStmt(from); - break; - case T_PLAssignStmt: - retval = _copyPLAssignStmt(from); - break; - case T_CreateSchemaStmt: - retval = _copyCreateSchemaStmt(from); - break; - case T_AlterSchemaStmt: - retval = _copyAlterSchemaStmt(from); - break; - case T_CreateTagStmt: - retval = _copyCreateTagStmt(from); - break; - case T_CompoundUtilityStmt: - retval = _copyCompoundUtilityStmt(from); - break; - case T_AlterTableStmt: - retval = _copyAlterTableStmt(from); - break; - case T_AlterTagStmt: - retval = _copyAlterTagStmt(from); - break; - case T_ReplicaIdentityStmt: - retval = _copyReplicaIdentityStmt(from); - break; - case T_AlterTableCmd: - retval = _copyAlterTableCmd(from); - break; - case T_GpAlterPartitionId: - retval = _copyGpAlterPartitionId(from); - break; - case T_GpDropPartitionCmd: - retval = _copyGpDropPartitionCmd(from); - break; - case T_GpAlterPartitionCmd: - retval = _copyGpAlterPartitionCmd(from); - break; - case T_GpPartitionRangeItem: - retval = _copyGpPartitionRangeItem(from); - break; - case T_GpSplitPartitionCmd: - retval = _copyGpSplitPartitionCmd(from); - break; - case T_AlterCollationStmt: - retval = _copyAlterCollationStmt(from); - break; - case T_AlterDomainStmt: - retval = _copyAlterDomainStmt(from); - break; - case T_GrantStmt: - retval = _copyGrantStmt(from); - break; - case T_ObjectWithArgs: - retval = _copyObjectWithArgs(from); - break; - case T_AccessPriv: - retval = _copyAccessPriv(from); - break; - case T_GrantRoleStmt: - retval = _copyGrantRoleStmt(from); - break; - case T_SingleRowErrorDesc: - retval = _copySingleRowErrorDesc(from); - break; - case T_AlterDefaultPrivilegesStmt: - retval = _copyAlterDefaultPrivilegesStmt(from); - break; - case T_CopyStmt: - retval = _copyCopyStmt(from); - break; - case T_VariableSetStmt: - retval = _copyVariableSetStmt(from); - break; - case T_VariableShowStmt: - retval = _copyVariableShowStmt(from); - break; - case T_CreateStmt: - retval = _copyCreateStmt(from); - break; - case T_ExtTableTypeDesc: - retval = _copyExtTableTypeDesc(from); - break; - case T_CreateExternalStmt: - retval = _copyCreateExternalStmt(from); - break; - case T_CreateForeignStmt: - retval = _copyCreateForeignStmt(from); - break; - case T_Constraint: - retval = _copyConstraint(from); - break; - case T_GpPartDefElem: - retval = _copyGpPartDefElem(from); - break; - case T_GpPartitionRangeSpec: - retval = _copyGpPartitionRangeSpec(from); - break; - case T_GpPartitionListSpec: - retval = _copyGpPartitionListSpec(from); - break; - case T_GpPartitionDefinition: - retval = _copyGpPartitionDefinition(from); - break; - case T_CreateTableSpaceStmt: - retval = _copyCreateTableSpaceStmt(from); - break; - case T_DropTableSpaceStmt: - retval = _copyDropTableSpaceStmt(from); - break; - case T_AlterTableSpaceOptionsStmt: - retval = _copyAlterTableSpaceOptionsStmt(from); - break; - case T_AlterTableMoveAllStmt: - retval = _copyAlterTableMoveAllStmt(from); - break; - case T_DropTagStmt: - retval = _copyDropTagStmt(from); - break; - case T_CreateTaskStmt: - retval = _copyCreateTaskStmt(from); - break; - case T_AlterTaskStmt: - retval = _copyAlterTaskStmt(from); - break; - case T_DropTaskStmt: - retval = _copyDropTaskStmt(from); - break; - case T_CreateExtensionStmt: - retval = _copyCreateExtensionStmt(from); - break; - case T_AlterExtensionStmt: - retval = _copyAlterExtensionStmt(from); - break; - case T_AlterExtensionContentsStmt: - retval = _copyAlterExtensionContentsStmt(from); - break; - case T_CreateFdwStmt: - retval = _copyCreateFdwStmt(from); - break; - case T_AlterFdwStmt: - retval = _copyAlterFdwStmt(from); - break; - case T_CreateForeignServerStmt: - retval = _copyCreateForeignServerStmt(from); - break; - case T_AlterForeignServerStmt: - retval = _copyAlterForeignServerStmt(from); - break; - case T_CreateStorageServerStmt: - retval = _copyCreateStorageServerStmt(from); - break; - case T_AlterStorageServerStmt: - retval = _copyAlterStorageServerStmt(from); - break; - case T_DropStorageServerStmt: - retval = _copyDropStorageServerStmt(from); - break; - case T_CreateForeignTableStmt: - retval = _copyCreateForeignTableStmt(from); - break; - case T_CreateUserMappingStmt: - retval = _copyCreateUserMappingStmt(from); - break; - case T_AlterUserMappingStmt: - retval = _copyAlterUserMappingStmt(from); - break; - case T_DropUserMappingStmt: - retval = _copyDropUserMappingStmt(from); - break; - case T_CreateStorageUserMappingStmt: - retval = _copyCreateStorageUserMappingStmt(from); - break; - case T_AlterStorageUserMappingStmt: - retval = _copyAlterStorageUserMappingStmt(from); - break; - case T_DropStorageUserMappingStmt: - retval = _copyDropStorageUserMappingStmt(from); - break; - case T_ImportForeignSchemaStmt: - retval = _copyImportForeignSchemaStmt(from); - break; - case T_AddForeignSegStmt: - retval = _copyAddForeignSegStmt(from); - break; - case T_CreatePolicyStmt: - retval = _copyCreatePolicyStmt(from); - break; - case T_AlterPolicyStmt: - retval = _copyAlterPolicyStmt(from); - break; - case T_CreateAmStmt: - retval = _copyCreateAmStmt(from); - break; - case T_CreateTrigStmt: - retval = _copyCreateTrigStmt(from); - break; - case T_CreateEventTrigStmt: - retval = _copyCreateEventTrigStmt(from); - break; - case T_AlterEventTrigStmt: - retval = _copyAlterEventTrigStmt(from); - break; - case T_CreatePLangStmt: - retval = _copyCreatePLangStmt(from); - break; - case T_CreateQueueStmt: - retval = _copyCreateQueueStmt(from); - break; - case T_AlterQueueStmt: - retval = _copyAlterQueueStmt(from); - break; - case T_DropQueueStmt: - retval = _copyDropQueueStmt(from); - break; - case T_CreateResourceGroupStmt: - retval = _copyCreateResourceGroupStmt(from); - break; - case T_DropResourceGroupStmt: - retval = _copyDropResourceGroupStmt(from); - break; - case T_AlterResourceGroupStmt: - retval = _copyAlterResourceGroupStmt(from); - break; - case T_CreateRoleStmt: - retval = _copyCreateRoleStmt(from); - break; - case T_AlterRoleStmt: - retval = _copyAlterRoleStmt(from); - break; - case T_AlterRoleSetStmt: - retval = _copyAlterRoleSetStmt(from); - break; - case T_DropRoleStmt: - retval = _copyDropRoleStmt(from); - break; - case T_CreateProfileStmt: - retval = _copyCreateProfileStmt(from); - break; - case T_AlterProfileStmt: - retval = _copyAlterProfileStmt(from); - break; - case T_DropProfileStmt: - retval = _copyDropProfileStmt(from); - break; - case T_DenyLoginPoint: - retval = _copyDenyLoginPoint(from); - break; - case T_DenyLoginInterval: - retval = _copyDenyLoginInterval(from); - break; - case T_CreateSeqStmt: - retval = _copyCreateSeqStmt(from); - break; - case T_AlterSeqStmt: - retval = _copyAlterSeqStmt(from); - break; - case T_DefineStmt: - retval = _copyDefineStmt(from); - break; - case T_CreateDomainStmt: - retval = _copyCreateDomainStmt(from); - break; - case T_CreateOpClassStmt: - retval = _copyCreateOpClassStmt(from); - break; - case T_CreateOpClassItem: - retval = _copyCreateOpClassItem(from); - break; - case T_CreateOpFamilyStmt: - retval = _copyCreateOpFamilyStmt(from); - break; - case T_AlterOpFamilyStmt: - retval = _copyAlterOpFamilyStmt(from); - break; - case T_CreateDirectoryTableStmt: - retval = _copyCreateDirectoryTableStmt(from); - break; - case T_AlterDirectoryTableStmt: - retval = _copyAlterDirectoryTableStmt(from); - break; - case T_DropStmt: - retval = _copyDropStmt(from); - break; - case T_DropDirectoryTableStmt: - retval = _copyDropDirectoryTableStmt(from); - break; - case T_TruncateStmt: - retval = _copyTruncateStmt(from); - break; - case T_CommentStmt: - retval = _copyCommentStmt(from); - break; - case T_SecLabelStmt: - retval = _copySecLabelStmt(from); - break; - case T_DeclareCursorStmt: - retval = _copyDeclareCursorStmt(from); - break; - case T_ClosePortalStmt: - retval = _copyClosePortalStmt(from); - break; - case T_FetchStmt: - retval = _copyFetchStmt(from); - break; - case T_IndexStmt: - retval = _copyIndexStmt(from); - break; - case T_CreateStatsStmt: - retval = _copyCreateStatsStmt(from); - break; - case T_StatsElem: - retval = _copyStatsElem(from); - break; - case T_AlterStatsStmt: - retval = _copyAlterStatsStmt(from); - break; - case T_CreateFunctionStmt: - retval = _copyCreateFunctionStmt(from); - break; - case T_FunctionParameter: - retval = _copyFunctionParameter(from); - break; - case T_AlterFunctionStmt: - retval = _copyAlterFunctionStmt(from); - break; - case T_DoStmt: - retval = _copyDoStmt(from); - break; - case T_CallStmt: - retval = _copyCallStmt(from); - break; - case T_RenameStmt: - retval = _copyRenameStmt(from); - break; - case T_AlterObjectDependsStmt: - retval = _copyAlterObjectDependsStmt(from); - break; - case T_AlterObjectSchemaStmt: - retval = _copyAlterObjectSchemaStmt(from); - break; - case T_AlterOwnerStmt: - retval = _copyAlterOwnerStmt(from); - break; - case T_AlterOperatorStmt: - retval = _copyAlterOperatorStmt(from); - break; - case T_AlterTypeStmt: - retval = _copyAlterTypeStmt(from); - break; - case T_RuleStmt: - retval = _copyRuleStmt(from); - break; - case T_NotifyStmt: - retval = _copyNotifyStmt(from); - break; - case T_ListenStmt: - retval = _copyListenStmt(from); - break; - case T_UnlistenStmt: - retval = _copyUnlistenStmt(from); - break; - case T_TransactionStmt: - retval = _copyTransactionStmt(from); - break; - case T_CompositeTypeStmt: - retval = _copyCompositeTypeStmt(from); - break; - case T_CreateEnumStmt: - retval = _copyCreateEnumStmt(from); - break; - case T_CreateRangeStmt: - retval = _copyCreateRangeStmt(from); - break; - case T_AlterEnumStmt: - retval = _copyAlterEnumStmt(from); - break; - case T_ViewStmt: - retval = _copyViewStmt(from); - break; - case T_LoadStmt: - retval = _copyLoadStmt(from); - break; - case T_CreatedbStmt: - retval = _copyCreatedbStmt(from); - break; - case T_AlterDatabaseStmt: - retval = _copyAlterDatabaseStmt(from); - break; - case T_AlterDatabaseRefreshCollStmt: - retval = _copyAlterDatabaseRefreshCollStmt(from); - break; - case T_AlterDatabaseSetStmt: - retval = _copyAlterDatabaseSetStmt(from); - break; - case T_DropdbStmt: - retval = _copyDropdbStmt(from); - break; - case T_AlterSystemStmt: - retval = _copyAlterSystemStmt(from); - break; - case T_ClusterStmt: - retval = _copyClusterStmt(from); - break; - case T_VacuumStmt: - retval = _copyVacuumStmt(from); - break; - case T_VacuumRelation: - retval = _copyVacuumRelation(from); - break; - case T_ExplainStmt: - retval = _copyExplainStmt(from); - break; - case T_CreateTableAsStmt: - retval = _copyCreateTableAsStmt(from); - break; - case T_RefreshMatViewStmt: - retval = _copyRefreshMatViewStmt(from); - break; - case T_CheckPointStmt: - retval = _copyCheckPointStmt(from); - break; - case T_DiscardStmt: - retval = _copyDiscardStmt(from); - break; - case T_LockStmt: - retval = _copyLockStmt(from); - break; - case T_ConstraintsSetStmt: - retval = _copyConstraintsSetStmt(from); - break; - case T_ReindexIndexInfo: - retval = _copyReindexIndexInfo(from); - break; - case T_ReindexStmt: - retval = _copyReindexStmt(from); - break; - case T_CreateConversionStmt: - retval = _copyCreateConversionStmt(from); - break; - case T_CreateCastStmt: - retval = _copyCreateCastStmt(from); - break; - case T_CreateTransformStmt: - retval = _copyCreateTransformStmt(from); - break; - case T_PrepareStmt: - retval = _copyPrepareStmt(from); - break; - case T_ExecuteStmt: - retval = _copyExecuteStmt(from); - break; - case T_DeallocateStmt: - retval = _copyDeallocateStmt(from); - break; - case T_DropOwnedStmt: - retval = _copyDropOwnedStmt(from); - break; - case T_ReassignOwnedStmt: - retval = _copyReassignOwnedStmt(from); - break; - case T_AlterTSDictionaryStmt: - retval = _copyAlterTSDictionaryStmt(from); - break; - case T_AlterTSConfigurationStmt: - retval = _copyAlterTSConfigurationStmt(from); - break; - case T_PublicationTable: - retval = _copyPublicationTable(from); - break; - case T_PublicationObjSpec: - retval = _copyPublicationObjSpec(from); - break; - case T_CreatePublicationStmt: - retval = _copyCreatePublicationStmt(from); - break; - case T_AlterPublicationStmt: - retval = _copyAlterPublicationStmt(from); - break; - case T_CreateSubscriptionStmt: - retval = _copyCreateSubscriptionStmt(from); - break; - case T_AlterSubscriptionStmt: - retval = _copyAlterSubscriptionStmt(from); - break; - case T_DropSubscriptionStmt: - retval = _copyDropSubscriptionStmt(from); - break; - case T_RetrieveStmt: - retval = _copyRetrieveStmt(from); - break; - case T_CreateWarehouseStmt: - retval = _copyCreateWarehouseStmt(from); - break; - case T_DropWarehouseStmt: - retval = _copyDropWarehouseStmt(from); - break; - case T_PathKey: - retval = _copyPathKey(from); - break; - case T_DistributionKey: - retval = _copyDistributionKey(from); - break; - case T_RestrictInfo: - retval = _copyRestrictInfo(from); - break; - case T_PlaceHolderVar: - retval = _copyPlaceHolderVar(from); - break; - case T_SpecialJoinInfo: - retval = _copySpecialJoinInfo(from); - break; - case T_AppendRelInfo: - retval = _copyAppendRelInfo(from); - break; - case T_PlaceHolderInfo: - retval = _copyPlaceHolderInfo(from); - break; - case T_GroupedVarInfo: - retval = _copyGroupedVarInfo(from); - break; - case T_SegfileMapNode: - retval = _copySegfileMapNode(from); - break; - case T_PlannedStmt: - retval = _copyPlannedStmt(from); - break; - case T_Flow: - retval = _copyFlow(from); - break; - case T_Result: - retval = _copyResult(from); - break; - case T_ProjectSet: - retval = _copyProjectSet(from); - break; - case T_ModifyTable: - retval = _copyModifyTable(from); - break; - case T_Append: - retval = _copyAppend(from); - break; - case T_MergeAppend: - retval = _copyMergeAppend(from); - break; - case T_Sequence: - retval = _copySequence(from); - break; - case T_RecursiveUnion: - retval = _copyRecursiveUnion(from); - break; - case T_BitmapAnd: - retval = _copyBitmapAnd(from); - break; - case T_BitmapOr: - retval = _copyBitmapOr(from); - break; - case T_SeqScan: - retval = _copySeqScan(from); - break; - case T_SampleScan: - retval = _copySampleScan(from); - break; - case T_IndexScan: - retval = _copyIndexScan(from); - break; - case T_DynamicIndexScan: - retval = _copyDynamicIndexScan(from); - break; - case T_IndexOnlyScan: - retval = _copyIndexOnlyScan(from); - break; - case T_DynamicIndexOnlyScan: - retval = _copyDynamicIndexOnlyScan(from); - break; - case T_BitmapIndexScan: - retval = _copyBitmapIndexScan(from); - break; - case T_DynamicBitmapIndexScan: - retval = _copyDynamicBitmapIndexScan(from); - break; - case T_BitmapHeapScan: - retval = _copyBitmapHeapScan(from); - break; - case T_DynamicBitmapHeapScan: - retval = _copyDynamicBitmapHeapScan(from); - break; - case T_DynamicSeqScan: - retval = _copyDynamicSeqScan(from); - break; - case T_TidScan: - retval = _copyTidScan(from); - break; - case T_TidRangeScan: - retval = _copyTidRangeScan(from); - break; - case T_SubqueryScan: - retval = _copySubqueryScan(from); - break; - case T_FunctionScan: - retval = _copyFunctionScan(from); - break; - case T_TableFunctionScan: - retval = _copyTableFunctionScan(from); - break; - case T_ValuesScan: - retval = _copyValuesScan(from); - break; - case T_TableFuncScan: - retval = _copyTableFuncScan(from); - break; - case T_CteScan: - retval = _copyCteScan(from); - break; - case T_NamedTuplestoreScan: - retval = _copyNamedTuplestoreScan(from); - break; - case T_WorkTableScan: - retval = _copyWorkTableScan(from); - break; - case T_ExternalScanInfo: - retval = _copyExternalScanInfo(from); - break; - case T_ForeignScan: - retval = _copyForeignScan(from); - break; - case T_DynamicForeignScan: - retval = _copyDynamicForeignScan(from); - break; - case T_CustomScan: - retval = _copyCustomScan(from); - break; - case T_NestLoop: - retval = _copyNestLoop(from); - break; - case T_NestLoopParam: - retval = _copyNestLoopParam(from); - break; - case T_MergeJoin: - retval = _copyMergeJoin(from); - break; - case T_HashJoin: - retval = _copyHashJoin(from); - break; - case T_ShareInputScan: - retval = _copyShareInputScan(from); - break; - case T_Material: - retval = _copyMaterial(from); - break; - case T_Memoize: - retval = _copyMemoize(from); - break; - case T_Sort: - retval = _copySort(from); - break; - case T_IncrementalSort: - retval = _copyIncrementalSort(from); - break; - case T_Group: - retval = _copyGroup(from); - break; - case T_Agg: - retval = _copyAgg(from); - break; - case T_TupleSplit: - retval = _copyTupleSplit(from); - break; - case T_WindowAgg: - retval = _copyWindowAgg(from); - break; - case T_Unique: - retval = _copyUnique(from); - break; - case T_Gather: - retval = _copyGather(from); - break; - case T_GatherMerge: - retval = _copyGatherMerge(from); - break; - case T_Hash: - retval = _copyHash(from); - break; - case T_RuntimeFilter: - retval = _copyRuntimeFilter(from); - break; - case T_SetOp: - retval = _copySetOp(from); - break; - case T_LockRows: - retval = _copyLockRows(from); - break; - case T_Limit: - retval = _copyLimit(from); - break; - case T_Motion: - retval = _copyMotion(from); - break; - case T_SplitUpdate: - retval = _copySplitUpdate(from); - break; - case T_SplitMerge: - retval = _copySplitMerge(from); - break; - case T_AssertOp: - retval = _copyAssertOp(from); - break; - case T_PlanRowMark: - retval = _copyPlanRowMark(from); - break; - case T_PartitionPruneInfo: - retval = _copyPartitionPruneInfo(from); - break; - case T_PartitionedRelPruneInfo: - retval = _copyPartitionedRelPruneInfo(from); - break; - case T_PartitionPruneStepOp: - retval = _copyPartitionPruneStepOp(from); - break; - case T_PartitionPruneStepCombine: - retval = _copyPartitionPruneStepCombine(from); - break; - case T_PlanInvalItem: - retval = _copyPlanInvalItem(from); - break; - case T_PartitionSelector: - retval = _copyPartitionSelector(from); - break; - case T_Bitmapset: - retval = _copyBitmapset(from); - break; - case T_ExtensibleNode: - retval = _copyExtensibleNode(from); - break; - case T_Integer: - retval = _copyInteger(from); - break; - case T_Float: - retval = _copyFloat(from); - break; - case T_Boolean: - retval = _copyBoolean(from); - break; - case T_String: - retval = _copyString(from); - break; - case T_BitString: - retval = _copyBitString(from); - break; - case T_ForeignKeyCacheInfo: - retval = _copyForeignKeyCacheInfo(from); - break; - case T_OidAssignment: - retval = _copyOidAssignment(from); - break; - case T_SliceTable: - retval = _copySliceTable(from); - break; - case T_CdbProcess: - retval = _copyCdbProcess(from); - break; - case T_CursorPosInfo: - retval = _copyCursorPosInfo(from); - break; - - case T_PathTarget: - retval = _copyPathTarget(from); - break; - case T_AlteredTableInfo: - retval = _copyAlteredTableInfo(from); - break; - - case T_CookedConstraint: - retval = _copyCookedConstraint(from); - break; - case T_WindowHashAgg: - retval = _copyWindowHashAgg(from); - break; diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl index d9244ca6739..74422b1e659 100755 --- a/src/backend/nodes/gen_node_support.pl +++ b/src/backend/nodes/gen_node_support.pl @@ -51,7 +51,6 @@ sub elem # able to make this list the only copy. For now, we just check that # it matches the list of files passed on the command line. my @all_input_files = qw( - catalog/gp_distribution_policy.h nodes/nodes.h nodes/primnodes.h nodes/parsenodes.h @@ -59,21 +58,33 @@ sub elem nodes/plannodes.h nodes/execnodes.h access/amapi.h + access/extprotocol.h + access/formatter.h access/sdir.h access/tableam.h access/tsmapi.h + access/tupdesc.h + catalog/heap.h + cdb/cdbgang.h commands/event_trigger.h + commands/explain_gp.h commands/trigger.h + executor/execdesc.h executor/tuptable.h foreign/fdwapi.h + nodes/altertablenodes.h nodes/bitmapset.h nodes/extensible.h nodes/lockoptions.h nodes/miscnodes.h nodes/replnodes.h nodes/supportnodes.h + nodes/tidbitmap.h nodes/value.h + utils/queryenvironment.h utils/rel.h + catalog/gp_distribution_policy.h + cdb/cdbpathlocus.h ); # Nodes from these input files are automatically treated as nodetag_only. @@ -83,17 +94,21 @@ sub elem my @nodetag_only_files = qw( nodes/execnodes.h access/amapi.h + access/extprotocol.h + access/formatter.h access/sdir.h access/tableam.h access/tsmapi.h commands/event_trigger.h + commands/explain_gp.h commands/trigger.h executor/tuptable.h foreign/fdwapi.h nodes/lockoptions.h nodes/miscnodes.h nodes/replnodes.h - nodes/supportnodes.h + nodes/supportnodes.h + nodes/tidbitmap.h ); # ARM ABI STABILITY CHECK HERE: @@ -108,7 +123,7 @@ sub elem # ABI stability during development. my $last_nodetag = 'WindowObjectData'; -my $last_nodetag_no = 557; +my $last_nodetag_no = 584; # output file names my @output_files; @@ -351,6 +366,10 @@ sub elem { push @no_read, $in_struct; } + elsif ($attr eq 'no_read_write') + { + push @no_read_write, $in_struct; + } elsif ($attr eq 'nodetag_only') { push @nodetag_only, $in_struct; @@ -474,6 +493,7 @@ sub elem equal_as_scalar equal_ignore equal_ignore_if_zero + copy_ignore query_jumble_ignore query_jumble_location read_write_ignore @@ -716,7 +736,7 @@ sub elem my $copy_as_field; my $copy_as_scalar = 0; my $equal_as_scalar = 0; - foreach my $a (@a) + foreach my $a (@a) { if ($a =~ /^array_size\(([\w.]+)\)$/) { @@ -742,6 +762,10 @@ sub elem { $equal_ignore = 1; } + elsif ($a eq 'copy_ignore') + { + $copy_ignore = 1; + } } # override type-specific copy method if requested @@ -864,6 +888,23 @@ sub elem # the table itself, just reference the original one. print $cff "\tCOPY_SCALAR_FIELD($f);\n" unless $copy_ignore; print $eff "\tCOMPARE_SCALAR_FIELD($f);\n" unless $equal_ignore; + } + elsif ($t eq 'bytea*') + { + print $cff "\tCOPY_VARLENA_FIELD($f, -1);\n" unless $copy_ignore; + print $eff "\tCOMPARE_VARLENA_FIELD($f, -1);\n" unless $equal_ignore; + } + elsif($t eq 'TupleDesc') + { + print $cff "\tnewnode->$f = CreateTupleDescCopyConstr(from->$f);\n" unless $copy_ignore; + } + elsif ($t eq 'ItemPointerData') + { + print $cff "\tCOPY_BINARY_FIELD($f, sizeof(ItemPointerData));\n" unless $copy_ignore; + } + elsif($t eq 'Relation') + { + } else { @@ -889,6 +930,720 @@ sub elem close $cfs; close $efs; + +# outfuncs.c, readfuncs.c + +push @output_files, 'outfuncs.funcs.c'; +open my $off, '>', "$output_path/outfuncs.funcs.c$tmpext" or die $!; +push @output_files, 'readfuncs.funcs.c'; +open my $rff, '>', "$output_path/readfuncs.funcs.c$tmpext" or die $!; +push @output_files, 'outfuncs.switch.c'; +open my $ofs, '>', "$output_path/outfuncs.switch.c$tmpext" or die $!; +push @output_files, 'readfuncs.switch.c'; +open my $rfs, '>', "$output_path/readfuncs.switch.c$tmpext" or die $!; + +printf $off $header_comment, 'outfuncs.funcs.c'; +printf $rff $header_comment, 'readfuncs.funcs.c'; +printf $ofs $header_comment, 'outfuncs.switch.c'; +printf $rfs $header_comment, 'readfuncs.switch.c'; + +print $off $node_includes; +print $rff $node_includes; + + +push @output_files, 'outfast.funcs.c'; +open my $ofaf, '>', "$output_path/outfast.funcs.c$tmpext" or die $!; +push @output_files, 'readfast.funcs.c'; +open my $rfaf, '>', "$output_path/readfast.funcs.c$tmpext" or die $!; +push @output_files, 'outfast.switch.c'; +open my $ofas, '>', "$output_path/outfast.switch.c$tmpext" or die $!; +push @output_files, 'readfast.switch.c'; +open my $rfas, '>', "$output_path/readfast.switch.c$tmpext" or die $!; + +printf $ofaf $header_comment, 'outfast.funcs.c'; +printf $rfaf $header_comment, 'readfast.funcs.c'; +printf $ofas $header_comment, 'outfast.switch.c'; +printf $rfas $header_comment, 'readfast.switch.c'; + +print $ofaf $node_includes; +print $rfaf $node_includes; + +foreach my $n (@node_types) +{ + next if elem $n, @abstract_types; + next if elem $n, @nodetag_only; + next if elem $n, @no_read_write; + next if elem $n, @special_read_write; + + my $no_read = (elem $n, @no_read); + + # output format starts with upper case node type name + my $N = uc $n; + + print $ofs "\t\t\tcase T_${n}:\n" + . "\t\t\t\t_out${n}(str, obj);\n" + . "\t\t\t\tbreak;\n"; + + print $rfs "\tif (MATCH(\"$N\", " + . length($N) . "))\n" + . "\t\treturn (Node *) _read${n}();\n" + unless $no_read; + + # for out and read fast + print $ofas "\t\t\tcase T_${n}:\n" + . "\t\t\t\t_out${n}(str, obj);\n" + . "\t\t\t\tbreak;\n"; + + print $rfas "\t\t\tcase T_${n}:\n" + . "\t\t\t\treturn_value = _read${n}();\n" + . "\t\t\t\tbreak;\n" + unless $no_read; + + next if elem $n, @custom_read_write; + + print $off " +static void +_out${n}(StringInfo str, const $n *node) +{ +\tWRITE_NODE_TYPE(\"$N\"); + +"; + # for out fast + print $ofaf " +static void +_out${n}(StringInfo str, const $n *node) +{ +\tWRITE_NODE_TYPE(\"$N\"); + +"; + + if (!$no_read) + { + my $macro = + (@{ $node_type_info{$n}->{fields} } > 0) + ? 'READ_LOCALS' + : 'READ_LOCALS_NO_FIELDS'; + print $rff " +static $n * +_read${n}(void) +{ +\t$macro($n); + +"; + + # for read fast + my $macro = + (@{ $node_type_info{$n}->{fields} } > 0) + ? 'READ_LOCALS' + : 'READ_LOCALS_NO_FIELDS'; + print $rfaf " +static $n * +_read${n}(void) +{ +\t$macro($n); + +"; + } + + # track already-processed fields to support field order checks + # (this isn't quite redundant with the previous loop, since + # we may be considering structs that lack copy/equal support) + my %previous_fields; + + # print instructions for each field + foreach my $f (@{ $node_type_info{$n}->{fields} }) + { + my $t = $node_type_info{$n}->{field_types}{$f}; + my @a = @{ $node_type_info{$n}->{field_attrs}{$f} }; + + # extract per-field attributes + my $array_size_field; + my $read_as_field; + my $read_write_ignore = 0; + foreach my $a (@a) + { + if ($a =~ /^array_size\(([\w.]+)\)$/) + { + $array_size_field = $1; + # insist that we read the array size first! + die + "array size field $array_size_field for field $n.$f must precede $f\n" + if (!$previous_fields{$array_size_field} && !$no_read); + } + elsif ($a =~ /^read_as\(([\w.]+)\)$/) + { + $read_as_field = $1; + } + elsif ($a eq 'read_write_ignore') + { + $read_write_ignore = 1; + } + } + + if ($read_write_ignore) + { + # nothing to do if no_read + next if $no_read; + # for read_write_ignore with read_as(), emit the appropriate + # assignment on the read side and move on. + if (defined $read_as_field) + { + print $rff "\tlocal_node->$f = $read_as_field;\n"; + + #for read fast + print $rfaf "\tlocal_node->$f = $read_as_field;\n"; + next; + } + # else, bad specification + die "$n.$f must not be marked read_write_ignore\n"; + } + + # select instructions by field type + if ($t eq 'bool') + { + print $off "\tWRITE_BOOL_FIELD($f);\n"; + print $rff "\tREAD_BOOL_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_BOOL_FIELD($f);\n"; + print $rfaf "\tREAD_BOOL_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'int' && $f =~ 'location$') + { + print $off "\tWRITE_LOCATION_FIELD($f);\n"; + print $rff "\tREAD_LOCATION_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_LOCATION_FIELD($f);\n"; + print $rfaf "\tREAD_LOCATION_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'int' + || $t eq 'int8' + || $t eq 'int16' + || $t eq 'int32' + || $t eq 'AttrNumber' + || $t eq 'StrategyNumber') + { + print $off "\tWRITE_INT_FIELD($f);\n"; + print $rff "\tREAD_INT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_INT_FIELD($f);\n"; + print $rfaf "\tREAD_INT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'int64') + { + print $off "\tWRITE_LONG_FIELD($f);\n"; + print $rff "\tREAD_LONG_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_LONG_FIELD($f);\n"; + print $rfaf "\tREAD_LONG_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'uint32' + || $t eq 'uint8' + || $t eq 'bits32' + || $t eq 'BlockNumber' + || $t eq 'Index' + || $t eq 'SubTransactionId') + { + print $off "\tWRITE_UINT_FIELD($f);\n"; + print $rff "\tREAD_UINT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_UINT_FIELD($f);\n"; + print $rfaf "\tREAD_UINT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'uint64' + || $t eq 'AclMode') + { + print $off "\tWRITE_UINT64_FIELD($f);\n"; + print $rff "\tREAD_UINT64_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_UINT64_FIELD($f);\n"; + print $rfaf "\tREAD_UINT64_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'Oid' || $t eq 'RelFileNumber') + { + print $off "\tWRITE_OID_FIELD($f);\n"; + print $rff "\tREAD_OID_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_OID_FIELD($f);\n"; + print $rfaf "\tREAD_OID_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'long') + { + print $off "\tWRITE_LONG_FIELD($f);\n"; + print $rff "\tREAD_LONG_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_LONG_FIELD($f);\n"; + print $rfaf "\tREAD_LONG_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'char') + { + print $off "\tWRITE_CHAR_FIELD($f);\n"; + print $rff "\tREAD_CHAR_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_CHAR_FIELD($f);\n"; + print $rfaf "\tREAD_CHAR_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'double') + { + print $off "\tWRITE_FLOAT_FIELD($f);\n"; + print $rff "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_FLOAT_FIELD($f);\n"; + print $rfaf "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'Cardinality') + { + print $off "\tWRITE_FLOAT_FIELD($f);\n"; + print $rff "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_FLOAT_FIELD($f);\n"; + print $rfaf "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'Cost') + { + print $off "\tWRITE_FLOAT_FIELD($f);\n"; + print $rff "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_FLOAT_FIELD($f);\n"; + print $rfaf "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'QualCost') + { + print $off "\tWRITE_FLOAT_FIELD($f.startup);\n"; + print $off "\tWRITE_FLOAT_FIELD($f.per_tuple);\n"; + print $rff "\tREAD_FLOAT_FIELD($f.startup);\n" unless $no_read; + print $rff "\tREAD_FLOAT_FIELD($f.per_tuple);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_FLOAT_FIELD($f.startup);\n"; + print $ofaf "\tWRITE_FLOAT_FIELD($f.per_tuple);\n"; + print $rfaf "\tREAD_FLOAT_FIELD($f.startup);\n" unless $no_read; + print $rfaf "\tREAD_FLOAT_FIELD($f.per_tuple);\n" unless $no_read; + } + elsif ($t eq 'Selectivity') + { + print $off "\tWRITE_FLOAT_FIELD($f);\n"; + print $rff "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_FLOAT_FIELD($f);\n"; + print $rfaf "\tREAD_FLOAT_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'char*') + { + print $off "\tWRITE_STRING_FIELD($f);\n"; + print $rff "\tREAD_STRING_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_STRING_FIELD($f);\n"; + print $rfaf "\tREAD_STRING_FIELD($f);\n" unless $no_read; + } + elsif ($t eq 'Bitmapset*' || $t eq 'Relids') + { + print $off "\tWRITE_BITMAPSET_FIELD($f);\n"; + print $rff "\tREAD_BITMAPSET_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_BITMAPSET_FIELD($f);\n"; + print $rfaf "\tREAD_BITMAPSET_FIELD($f);\n" unless $no_read; + } + elsif (elem $t, @enum_types) + { + print $off "\tWRITE_ENUM_FIELD($f, $t);\n"; + print $rff "\tREAD_ENUM_FIELD($f, $t);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_ENUM_FIELD($f, $t);\n"; + print $rfaf "\tREAD_ENUM_FIELD($f, $t);\n" unless $no_read; + } + # arrays of scalar types + elsif ($t =~ /^(\w+)(\*|\[\w+\])$/ and elem $1, @scalar_types) + { + my $tt = uc $1; + if (!defined $array_size_field) + { + die "no array size defined for $n.$f of type $t\n"; + } + if ($node_type_info{$n}->{field_types}{$array_size_field} eq + 'List*') + { + print $off + "\tWRITE_${tt}_ARRAY($f, list_length(node->$array_size_field));\n"; + print $rff + "\tREAD_${tt}_ARRAY($f, list_length(local_node->$array_size_field));\n" + unless $no_read; + + # for out and read fast + print $ofaf + "\tWRITE_${tt}_ARRAY($f, list_length(node->$array_size_field));\n"; + print $rfaf + "\tREAD_${tt}_ARRAY($f, list_length(local_node->$array_size_field));\n" + unless $no_read; + } + else + { + print $off + "\tWRITE_${tt}_ARRAY($f, node->$array_size_field);\n"; + print $rff + "\tREAD_${tt}_ARRAY($f, local_node->$array_size_field);\n" + unless $no_read; + + # for out and read fast + print $ofaf + "\tWRITE_${tt}_ARRAY($f, node->$array_size_field);\n"; + print $rfaf + "\tREAD_${tt}_ARRAY($f, local_node->$array_size_field);\n" + unless $no_read; + } + } + elsif ($t eq 'function pointer') + { + # We don't print these, and we can't read them either + die "cannot read function pointer in struct \"$n\" field \"$f\"\n" + unless $no_read; + } + # Special treatments of several Path node fields + elsif ($t eq 'RelOptInfo*' && elem 'write_only_relids', @a) + { + print $off + "\tappendStringInfoString(str, \" :parent_relids \");\n" + . "\toutBitmapset(str, node->$f->relids);\n"; + + # for out and read fast + print $ofaf + "\tappendStringInfoString(str, \" :parent_relids \");\n" + . "\toutBitmapset(str, node->$f->relids);\n"; + } + elsif ($t eq 'PathTarget*' && elem 'write_only_nondefault_pathtarget', + @a) + { + (my $f2 = $f) =~ s/pathtarget/parent/; + print $off "\tif (node->$f != node->$f2->reltarget)\n" + . "\t\tWRITE_NODE_FIELD($f);\n"; + + # for out and read fast + print $ofaf "\tif (node->$f != node->$f2->reltarget)\n" + . "\t\tWRITE_NODE_FIELD($f);\n"; + } + elsif ($t eq 'ParamPathInfo*' && elem 'write_only_req_outer', @a) + { + print $off + "\tappendStringInfoString(str, \" :required_outer \");\n" + . "\tif (node->$f)\n" + . "\t\toutBitmapset(str, node->$f->ppi_req_outer);\n" + . "\telse\n" + . "\t\toutBitmapset(str, NULL);\n"; + + # for out and read fast + print $ofaf + "\tappendStringInfoString(str, \" :required_outer \");\n" + . "\tif (node->$f)\n" + . "\t\toutBitmapset(str, node->$f->ppi_req_outer);\n" + . "\telse\n" + . "\t\toutBitmapset(str, NULL);\n"; + } + # node type + elsif (($t =~ /^(\w+)\*$/ or $t =~ /^struct\s+(\w+)\*$/) + and elem $1, @node_types) + { + die + "node type \"$1\" lacks write support, which is required for struct \"$n\" field \"$f\"\n" + if (elem $1, @no_read_write or elem $1, @nodetag_only); + die + "node type \"$1\" lacks read support, which is required for struct \"$n\" field \"$f\"\n" + if (elem $1, @no_read or elem $1, @nodetag_only) + and !$no_read; + + print $off "\tWRITE_NODE_FIELD($f);\n"; + print $rff "\tREAD_NODE_FIELD($f);\n" unless $no_read; + + # for out and read fast + print $ofaf "\tWRITE_NODE_FIELD($f);\n"; + print $rfaf "\tREAD_NODE_FIELD($f);\n" unless $no_read; + } + # arrays of node pointers (currently supported for write only) + elsif (($t =~ /^(\w+)\*\*$/ or $t =~ /^struct\s+(\w+)\*\*$/) + and elem($1, @node_types)) + { + if (!defined $array_size_field) + { + die "no array size defined for $n.$f of type $t\n"; + } + if ($node_type_info{$n}->{field_types}{$array_size_field} eq + 'List*') + { + print $off + "\tWRITE_NODE_ARRAY($f, list_length(node->$array_size_field));\n"; + print $rff + "\tREAD_NODE_ARRAY($f, list_length(local_node->$array_size_field));\n" + unless $no_read; + + # for out and read fast + print $ofaf + "\tWRITE_NODE_ARRAY($f, list_length(node->$array_size_field));\n"; + print $rfaf + "\tREAD_NODE_ARRAY($f, list_length(local_node->$array_size_field));\n" + unless $no_read; + } + else + { + print $off + "\tWRITE_NODE_ARRAY($f, node->$array_size_field);\n"; + print $rff + "\tREAD_NODE_ARRAY($f, local_node->$array_size_field);\n" + unless $no_read; + + # for out and read fast + print $ofaf + "\tWRITE_NODE_ARRAY($f, node->$array_size_field);\n"; + print $rfaf + "\tREAD_NODE_ARRAY($f, local_node->$array_size_field);\n" + unless $no_read; + } + } + elsif ($t eq 'struct CustomPathMethods*' + || $t eq 'struct CustomScanMethods*') + { + print $off q{ + /* CustomName is a key to lookup CustomScanMethods */ + appendStringInfoString(str, " :methods "); + outToken(str, node->methods->CustomName); +}; + print $rff q! + { + /* Lookup CustomScanMethods by CustomName */ + char *custom_name; + const CustomScanMethods *methods; + token = pg_strtok(&length); /* skip methods: */ + token = pg_strtok(&length); /* CustomName */ + custom_name = nullable_string(token, length); + methods = GetCustomScanMethods(custom_name, false); + local_node->methods = methods; + } +! unless $no_read; + + # for out and read fast + print $ofaf q{ + /* CustomName is a key to lookup CustomScanMethods */ + appendStringInfoString(str, " :methods "); + outToken(str, node->methods->CustomName); +}; + print $rfaf q! + { + /* Lookup CustomScanMethods by CustomName */ + char *custom_name; + const CustomScanMethods *methods; + READ_STRING_VAR(custom_name); + /* find custom scan methods from hash table. */ + methods = GetCustomScanMethods(custom_name, false); + local_node->methods = methods; + } +! unless $no_read; + } + elsif($t eq 'bytea*') + { + print $ofaf + "\tWRITE_BYTEA_FIELD($f);\n"; + print $rfaf + "\tREAD_BYTEA_FIELD($f);\n" + unless $no_read; + } + elsif($t eq 'CdbPathLocus') + { + print $off + "\t_outCdbPathLocus(str, &node->$f);\n"; + + # for out and read fast + print $ofaf + "\t_outCdbPathLocus(str, &node->$f);\n"; + } + elsif($t eq 'ItemPointerData') + { + print $off + "\tWRITE_UINT_FIELD($f.ip_blkid.bi_hi); + \tWRITE_UINT_FIELD($f.ip_blkid.bi_lo); + \tWRITE_UINT_FIELD($f.ip_posid);\n"; + print $rff + "\tREAD_UINT_FIELD($f.ip_blkid.bi_hi); + \tREAD_UINT_FIELD($f.ip_blkid.bi_lo); + \tREAD_UINT_FIELD($f.ip_posid);\n" + unless $no_read; + + # for out and read fast + print $ofaf + "\tWRITE_UINT_FIELD($f.ip_blkid.bi_hi); + \tWRITE_UINT_FIELD($f.ip_blkid.bi_lo); + \tWRITE_UINT_FIELD($f.ip_posid);\n"; + print $rfaf + "\tREAD_UINT_FIELD($f.ip_blkid.bi_hi); + \tREAD_UINT_FIELD($f.ip_blkid.bi_lo); + \tREAD_UINT_FIELD($f.ip_posid);\n" + unless $no_read; + } + elsif($t eq 'TupleDesc') + { + print $ofaf "\tfor (int i = 0; i < node->$f->natts; i++) + \tappendBinaryStringInfo(str, (char *) &node->$f->attrs[i], ATTRIBUTE_FIXED_PART_SIZE);\n"; + print $rfaf "\tlocal_node->tuple = CreateTemplateTupleDesc(local_node->natts); + if (local_node->$f->natts > 0) + { + int i = 0; + for (; i < local_node->$f->natts; i++) + { + memcpy(&local_node->$f->attrs[i], read_str_ptr, ATTRIBUTE_FIXED_PART_SIZE); + read_str_ptr+=ATTRIBUTE_FIXED_PART_SIZE; + } + }\n" + unless $no_read; + } + else + { + die + "could not handle type \"$t\" in struct \"$n\" field \"$f\"\n"; + } + + # for read_as() without read_write_ignore, we have to read the value + # that outfuncs.c wrote and then overwrite it. + if (defined $read_as_field) + { + print $rff "\tlocal_node->$f = $read_as_field;\n" unless $no_read; + + # for out and read fast + print $rff "\tlocal_node->$f = $read_as_field;\n" unless $no_read; + } + + $previous_fields{$f} = 1; + } + + print $off "} +"; + print $rff " +\tREAD_DONE(); +} +" unless $no_read; + + # for out and read fast + print $ofaf "} +"; + print $rfaf " +\tREAD_DONE(); +} +" unless $no_read; +} + +close $off; +close $rff; +close $ofs; +close $rfs; + + +# queryjumblefuncs.c + +push @output_files, 'queryjumblefuncs.funcs.c'; +open my $jff, '>', "$output_path/queryjumblefuncs.funcs.c$tmpext" or die $!; +push @output_files, 'queryjumblefuncs.switch.c'; +open my $jfs, '>', "$output_path/queryjumblefuncs.switch.c$tmpext" or die $!; + +printf $jff $header_comment, 'queryjumblefuncs.funcs.c'; +printf $jfs $header_comment, 'queryjumblefuncs.switch.c'; + +print $jff $node_includes; + +foreach my $n (@node_types) +{ + next if elem $n, @abstract_types; + next if elem $n, @nodetag_only; + my $struct_no_query_jumble = (elem $n, @no_query_jumble); + + print $jfs "\t\t\tcase T_${n}:\n" + . "\t\t\t\t_jumble${n}(jstate, expr);\n" + . "\t\t\t\tbreak;\n" + unless $struct_no_query_jumble; + + next if elem $n, @custom_query_jumble; + + print $jff " +static void +_jumble${n}(JumbleState *jstate, Node *node) +{ +\t${n} *expr = (${n} *) node;\n +" unless $struct_no_query_jumble; + + # print instructions for each field + foreach my $f (@{ $node_type_info{$n}->{fields} }) + { + my $t = $node_type_info{$n}->{field_types}{$f}; + my @a = @{ $node_type_info{$n}->{field_attrs}{$f} }; + my $query_jumble_ignore = $struct_no_query_jumble; + my $query_jumble_location = 0; + + # extract per-field attributes + foreach my $a (@a) + { + if ($a eq 'query_jumble_ignore') + { + $query_jumble_ignore = 1; + } + elsif ($a eq 'query_jumble_location') + { + $query_jumble_location = 1; + } + } + + # node type + if (($t =~ /^(\w+)\*$/ or $t =~ /^struct\s+(\w+)\*$/) + and elem $1, @node_types) + { + print $jff "\tJUMBLE_NODE($f);\n" + unless $query_jumble_ignore; + } + elsif ($t eq 'int' && $f =~ 'location$') + { + # Track the node's location only if directly requested. + if ($query_jumble_location) + { + print $jff "\tJUMBLE_LOCATION($f);\n" + unless $query_jumble_ignore; + } + } + elsif ($t eq 'char*') + { + print $jff "\tJUMBLE_STRING($f);\n" + unless $query_jumble_ignore; + } + else + { + print $jff "\tJUMBLE_FIELD($f);\n" + unless $query_jumble_ignore; + } + } + + # Some nodes have no attributes like CheckPointStmt, + # so tweak things for empty contents. + if (scalar(@{ $node_type_info{$n}->{fields} }) == 0) + { + print $jff "\t(void) expr;\n" + unless $struct_no_query_jumble; + } + + print $jff "} +" unless $struct_no_query_jumble; +} + +close $jff; +close $jfs; + # now rename the temporary files to their final names foreach my $file (@output_files) { diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index ec2ad3b889a..3b1282f7036 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -3036,7 +3036,6 @@ expression_tree_mutator_impl(Node *node, case T_NextValueExpr: case T_RangeTblRef: case T_String: - case T_Null: case T_CTESearchClause: return (Node *) copyObject(node); case T_WithCheckOption: diff --git a/src/backend/nodes/outfast.c b/src/backend/nodes/outfast.c index f31bfa87045..ed3d3fe9cba 100644 --- a/src/backend/nodes/outfast.c +++ b/src/backend/nodes/outfast.c @@ -33,8 +33,11 @@ #include #include "lib/stringinfo.h" +#include "nodes/extensible.h" +#include "nodes/altertablenodes.h" #include "nodes/params.h" #include "nodes/parsenodes.h" +#include "nodes/pathnodes.h" #include "nodes/plannodes.h" #include "utils/datum.h" #include "utils/expandeddatum.h" @@ -215,8 +218,18 @@ } \ } -static void _outNode(StringInfo str, void *obj); +/* Write an Oid array */ +#define WRITE_INDEX_ARRAY(fldname, count) \ + if ( (count) > 0 && node->fldname) \ + { \ + int i; \ + for(i = 0; i < (count); i++) \ + { \ + appendBinaryStringInfo(str, (const char *)&node->fldname[i], sizeof(Index)); \ + } \ + } +static void _outNode(StringInfo str, void *obj); #define outDatum(str, value, typlen, typbyval) _outDatum(str, value, typlen, typbyval) static void @@ -324,152 +337,111 @@ _outDatum(StringInfo str, Datum value, int typlen, bool typbyval) } } -#define COMPILING_BINARY_FUNCS -#include "outfuncs.c" - -/***************************************************************************** - * - * Stuff from primnodes.h. - * - *****************************************************************************/ - static void -_outConst(StringInfo str, Const *node) +_outCdbPathLocus(StringInfo str, const CdbPathLocus *node) { - WRITE_NODE_TYPE("CONST"); - - WRITE_OID_FIELD(consttype); - WRITE_INT_FIELD(consttypmod); - WRITE_OID_FIELD(constcollid); - WRITE_INT_FIELD(constlen); - WRITE_BOOL_FIELD(constbyval); - WRITE_BOOL_FIELD(constisnull); - WRITE_LOCATION_FIELD(location); - - if (!node->constisnull) - _outDatum(str, node->constvalue, node->constlen, node->constbyval); + WRITE_ENUM_FIELD(locustype, CdbLocusType); + WRITE_NODE_FIELD(distkey); + WRITE_INT_FIELD(numsegments); } + static void -_outBoolExpr(StringInfo str, BoolExpr *node) +_outInteger(StringInfo str, const Integer *node) { - WRITE_NODE_TYPE("BOOLEXPR"); - WRITE_ENUM_FIELD(boolop, BoolExprType); - - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); + int16 vt = T_Integer; + appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16)); + appendBinaryStringInfo(str, (const char *)&node->ival, sizeof(int)); } -/***************************************************************************** - * - * Stuff from extensible.h - * - *****************************************************************************/ static void -_outExtensibleNode(StringInfo str, const ExtensibleNode *node) +_outFloat(StringInfo str, const Float *node) { - const ExtensibleNodeMethods *methods; - StringInfoData buf; - initStringInfo(&buf); + int16 vt = T_Float; + int slen; - methods = GetExtensibleNodeMethods(node->extnodename, false); + appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); + slen = (node->fval != NULL ? strlen(node->fval) : 0); + appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); + if (slen > 0) + appendBinaryStringInfo(str, node->fval, slen); +} - WRITE_NODE_TYPE("EXTENSIBLENODE"); +static void +_outBoolean(StringInfo str, const Boolean *node) +{ + int16 vt = T_Boolean; + appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16)); + appendBinaryStringInfo(str, (const char *)&node->boolval, sizeof(bool)); +} - WRITE_STRING_FIELD(extnodename); - /* serialize the private fields */ - methods->nodeOut(&buf, node); +static void +_outString(StringInfo str, const String *node) +{ + int16 vt = T_String; + int slen; - WRITE_STRING_VAR(buf.data); + appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); + slen = (node->sval != NULL ? strlen(node->sval) : 0); + appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); + if (slen > 0) + appendBinaryStringInfo(str, node->sval, slen); } -/***************************************************************************** - * - * Stuff from parsenodes.h. - * - *****************************************************************************/ - static void -_outCreateExtensionStmt(StringInfo str, CreateExtensionStmt *node) +_outBitString(StringInfo str, const BitString *node) { - WRITE_NODE_TYPE("CREATEEXTENSIONSTMT"); - WRITE_STRING_FIELD(extname); - WRITE_BOOL_FIELD(if_not_exists); - WRITE_NODE_FIELD(options); - WRITE_ENUM_FIELD(create_ext_state, CreateExtensionState); + int16 vt = T_BitString; + int slen; + + appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); + slen = (node->bsval != NULL ? strlen(node->bsval) : 0); + appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); + if (slen > 0) + appendBinaryStringInfo(str, node->bsval, slen); } static void -_outRoleSpec(StringInfo str, const RoleSpec *node) +_outA_Const(StringInfo str, A_Const *node) { - WRITE_NODE_TYPE("ROLESPEC"); - - WRITE_ENUM_FIELD(roletype, RoleSpecType); - WRITE_STRING_FIELD(rolename); + WRITE_NODE_TYPE("A_CONST"); + WRITE_BOOL_FIELD(isnull); + if (!node->isnull) + _outNode(str, &node->val); WRITE_LOCATION_FIELD(location); } static void -_outAlterDefaultPrivilegesStmt(StringInfo str, AlterDefaultPrivilegesStmt *node) +_outConst(StringInfo str, Const *node) { - WRITE_NODE_TYPE("ALTERDEFAULTPRIVILEGESSTMT"); - WRITE_NODE_FIELD(options); - WRITE_NODE_FIELD(action); + WRITE_NODE_TYPE("CONST"); + + WRITE_OID_FIELD(consttype); + WRITE_INT_FIELD(consttypmod); + WRITE_OID_FIELD(constcollid); + WRITE_INT_FIELD(constlen); + WRITE_BOOL_FIELD(constbyval); + WRITE_BOOL_FIELD(constisnull); + WRITE_LOCATION_FIELD(location); + + if (!node->constisnull) + _outDatum(str, node->constvalue, node->constlen, node->constbyval); } static void -_outQuery(StringInfo str, Query *node) +_outBoolExpr(StringInfo str, BoolExpr *node) { - WRITE_NODE_TYPE("QUERY"); - - WRITE_ENUM_FIELD(commandType, CmdType); - WRITE_ENUM_FIELD(querySource, QuerySource); - WRITE_BOOL_FIELD(canSetTag); - WRITE_NODE_FIELD(utilityStmt); - WRITE_INT_FIELD(resultRelation); - WRITE_BOOL_FIELD(hasAggs); - WRITE_BOOL_FIELD(hasWindowFuncs); - WRITE_BOOL_FIELD(hasSubLinks); - WRITE_BOOL_FIELD(hasDynamicFunctions); - WRITE_BOOL_FIELD(hasFuncsWithExecRestrictions); - WRITE_BOOL_FIELD(hasDistinctOn); - WRITE_BOOL_FIELD(hasRecursive); - WRITE_BOOL_FIELD(hasModifyingCTE); - WRITE_BOOL_FIELD(hasForUpdate); - WRITE_BOOL_FIELD(hasRowSecurity); - WRITE_BOOL_FIELD(canOptSelectLockingClause); - WRITE_NODE_FIELD(cteList); - WRITE_NODE_FIELD(rtable); - WRITE_NODE_FIELD(rteperminfos); - WRITE_NODE_FIELD(jointree); - WRITE_NODE_FIELD(mergeActionList); - WRITE_BOOL_FIELD(mergeUseOuterJoin); - WRITE_NODE_FIELD(targetList); - WRITE_NODE_FIELD(withCheckOptions); - WRITE_NODE_FIELD(onConflict); - WRITE_NODE_FIELD(returningList); - WRITE_NODE_FIELD(groupClause); - WRITE_NODE_FIELD(groupingSets); - WRITE_NODE_FIELD(havingQual); - WRITE_NODE_FIELD(windowClause); - WRITE_NODE_FIELD(distinctClause); - WRITE_NODE_FIELD(sortClause); - WRITE_NODE_FIELD(scatterClause); - WRITE_BOOL_FIELD(isTableValueSelect); - WRITE_NODE_FIELD(limitOffset); - WRITE_NODE_FIELD(limitCount); - WRITE_NODE_FIELD(rowMarks); - WRITE_NODE_FIELD(setOperations); - WRITE_NODE_FIELD(constraintDeps); - WRITE_BOOL_FIELD(parentStmtType); + WRITE_NODE_TYPE("BOOLEXPR"); + WRITE_ENUM_FIELD(boolop, BoolExprType); - /* Don't serialize policy */ + WRITE_NODE_FIELD(args); + WRITE_LOCATION_FIELD(location); } static void -_outAExpr(StringInfo str, A_Expr *node) +_outA_Expr(StringInfo str, A_Expr *node) { WRITE_NODE_TYPE("AEXPR"); WRITE_ENUM_FIELD(kind, A_Expr_Kind); @@ -547,334 +519,648 @@ _outAExpr(StringInfo str, A_Expr *node) } static void -_outInteger(StringInfo str, const Integer *node) +_outColumnDef(StringInfo str, const ColumnDef *node) { - int16 vt = T_Integer; - appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16)); - appendBinaryStringInfo(str, (const char *)&node->ival, sizeof(int)); -} + WRITE_NODE_TYPE("COLUMNDEF"); + WRITE_STRING_FIELD(colname); + WRITE_NODE_FIELD(typeName); + WRITE_STRING_FIELD(compression); + WRITE_INT_FIELD(inhcount); + WRITE_BOOL_FIELD(is_local); + WRITE_BOOL_FIELD(is_not_null); + WRITE_BOOL_FIELD(is_from_type); + WRITE_INT_FIELD(attnum); + WRITE_INT_FIELD(storage); + WRITE_STRING_FIELD(storage_name); + WRITE_NODE_FIELD(raw_default); + WRITE_NODE_FIELD(cooked_default); + + WRITE_BOOL_FIELD(hasCookedMissingVal); + WRITE_BOOL_FIELD(missingIsNull); + if (node->hasCookedMissingVal && !node->missingIsNull) + outDatum(str, node->missingVal, -1, false); + + WRITE_CHAR_FIELD(identity); + WRITE_NODE_FIELD(identitySequence); + WRITE_CHAR_FIELD(generated); + WRITE_NODE_FIELD(collClause); + WRITE_OID_FIELD(collOid); + WRITE_NODE_FIELD(constraints); + WRITE_NODE_FIELD(encoding); + WRITE_NODE_FIELD(fdwoptions); + WRITE_LOCATION_FIELD(location); +} static void -_outFloat(StringInfo str, const Float *node) +_outRangeTblEntry(StringInfo str, const RangeTblEntry *node) { - int16 vt = T_Float; - int slen; + WRITE_NODE_TYPE("RTE"); - appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); - slen = (node->fval != NULL ? strlen(node->fval) : 0); - appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); - if (slen > 0) - appendBinaryStringInfo(str, node->fval, slen); + /* put alias + eref first to make dump more legible */ + WRITE_NODE_FIELD(alias); + WRITE_NODE_FIELD(eref); + WRITE_ENUM_FIELD(rtekind, RTEKind); + WRITE_BOOL_FIELD(relisivm); + + switch (node->rtekind) + { + case RTE_RELATION: + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + WRITE_INT_FIELD(rellockmode); + WRITE_NODE_FIELD(tablesample); + WRITE_UINT_FIELD(perminfoindex); + break; + case RTE_SUBQUERY: + WRITE_NODE_FIELD(subquery); + WRITE_BOOL_FIELD(security_barrier); + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + WRITE_INT_FIELD(rellockmode); + WRITE_UINT_FIELD(perminfoindex); + break; + case RTE_JOIN: + WRITE_ENUM_FIELD(jointype, JoinType); + WRITE_INT_FIELD(joinmergedcols); + WRITE_NODE_FIELD(joinaliasvars); + WRITE_NODE_FIELD(joinleftcols); + WRITE_NODE_FIELD(joinrightcols); + WRITE_NODE_FIELD(join_using_alias); + break; + case RTE_FUNCTION: + WRITE_NODE_FIELD(functions); + WRITE_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNCTION: + WRITE_NODE_FIELD(subquery); + WRITE_NODE_FIELD(functions); + WRITE_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNC: + WRITE_NODE_FIELD(tablefunc); + break; + case RTE_VALUES: + WRITE_NODE_FIELD(values_lists); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + break; + case RTE_CTE: + WRITE_STRING_FIELD(ctename); + WRITE_UINT_FIELD(ctelevelsup); + WRITE_BOOL_FIELD(self_reference); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + break; + case RTE_NAMEDTUPLESTORE: + WRITE_STRING_FIELD(enrname); + WRITE_FLOAT_FIELD(enrtuples); + WRITE_OID_FIELD(relid); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + break; + case RTE_RESULT: + /* no extra fields */ + break; + case RTE_VOID: /*CDB*/ + break; + default: + elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind); + break; + } + + WRITE_BOOL_FIELD(lateral); + WRITE_BOOL_FIELD(inh); + WRITE_BOOL_FIELD(inFromCl); + WRITE_NODE_FIELD(securityQuals); + + WRITE_BOOL_FIELD(forceDistRandom); } static void -_outBoolean(StringInfo str, const Boolean *node) +_outConstraint(StringInfo str, const Constraint *node) { - int16 vt = T_Boolean; - appendBinaryStringInfo(str, (const char *)&vt, sizeof(int16)); - appendBinaryStringInfo(str, (const char *)&node->boolval, sizeof(bool)); -} + WRITE_NODE_TYPE("CONSTRAINT"); + WRITE_ENUM_FIELD(contype, ConstrType); + /* name, or NULL if unnamed */ + WRITE_STRING_FIELD(conname); + WRITE_BOOL_FIELD(deferrable); + WRITE_BOOL_FIELD(initdeferred); + WRITE_LOCATION_FIELD(location); -static void -_outString(StringInfo str, const String *node) -{ - int16 vt = T_String; - int slen; + WRITE_BOOL_FIELD(is_no_inherit); + WRITE_NODE_FIELD(raw_expr); + WRITE_STRING_FIELD(cooked_expr); + WRITE_CHAR_FIELD(generated_when); + WRITE_BOOL_FIELD(nulls_not_distinct); - appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); - slen = (node->sval != NULL ? strlen(node->sval) : 0); - appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); - if (slen > 0) - appendBinaryStringInfo(str, node->sval, slen); -} + WRITE_NODE_FIELD(keys); + WRITE_NODE_FIELD(including); -static void -_outBitString(StringInfo str, const BitString *node) -{ - int16 vt = T_BitString; - int slen; + WRITE_NODE_FIELD(exclusions); - appendBinaryStringInfo(str, (const char *) &vt, sizeof(int16)); - slen = (node->bsval != NULL ? strlen(node->bsval) : 0); - appendBinaryStringInfo(str, (const char *)&slen, sizeof(int)); - if (slen > 0) - appendBinaryStringInfo(str, node->bsval, slen); + WRITE_NODE_FIELD(options); + WRITE_STRING_FIELD(indexname); + WRITE_STRING_FIELD(indexspace); + WRITE_BOOL_FIELD(reset_default_tblspc); + + WRITE_STRING_FIELD(access_method); + WRITE_NODE_FIELD(where_clause); + + WRITE_NODE_FIELD(pktable); + WRITE_NODE_FIELD(fk_attrs); + WRITE_NODE_FIELD(pk_attrs); + WRITE_CHAR_FIELD(fk_matchtype); + WRITE_CHAR_FIELD(fk_upd_action); + WRITE_CHAR_FIELD(fk_del_action); + WRITE_NODE_FIELD(old_conpfeqop); + WRITE_OID_FIELD(old_pktable_oid); + + WRITE_BOOL_FIELD(skip_validation); + WRITE_BOOL_FIELD(initially_valid); } - static void -_outAConst(StringInfo str, A_Const *node) +_outPlannerGlobal(StringInfo str, const PlannerGlobal *node) { - WRITE_NODE_TYPE("A_CONST"); - WRITE_BOOL_FIELD(isnull); - if (!node->isnull) - _outNode(str, &node->val); - WRITE_LOCATION_FIELD(location); + WRITE_NODE_TYPE("PLANNERGLOBAL"); + + /* NB: this isn't a complete set of fields */ + WRITE_NODE_FIELD(subplans); + WRITE_BITMAPSET_FIELD(rewindPlanIDs); + WRITE_NODE_FIELD(finalrtable); + WRITE_NODE_FIELD(finalrowmarks); + WRITE_NODE_FIELD(resultRelations); + WRITE_NODE_FIELD(appendRelations); + WRITE_NODE_FIELD(relationOids); + WRITE_NODE_FIELD(invalItems); + WRITE_NODE_FIELD(paramExecTypes); + WRITE_UINT_FIELD(lastPHId); + WRITE_UINT_FIELD(lastRowMarkId); + WRITE_INT_FIELD(lastPlanNodeId); + WRITE_BOOL_FIELD(transientPlan); + WRITE_BOOL_FIELD(oneoffPlan); + WRITE_NODE_FIELD(share.motStack); + WRITE_BITMAPSET_FIELD(share.qdShares); + WRITE_BOOL_FIELD(dependsOnRole); + WRITE_BOOL_FIELD(parallelModeOK); + WRITE_BOOL_FIELD(parallelModeNeeded); + WRITE_CHAR_FIELD(maxParallelHazard); } static void -_outCookedConstraint(StringInfo str, CookedConstraint *node) +_outPlannerInfo(StringInfo str, const PlannerInfo *node) { - WRITE_NODE_TYPE("COOKEDCONSTRAINT"); - - WRITE_ENUM_FIELD(contype,ConstrType); - WRITE_STRING_FIELD(name); - WRITE_INT_FIELD(attnum); - WRITE_NODE_FIELD(expr); - WRITE_BOOL_FIELD(is_local); - WRITE_INT_FIELD(inhcount); - WRITE_BOOL_FIELD(is_no_inherit); + WRITE_NODE_TYPE("PLANNERINFO"); + + /* NB: this isn't a complete set of fields */ + WRITE_NODE_FIELD(parse); + WRITE_NODE_FIELD(glob); + WRITE_UINT_FIELD(query_level); + WRITE_NODE_FIELD(plan_params); + WRITE_BITMAPSET_FIELD(outer_params); + WRITE_INT_FIELD(simple_rel_array_size); + WRITE_BITMAPSET_FIELD(all_baserels); + WRITE_BITMAPSET_FIELD(outer_join_rels); + WRITE_NODE_FIELD(join_rel_list); + WRITE_NODE_FIELD(join_rel_list); + WRITE_BOOL_FIELD(setup_agg_pushdown); + WRITE_NODE_FIELD(grouped_rel_info_list); + WRITE_INT_FIELD(join_cur_level); + WRITE_NODE_FIELD(init_plans); + WRITE_NODE_FIELD(cte_plan_ids); + WRITE_NODE_FIELD(multiexpr_params); + WRITE_NODE_FIELD(join_domains); + WRITE_NODE_FIELD(eq_classes); + WRITE_BOOL_FIELD(ec_merging_done); + WRITE_NODE_FIELD(canon_pathkeys); + WRITE_NODE_FIELD(left_join_clauses); + WRITE_NODE_FIELD(right_join_clauses); + WRITE_NODE_FIELD(full_join_clauses); + WRITE_NODE_FIELD(join_info_list); + WRITE_INT_FIELD(last_rinfo_serial); + WRITE_BITMAPSET_FIELD(all_result_relids); + WRITE_BITMAPSET_FIELD(leaf_result_relids); + WRITE_NODE_FIELD(append_rel_list); + WRITE_NODE_FIELD(row_identity_vars); + WRITE_NODE_FIELD(rowMarks); + WRITE_NODE_FIELD(placeholder_list); + WRITE_NODE_FIELD(grouped_var_list); + WRITE_NODE_FIELD(fkey_list); + WRITE_NODE_FIELD(query_pathkeys); + WRITE_NODE_FIELD(group_pathkeys); + WRITE_INT_FIELD(num_groupby_pathkeys); + WRITE_NODE_FIELD(window_pathkeys); + WRITE_NODE_FIELD(distinct_pathkeys); + WRITE_NODE_FIELD(sort_pathkeys); + WRITE_NODE_FIELD(processed_groupClause); + WRITE_NODE_FIELD(processed_distinctClause); + WRITE_NODE_FIELD(processed_tlist); + WRITE_INT_FIELD(max_sortgroupref); + WRITE_NODE_FIELD(update_colnos); + WRITE_NODE_FIELD(minmax_aggs); + WRITE_FLOAT_FIELD(total_table_pages); + WRITE_FLOAT_FIELD(tuple_fraction); + WRITE_FLOAT_FIELD(limit_tuples); + WRITE_UINT_FIELD(qual_security_level); + WRITE_BOOL_FIELD(hasJoinRTEs); + WRITE_BOOL_FIELD(hasLateralRTEs); + WRITE_BOOL_FIELD(hasHavingQual); + WRITE_BOOL_FIELD(hasPseudoConstantQuals); + WRITE_BOOL_FIELD(hasAlternativeSubPlans); + WRITE_BOOL_FIELD(placeholdersFrozen); + WRITE_BOOL_FIELD(hasRecursion); + WRITE_NODE_FIELD(agginfos); + WRITE_NODE_FIELD(aggtransinfos); + WRITE_INT_FIELD(numOrderedAggs); + WRITE_BOOL_FIELD(hasNonPartialAggs); + WRITE_BOOL_FIELD(hasNonSerialAggs); + WRITE_INT_FIELD(wt_param_id); + WRITE_NODE_FIELD(non_recursive_path); + WRITE_BITMAPSET_FIELD(curOuterRels); + WRITE_NODE_FIELD(curOuterParams); + WRITE_BOOL_FIELD(partColsUpdated); } static void -_outAlterEnumStmt(StringInfo str, AlterEnumStmt *node) +_outForeignKeyOptInfo(StringInfo str, const ForeignKeyOptInfo *node) { - WRITE_NODE_TYPE("ALTERENUMSTMT"); - - WRITE_NODE_FIELD(typeName); - WRITE_STRING_FIELD(oldVal); - WRITE_STRING_FIELD(newVal); - WRITE_STRING_FIELD(newValNeighbor); - WRITE_BOOL_FIELD(newValIsAfter); - WRITE_BOOL_FIELD(skipIfNewValExists); + WRITE_NODE_TYPE("FOREIGNKEYOPTINFO"); + + WRITE_UINT_FIELD(con_relid); + WRITE_UINT_FIELD(ref_relid); + WRITE_INT_FIELD(nkeys); + WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys); + WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys); + WRITE_OID_ARRAY(conpfeqop, node->nkeys); + WRITE_INT_FIELD(nmatched_ec); + WRITE_INT_FIELD(nconst_ec); + WRITE_INT_FIELD(nmatched_rcols); + WRITE_INT_FIELD(nmatched_ri); } static void -_outCreateFdwStmt(StringInfo str, CreateFdwStmt *node) +_outEquivalenceClass(StringInfo str, const EquivalenceClass *node) { - WRITE_NODE_TYPE("CREATEFDWSTMT"); - - WRITE_STRING_FIELD(fdwname); - WRITE_NODE_FIELD(func_options); - WRITE_NODE_FIELD(options); + /* + * To simplify reading, we just chase up to the topmost merged EC and + * print that, without bothering to show the merge-ees separately. + */ + while (node->ec_merged) + node = node->ec_merged; + + WRITE_NODE_TYPE("EQUIVALENCECLASS"); + + WRITE_NODE_FIELD(ec_opfamilies); + WRITE_OID_FIELD(ec_collation); + WRITE_NODE_FIELD(ec_members); + WRITE_NODE_FIELD(ec_sources); + WRITE_NODE_FIELD(ec_derives); + WRITE_BITMAPSET_FIELD(ec_relids); + WRITE_BOOL_FIELD(ec_has_const); + WRITE_BOOL_FIELD(ec_has_volatile); + WRITE_BOOL_FIELD(ec_broken); + WRITE_UINT_FIELD(ec_sortref); + WRITE_UINT_FIELD(ec_min_security); + WRITE_UINT_FIELD(ec_max_security); } static void -_outAlterFdwStmt(StringInfo str, AlterFdwStmt *node) +_outExtensibleNode(StringInfo str, const ExtensibleNode *node) { - WRITE_NODE_TYPE("ALTERFDWSTMT"); + const ExtensibleNodeMethods *methods; - WRITE_STRING_FIELD(fdwname); - WRITE_NODE_FIELD(func_options); - WRITE_NODE_FIELD(options); -} + methods = GetExtensibleNodeMethods(node->extnodename, false); -static void -_outCreateForeignServerStmt(StringInfo str, CreateForeignServerStmt *node) -{ - WRITE_NODE_TYPE("CREATEFOREIGNSERVERSTMT"); + WRITE_NODE_TYPE("EXTENSIBLENODE"); - WRITE_STRING_FIELD(servername); - WRITE_STRING_FIELD(servertype); - WRITE_STRING_FIELD(version); - WRITE_STRING_FIELD(fdwname); - WRITE_NODE_FIELD(options); + WRITE_STRING_FIELD(extnodename); + + /* serialize the private fields */ + methods->nodeOut(str, node); } static void -_outAddForeignSegstmt(StringInfo str, AddForeignSegStmt *node) +_outSerializedParams(StringInfo str, const SerializedParams *node) { - WRITE_NODE_TYPE("ADDFOREIGNSEGSTMT"); + WRITE_NODE_TYPE("SERIALIZEDPARAMS"); - WRITE_STRING_FIELD(servername); - WRITE_STRING_FIELD(tablename); - WRITE_NODE_FIELD(options); -} + WRITE_INT_FIELD(nExternParams); + for (int i = 0; i < node->nExternParams; i++) + { + WRITE_BOOL_FIELD(externParams[i].isnull); + WRITE_INT_FIELD(externParams[i].pflags); + WRITE_OID_FIELD(externParams[i].ptype); + WRITE_INT_FIELD(externParams[i].plen); + WRITE_BOOL_FIELD(externParams[i].pbyval); + + if (!node->externParams[i].isnull) + _outDatum(str, + node->externParams[i].value, + node->externParams[i].plen, + node->externParams[i].pbyval); + } -static void -_outAlterForeignServerStmt(StringInfo str, AlterForeignServerStmt *node) -{ - WRITE_NODE_TYPE("ALTERFOREIGNSERVERSTMT"); + WRITE_INT_FIELD(nExecParams); + for (int i = 0; i < node->nExecParams; i++) + { + WRITE_BOOL_FIELD(execParams[i].isnull); + WRITE_BOOL_FIELD(execParams[i].isvalid); + WRITE_INT_FIELD(execParams[i].plen); + WRITE_BOOL_FIELD(execParams[i].pbyval); + + if (node->execParams[i].isvalid && !node->execParams[i].isnull) + _outDatum(str, + node->execParams[i].value, + node->execParams[i].plen, + node->execParams[i].pbyval); + WRITE_BOOL_FIELD(execParams[i].pbyval); + } - WRITE_STRING_FIELD(servername); - WRITE_STRING_FIELD(version); - WRITE_NODE_FIELD(options); - WRITE_BOOL_FIELD(has_version); + /* + * No text output function for TupleDescNodes. But that's OK, we + * only support text output for debugging purposes. + */ + WRITE_NODE_FIELD(transientTypes); } static void -_outCreateStorageServerStmt(StringInfo str, CreateStorageServerStmt *node) +_outSliceTable(StringInfo str, const SliceTable *node) { - WRITE_NODE_TYPE("CREATESTORAGESERVERSTMT"); + WRITE_NODE_TYPE("SLICETABLE"); - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); + WRITE_INT_FIELD(localSlice); + WRITE_INT_FIELD(numSlices); + for (int i = 0; i < node->numSlices; i++) + { + WRITE_INT_FIELD(slices[i].sliceIndex); + WRITE_INT_FIELD(slices[i].rootIndex); + WRITE_INT_FIELD(slices[i].parentIndex); + WRITE_INT_FIELD(slices[i].planNumSegments); + WRITE_NODE_FIELD(slices[i].children); /* List of int index */ + WRITE_ENUM_FIELD(slices[i].gangType, GangType); + WRITE_NODE_FIELD(slices[i].segments); /* List of int */ + WRITE_BOOL_FIELD(slices[i].useMppParallelMode); + WRITE_INT_FIELD(slices[i].parallel_workers); + WRITE_DUMMY_FIELD(slices[i].primaryGang); + WRITE_NODE_FIELD(slices[i].primaryProcesses); /* List of (CDBProcess *) */ + WRITE_BITMAPSET_FIELD(slices[i].processesMap); + } + WRITE_BOOL_FIELD(hasMotions); + WRITE_INT_FIELD(instrument_options); + WRITE_INT_FIELD(ic_instance_id); } static void -_outAlterStorageServerStmt(StringInfo str, AlterStorageServerStmt *node) +_outTupleDescNode(StringInfo str, const TupleDescNode *node) { - WRITE_NODE_TYPE("ALTERSTORAGESERVERSTMT"); + int i; - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); -} + Assert(node->tuple->tdtypeid == RECORDOID); -static void -_outDropStorageServerStmt(StringInfo str, DropStorageServerStmt *node) -{ - WRITE_NODE_TYPE("DROPSTORAGESERVERSTMT"); + WRITE_NODE_TYPE("TUPLEDESCNODE"); + WRITE_INT_FIELD(natts); + WRITE_INT_FIELD(tuple->natts); - WRITE_STRING_FIELD(servername); - WRITE_BOOL_FIELD(missing_ok); -} + for (i = 0; i < node->tuple->natts; i++) + appendBinaryStringInfo(str, (char *) &node->tuple->attrs[i], ATTRIBUTE_FIXED_PART_SIZE); -static void -_outCreateUserMappingStmt(StringInfo str, CreateUserMappingStmt *node) -{ - WRITE_NODE_TYPE("CREATEUSERMAPPINGSTMT"); + Assert(node->tuple->constr == NULL); - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); + WRITE_OID_FIELD(tuple->tdtypeid); + WRITE_INT_FIELD(tuple->tdtypmod); + WRITE_INT_FIELD(tuple->tdrefcount); } static void -_outAlterUserMappingStmt(StringInfo str, AlterUserMappingStmt *node) +wrapStringList(List *list) { - WRITE_NODE_TYPE("ALTERUSERMAPPINGSTMT"); + ListCell *lc; - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); + foreach(lc, list) + { + char *str = (char *) lfirst(lc); + + lfirst(lc) = makeString(str); + } } static void -_outDropUserMappingStmt(StringInfo str, DropUserMappingStmt *node) +unwrapStringList(List *list) { - WRITE_NODE_TYPE("DROPUSERMAPPINGSTMT"); + ListCell *lc; + + foreach(lc, list) + { + String *val = lfirst(lc); - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_BOOL_FIELD(missing_ok); + lfirst(lc) = strVal(val); + pfree(val); + } } static void -_outCreateStorageUserMappingStmt(StringInfo str, CreateStorageUserMappingStmt *node) +_outAlteredTableInfo(StringInfo str, const AlteredTableInfo *node) { - WRITE_NODE_TYPE("CREATEUSERMAPPINGSTMT"); + ListCell *lc; - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); -} + WRITE_NODE_TYPE("ALTEREDTABLEINFO"); -static void -_outAlterStorageUserMappingStmt(StringInfo str, AlterStorageUserMappingStmt *node) -{ - WRITE_NODE_TYPE("ALTERSTORAGEUSERMAPPINGSTMT"); + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + /* oldDesc is omitted */ - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); -} + for (int i = 0; i < AT_NUM_PASSES; i++) + { + WRITE_NODE_FIELD(subcmds[i]); + } -static void -_outDropStorageUserMappingStmt(StringInfo str, DropStorageUserMappingStmt *node) -{ - WRITE_NODE_TYPE("DROPSTORAGEUSERMAPPINGSTMT"); + /* + * These aren't Nodes in upstream, so make sure the node tags + * are set correctly before trying to serialize them. + */ + foreach(lc, node->constraints) + { + NewConstraint *e = (NewConstraint *) lfirst(lc); + e->type = T_NewConstraint; + } + foreach(lc, node->newvals) + { + NewColumnValue *e = (NewColumnValue *) lfirst(lc); + e->type = T_NewColumnValue; + } - WRITE_NODE_FIELD(user); - WRITE_STRING_FIELD(servername); - WRITE_BOOL_FIELD(missing_ok); + WRITE_NODE_FIELD(constraints); + WRITE_NODE_FIELD(newvals); + WRITE_NODE_FIELD(afterStmts); + WRITE_BOOL_FIELD(verify_new_notnull); + WRITE_INT_FIELD(rewrite); + WRITE_OID_FIELD(newAccessMethod); + WRITE_BOOL_FIELD(dist_opfamily_changed); + WRITE_OID_FIELD(new_opclass); + /* + * NB: newTableSpace is excluded, it will be assigned in phase 1 of AlterTable. + * If newTableSpace is required, refer to the name in its corresponding cmd. + * If newTableSpace is strongly required in serialization, please add it + * and update `ATPrepSetTableSpace()` to avoid error. + */ + WRITE_BOOL_FIELD(chgPersistence); + WRITE_CHAR_FIELD(newrelpersistence); + WRITE_NODE_FIELD(partition_constraint); + WRITE_BOOL_FIELD(validate_default); + WRITE_NODE_FIELD(changedConstraintOids); + + /* node->changedConstraintDefs is a list of naked strings, so + * we can't use WRITE_NODE_FIELD on it. Temporarily wrap them in Values. + */ + wrapStringList(node->changedConstraintDefs); + WRITE_NODE_FIELD(changedConstraintDefs); + /* unwrap them again */ + unwrapStringList(node->changedConstraintDefs); + + WRITE_NODE_FIELD(changedIndexOids); + wrapStringList(node->changedIndexDefs); + WRITE_NODE_FIELD(changedIndexDefs); + unwrapStringList(node->changedIndexDefs); + WRITE_NODE_FIELD(beforeStmtLists); + WRITE_NODE_FIELD(constraintLists); } static void -_outAlterObjectDependsStmt(StringInfo str, const AlterObjectDependsStmt *node) +_outNewConstraint(StringInfo str, const NewConstraint *node) { - WRITE_NODE_TYPE("ALTEROBJECTDEPENDSSTMT"); + WRITE_NODE_TYPE("NEWCONSTRAINT"); - WRITE_ENUM_FIELD(objectType,ObjectType); - WRITE_NODE_FIELD(relation); - WRITE_NODE_FIELD(object); - WRITE_NODE_FIELD(extname); + WRITE_STRING_FIELD(name); + WRITE_ENUM_FIELD(contype, ConstrType); + WRITE_OID_FIELD(refrelid); + WRITE_OID_FIELD(refindid); + WRITE_OID_FIELD(conid); + WRITE_NODE_FIELD(qual); + /* can't serialize qualstate */ } static void -_outCustomScan(StringInfo str, const CustomScan *node) +_outPlannedStmt(StringInfo str, const PlannedStmt *node) { - WRITE_NODE_TYPE("CUSTOMSCAN"); - - _outScanInfo(str, (const Scan *) node); - - WRITE_UINT_FIELD(flags); - WRITE_NODE_FIELD(custom_plans); - WRITE_NODE_FIELD(custom_exprs); - WRITE_NODE_FIELD(custom_private); - WRITE_NODE_FIELD(custom_scan_tlist); - WRITE_BITMAPSET_FIELD(custom_relids); - WRITE_STRING_FIELD(methods->CustomName); -} + WRITE_NODE_TYPE("PLANNEDSTMT"); -static void -_outAccessPriv(StringInfo str, AccessPriv *node) -{ - WRITE_NODE_TYPE("ACCESSPRIV"); + WRITE_ENUM_FIELD(commandType, CmdType); + WRITE_ENUM_FIELD(planGen, PlanGenerator); + WRITE_UINT64_FIELD(queryId); + WRITE_BOOL_FIELD(hasReturning); + WRITE_BOOL_FIELD(hasModifyingCTE); + WRITE_BOOL_FIELD(canSetTag); + WRITE_BOOL_FIELD(transientPlan); + WRITE_BOOL_FIELD(oneoffPlan); + WRITE_OID_FIELD(simplyUpdatableRel); + WRITE_BOOL_FIELD(dependsOnRole); + WRITE_BOOL_FIELD(parallelModeNeeded); + WRITE_INT_FIELD(jitFlags); + WRITE_NODE_FIELD(planTree); + WRITE_NODE_FIELD(rtable); + WRITE_NODE_FIELD(permInfos); + WRITE_NODE_FIELD(resultRelations); + WRITE_NODE_FIELD(appendRelations); + WRITE_NODE_FIELD(subplans); + WRITE_BITMAPSET_FIELD(rewindPlanIDs); + WRITE_NODE_FIELD(rowMarks); + WRITE_NODE_FIELD(relationOids); + WRITE_NODE_FIELD(paramExecTypes); + WRITE_NODE_FIELD(utilityStmt); + WRITE_LOCATION_FIELD(stmt_location); + WRITE_INT_FIELD(stmt_len); - WRITE_STRING_FIELD(priv_name); - WRITE_NODE_FIELD(cols); -} + WRITE_INT_ARRAY(subplan_sliceIds, list_length(node->subplans)); -static void -_outAlterTableMoveAllStmt(StringInfo str, AlterTableMoveAllStmt *node) -{ - WRITE_NODE_TYPE("ALTERTABLESPACEMOVESTMT"); + WRITE_INT_FIELD(numSlices); + for (int i = 0; i < node->numSlices; i++) + { + WRITE_INT_FIELD(slices[i].sliceIndex); + WRITE_INT_FIELD(slices[i].parentIndex); + WRITE_INT_FIELD(slices[i].gangType); + WRITE_INT_FIELD(slices[i].numsegments); + WRITE_INT_FIELD(slices[i].parallel_workers); + WRITE_INT_FIELD(slices[i].segindex); + WRITE_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); + WRITE_NODE_FIELD(slices[i].directDispatch.contentIds); + } - WRITE_STRING_FIELD(orig_tablespacename); - WRITE_ENUM_FIELD(objtype, ObjectType); - WRITE_NODE_FIELD(roles); - WRITE_STRING_FIELD(new_tablespacename); - WRITE_BOOL_FIELD(nowait); -} + WRITE_BITMAPSET_FIELD(rewindPlanIDs); -static void -_outAlterTableSpaceOptionsStmt(StringInfo str, AlterTableSpaceOptionsStmt *node) -{ - WRITE_NODE_TYPE("ALTERTABLESPACEOPTIONS"); + WRITE_NODE_FIELD(intoPolicy); - WRITE_STRING_FIELD(tablespacename); - WRITE_NODE_FIELD(options); - WRITE_BOOL_FIELD(isReset); - WRITE_NODE_FIELD(tags); - WRITE_BOOL_FIELD(unsettag); -} + WRITE_UINT64_FIELD(query_mem); -static void -_outCreateAmStmt(StringInfo str, const CreateAmStmt *node) -{ - WRITE_NODE_TYPE("CREATEAMSTMT"); + WRITE_NODE_FIELD(intoClause); + WRITE_NODE_FIELD(copyIntoClause); + WRITE_NODE_FIELD(refreshClause); + WRITE_INT_FIELD(metricsQueryType); + WRITE_NODE_FIELD(extensionContext); - WRITE_STRING_FIELD(amname); - WRITE_NODE_FIELD(handler_name); - WRITE_INT_FIELD(amtype); -} -static void -_outAggExprId(StringInfo str, const AggExprId *node) -{ - WRITE_NODE_TYPE("AGGEXPRID"); } + static void -_outRowIdExpr(StringInfo str, const RowIdExpr *node) +_outMotion(StringInfo str, const Motion *node) { - WRITE_NODE_TYPE("ROWIDEXPR"); - - WRITE_INT_FIELD(rowidexpr_id); + WRITE_NODE_TYPE("MOTION"); + + WRITE_FLOAT_FIELD(plan.startup_cost); + WRITE_FLOAT_FIELD(plan.total_cost); + WRITE_FLOAT_FIELD(plan.plan_rows); + WRITE_INT_FIELD(plan.plan_width); + WRITE_BOOL_FIELD(plan.parallel_aware); + WRITE_BOOL_FIELD(plan.parallel_safe); + WRITE_BOOL_FIELD(plan.async_capable); + WRITE_INT_FIELD(plan.plan_node_id); + WRITE_NODE_FIELD(plan.targetlist); + WRITE_NODE_FIELD(plan.qual); + WRITE_NODE_FIELD(plan.lefttree); + WRITE_NODE_FIELD(plan.righttree); + WRITE_NODE_FIELD(plan.initPlan); + WRITE_BITMAPSET_FIELD(plan.extParam); + WRITE_BITMAPSET_FIELD(plan.allParam); + WRITE_NODE_FIELD(plan.flow); + WRITE_UINT_FIELD(plan.locustype); + WRITE_INT_FIELD(plan.parallel); + WRITE_UINT64_FIELD(plan.operatorMemKB); + + WRITE_INT_FIELD(motionID); + WRITE_ENUM_FIELD(motionType, MotionType); + + WRITE_BOOL_FIELD(sendSorted); + + WRITE_NODE_FIELD(hashExprs); + WRITE_OID_ARRAY(hashFuncs, list_length(node->hashExprs)); + WRITE_INT_FIELD(numSortCols); + WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numSortCols); + WRITE_INT_ARRAY(sortOperators, node->numSortCols); + WRITE_INT_ARRAY(collations, node->numSortCols); + WRITE_BOOL_ARRAY(nullsFirst, node->numSortCols); + WRITE_INT_FIELD(segidColIdx); + + WRITE_INT_FIELD(numHashSegments); } static void -_outGpSplitPartitionCmd(StringInfo str, const GpSplitPartitionCmd *node) +_outOidAssignment(StringInfo str, const OidAssignment *node) { - WRITE_NODE_TYPE("GPSPLITPARTITIONCMD"); - - WRITE_NODE_FIELD(partid); - WRITE_NODE_FIELD(start); - WRITE_NODE_FIELD(end); - WRITE_NODE_FIELD(at); - WRITE_NODE_FIELD(arg2); + WRITE_NODE_TYPE("OIDASSIGNMENT"); + + WRITE_OID_FIELD(catalog); + WRITE_STRING_FIELD(objname); + WRITE_OID_FIELD(namespaceOid); + WRITE_OID_FIELD(keyOid1); + WRITE_OID_FIELD(keyOid2); + WRITE_OID_FIELD(oid); } +#include "outfast.funcs.c" + /* * _outNode - * converts a Node into binary string and append it to 'str' @@ -905,1092 +1191,8 @@ _outNode(StringInfo str, void *obj) { switch (nodeTag(obj)) { - case T_PlannedStmt: - _outPlannedStmt(str,obj); - break; - case T_QueryDispatchDesc: - _outQueryDispatchDesc(str,obj); - break; - case T_SerializedParams: - _outSerializedParams(str, obj); - break; - case T_OidAssignment: - _outOidAssignment(str,obj); - break; - case T_Plan: - _outPlan(str, obj); - break; - case T_Result: - _outResult(str, obj); - break; - case T_ProjectSet: - _outProjectSet(str, obj); - break; - case T_ModifyTable: - _outModifyTable(str, obj); - break; - case T_Append: - _outAppend(str, obj); - break; - case T_MergeAppend: - _outMergeAppend(str, obj); - break; - case T_Sequence: - _outSequence(str, obj); - break; - case T_RecursiveUnion: - _outRecursiveUnion(str, obj); - break; - case T_BitmapAnd: - _outBitmapAnd(str, obj); - break; - case T_BitmapOr: - _outBitmapOr(str, obj); - break; - case T_Gather: - _outGather(str, obj); - break; - case T_GatherMerge: - _outGatherMerge(str, obj); - break; - case T_Scan: - _outScan(str, obj); - break; - case T_SeqScan: - _outSeqScan(str, obj); - break; - case T_DynamicSeqScan: - _outDynamicSeqScan(str, obj); - break; - case T_ExternalScanInfo: - _outExternalScanInfo(str, obj); - break; - case T_SampleScan: - _outSampleScan(str, obj); - break; - case T_IndexScan: - _outIndexScan(str, obj); - break; - case T_IndexOnlyScan: - _outIndexOnlyScan(str, obj); - break; - case T_DynamicIndexScan: - _outDynamicIndexScan(str, obj); - break; - case T_DynamicIndexOnlyScan: - _outDynamicIndexOnlyScan(str, obj); - break; - case T_BitmapIndexScan: - _outBitmapIndexScan(str, obj); - break; - case T_DynamicBitmapIndexScan: - _outDynamicBitmapIndexScan(str, obj); - break; - case T_BitmapHeapScan: - _outBitmapHeapScan(str, obj); - break; - case T_DynamicBitmapHeapScan: - _outDynamicBitmapHeapScan(str, obj); - break; - case T_TidScan: - _outTidScan(str, obj); - break; - case T_TidRangeScan: - _outTidRangeScan(str, obj); - break; - case T_SubqueryScan: - _outSubqueryScan(str, obj); - break; - case T_FunctionScan: - _outFunctionScan(str, obj); - break; - case T_TableFuncScan: - _outTableFuncScan(str, obj); - break; - case T_ValuesScan: - _outValuesScan(str, obj); - break; - case T_CteScan: - _outCteScan(str, obj); - break; - case T_NamedTuplestoreScan: - _outNamedTuplestoreScan(str, obj); - break; - case T_WorkTableScan: - _outWorkTableScan(str, obj); - break; - case T_ForeignScan: - _outForeignScan(str, obj); - break; - case T_DynamicForeignScan: - _outDynamicForeignScan(str, obj); - break; - case T_CustomScan: - _outCustomScan(str, obj); - break; - case T_Join: - _outJoin(str, obj); - break; - case T_NestLoop: - _outNestLoop(str, obj); - break; - case T_MergeJoin: - _outMergeJoin(str, obj); - break; - case T_HashJoin: - _outHashJoin(str, obj); - break; - case T_Agg: - _outAgg(str, obj); - break; - case T_TupleSplit: - _outTupleSplit(str, obj); - break; - case T_DQAExpr: - _outDQAExpr(str, obj); - break; - case T_WindowAgg: - _outWindowAgg(str, obj); - break; - case T_WindowHashAgg: - _outWindowHashAgg(str, obj); - break; - case T_Group: - _outGroup(str, obj); - break; - case T_TableFunctionScan: - _outTableFunctionScan(str, obj); - break; - case T_Material: - _outMaterial(str, obj); - break; - case T_ShareInputScan: - _outShareInputScan(str, obj); - break; - case T_Memoize: - _outMemoize(str, obj); - break; - case T_Sort: - _outSort(str, obj); - break; - case T_IncrementalSort: - _outIncrementalSort(str, obj); - break; - case T_Unique: - _outUnique(str, obj); - break; - case T_Hash: - _outHash(str, obj); - break; - case T_SetOp: - _outSetOp(str, obj); - break; - case T_LockRows: - _outLockRows(str, obj); - break; - case T_RuntimeFilter: - _outRuntimeFilter(str, obj); - break; - case T_Limit: - _outLimit(str, obj); - break; - case T_NestLoopParam: - _outNestLoopParam(str, obj); - break; - case T_PlanRowMark: - _outPlanRowMark(str, obj); - break; - case T_PartitionPruneInfo: - _outPartitionPruneInfo(str, obj); - break; - case T_PartitionedRelPruneInfo: - _outPartitionedRelPruneInfo(str, obj); - break; - case T_PartitionPruneStepOp: - _outPartitionPruneStepOp(str, obj); - break; - case T_PartitionPruneStepCombine: - _outPartitionPruneStepCombine(str, obj); - break; - case T_Motion: - _outMotion(str, obj); - break; - case T_SplitUpdate: - _outSplitUpdate(str, obj); - break; - case T_SplitMerge: - _outSplitMerge(str, obj); - break; - case T_AssertOp: - _outAssertOp(str, obj); - break; - case T_PartitionSelector: - _outPartitionSelector(str, obj); - break; - case T_GpPartDefElem: - _outGpPartDefElem(str, obj); - break; - case T_Alias: - _outAlias(str, obj); - break; - case T_RangeVar: - _outRangeVar(str, obj); - break; - case T_TableFunc: - _outTableFunc(str, obj); - break; - case T_IntoClause: - _outIntoClause(str, obj); - break; - case T_CopyIntoClause: - _outCopyIntoClause(str, obj); - break; - case T_RefreshClause: - _outRefreshClause(str, obj); - break; - case T_Var: - _outVar(str, obj); - break; - case T_Const: - _outConst(str, obj); - break; - case T_Param: - _outParam(str, obj); - break; - case T_Aggref: - _outAggref(str, obj); - break; - case T_GroupingFunc: - _outGroupingFunc(str, obj); - break; - case T_GroupId: - _outGroupId(str, obj); - break; - case T_GroupingSetId: - _outGroupingSetId(str, obj); - break; - case T_WindowFunc: - _outWindowFunc(str, obj); - break; - case T_SubscriptingRef: - _outSubscriptingRef(str, obj); - break; - case T_FuncExpr: - _outFuncExpr(str, obj); - break; - case T_NamedArgExpr: - _outNamedArgExpr(str, obj); - break; - case T_OpExpr: - _outOpExpr(str, obj); - break; - case T_DistinctExpr: - _outDistinctExpr(str, obj); - break; - case T_ScalarArrayOpExpr: - _outScalarArrayOpExpr(str, obj); - break; - case T_BoolExpr: - _outBoolExpr(str, obj); - break; - case T_SubLink: - _outSubLink(str, obj); - break; - case T_SubPlan: - _outSubPlan(str, obj); - break; - case T_AlternativeSubPlan: - _outAlternativeSubPlan(str, obj); - break; - case T_FieldSelect: - _outFieldSelect(str, obj); - break; - case T_FieldStore: - _outFieldStore(str, obj); - break; - case T_RelabelType: - _outRelabelType(str, obj); - break; - case T_CoerceViaIO: - _outCoerceViaIO(str, obj); - break; - case T_ArrayCoerceExpr: - _outArrayCoerceExpr(str, obj); - break; - case T_ConvertRowtypeExpr: - _outConvertRowtypeExpr(str, obj); - break; - case T_CollateExpr: - _outCollateExpr(str, obj); - break; - case T_CaseExpr: - _outCaseExpr(str, obj); - break; - case T_CaseWhen: - _outCaseWhen(str, obj); - break; - case T_CaseTestExpr: - _outCaseTestExpr(str, obj); - break; - case T_ArrayExpr: - _outArrayExpr(str, obj); - break; - case T_RowExpr: - _outRowExpr(str, obj); - break; - case T_RowCompareExpr: - _outRowCompareExpr(str, obj); - break; - case T_CoalesceExpr: - _outCoalesceExpr(str, obj); - break; - case T_MinMaxExpr: - _outMinMaxExpr(str, obj); - break; - case T_NullIfExpr: - _outNullIfExpr(str, obj); - break; - case T_NullTest: - _outNullTest(str, obj); - break; - case T_BooleanTest: - _outBooleanTest(str, obj); - break; - case T_SQLValueFunction: - _outSQLValueFunction(str, obj); - break; - case T_XmlExpr: - _outXmlExpr(str, obj); - break; - case T_CoerceToDomain: - _outCoerceToDomain(str, obj); - break; - case T_CoerceToDomainValue: - _outCoerceToDomainValue(str, obj); - break; - case T_SetToDefault: - _outSetToDefault(str, obj); - break; - case T_CurrentOfExpr: - _outCurrentOfExpr(str, obj); - break; - case T_NextValueExpr: - _outNextValueExpr(str, obj); - break; - case T_InferenceElem: - _outInferenceElem(str, obj); - break; - case T_TargetEntry: - _outTargetEntry(str, obj); - break; - case T_RangeTblRef: - _outRangeTblRef(str, obj); - break; - case T_JoinExpr: - _outJoinExpr(str, obj); - break; - case T_FromExpr: - _outFromExpr(str, obj); - break; - case T_OnConflictExpr: - _outOnConflictExpr(str, obj); - break; - case T_CreateExtensionStmt: - _outCreateExtensionStmt(str, obj); - break; - case T_GrantStmt: - _outGrantStmt(str, obj); - break; - case T_AccessPriv: - _outAccessPriv(str, obj); - break; - case T_ObjectWithArgs: - _outObjectWithArgs(str, obj); - break; - case T_GrantRoleStmt: - _outGrantRoleStmt(str, obj); - break; - case T_LockStmt: - _outLockStmt(str, obj); - break; - - case T_ExtensibleNode: - _outExtensibleNode(str, obj); - break; - - case T_CreateStmt: - _outCreateStmt(str, obj); - break; - case T_CreateForeignTableStmt: - _outCreateForeignTableStmt(str, obj); - break; - case T_DistributionKeyElem: - _outDistributionKeyElem(str, obj); - break; - case T_ColumnReferenceStorageDirective: - _outColumnReferenceStorageDirective(str, obj); - break; - case T_RoleSpec: - _outRoleSpec(str, obj); - break; - - case T_SegfileMapNode: - _outSegfileMapNode(str, obj); - break; - - case T_ExtTableTypeDesc: - _outExtTableTypeDesc(str, obj); - break; - case T_CreateExternalStmt: - _outCreateExternalStmt(str, obj); - break; - - case T_IndexStmt: - _outIndexStmt(str, obj); - break; - case T_ReindexStmt: - _outReindexStmt(str, obj); - break; - case T_ReindexIndexInfo: - _outReindexIndexInfo(str, obj); - break; - - case T_ConstraintsSetStmt: - _outConstraintsSetStmt(str, obj); - break; - - case T_CreateFunctionStmt: - _outCreateFunctionStmt(str, obj); - break; - case T_FunctionParameter: - _outFunctionParameter(str, obj); - break; - case T_AlterFunctionStmt: - _outAlterFunctionStmt(str, obj); - break; - - case T_AlterObjectDependsStmt: - _outAlterObjectDependsStmt(str, obj); - break; - - case T_DefineStmt: - _outDefineStmt(str,obj); - break; - - case T_CompositeTypeStmt: - _outCompositeTypeStmt(str,obj); - break; - case T_CreateEnumStmt: - _outCreateEnumStmt(str,obj); - break; - case T_CreateRangeStmt: - _outCreateRangeStmt(str, obj); - break; - case T_AlterEnumStmt: - _outAlterEnumStmt(str, obj); - break; - - case T_CreateCastStmt: - _outCreateCastStmt(str,obj); - break; - case T_CreateOpClassStmt: - _outCreateOpClassStmt(str,obj); - break; - case T_CreateOpClassItem: - _outCreateOpClassItem(str,obj); - break; - case T_CreateOpFamilyStmt: - _outCreateOpFamilyStmt(str,obj); - break; - case T_AlterOpFamilyStmt: - _outAlterOpFamilyStmt(str,obj); - break; - case T_CreateConversionStmt: - _outCreateConversionStmt(str,obj); - break; - - - case T_ViewStmt: - _outViewStmt(str, obj); - break; - case T_RuleStmt: - _outRuleStmt(str, obj); - break; - case T_DropStmt: - _outDropStmt(str, obj); - break; - case T_DropOwnedStmt: - _outDropOwnedStmt(str, obj); - break; - case T_ReassignOwnedStmt: - _outReassignOwnedStmt(str, obj); - break; - case T_TruncateStmt: - _outTruncateStmt(str, obj); - break; - case T_ReplicaIdentityStmt: - _outReplicaIdentityStmt(str, obj); - break; - case T_AlterTableStmt: - _outAlterTableStmt(str, obj); - break; - case T_AlterTableCmd: - _outAlterTableCmd(str, obj); - break; - case T_AlteredTableInfo: - _outAlteredTableInfo(str, obj); - break; - case T_NewConstraint: - _outNewConstraint(str, obj); - break; - case T_NewColumnValue: - _outNewColumnValue(str, obj); - break; - - case T_CreateRoleStmt: - _outCreateRoleStmt(str, obj); - break; - case T_DropRoleStmt: - _outDropRoleStmt(str, obj); - break; - case T_AlterRoleStmt: - _outAlterRoleStmt(str, obj); - break; - case T_AlterRoleSetStmt: - _outAlterRoleSetStmt(str, obj); - break; - - case T_CreateProfileStmt: - _outCreateProfileStmt(str, obj); - break; - case T_AlterProfileStmt: - _outAlterProfileStmt(str, obj); - break; - case T_DropProfileStmt: - _outDropProfileStmt(str, obj); - break; - - case T_AlterSystemStmt: - _outAlterSystemStmt(str, obj); - break; - - case T_AlterObjectSchemaStmt: - _outAlterObjectSchemaStmt(str, obj); - break; - - case T_AlterOwnerStmt: - _outAlterOwnerStmt(str, obj); - break; +#include "outfast.switch.c" - case T_RenameStmt: - _outRenameStmt(str, obj); - break; - - case T_CreateSeqStmt: - _outCreateSeqStmt(str, obj); - break; - case T_AlterSeqStmt: - _outAlterSeqStmt(str, obj); - break; - case T_ClusterStmt: - _outClusterStmt(str, obj); - break; - case T_CreatedbStmt: - _outCreatedbStmt(str, obj); - break; - case T_DropdbStmt: - _outDropdbStmt(str, obj); - break; - case T_CreateDomainStmt: - _outCreateDomainStmt(str, obj); - break; - case T_AlterDomainStmt: - _outAlterDomainStmt(str, obj); - break; - case T_AlterDefaultPrivilegesStmt: - _outAlterDefaultPrivilegesStmt(str, obj); - break; - case T_TransactionStmt: - _outTransactionStmt(str, obj); - break; - case T_CreateStatsStmt: - _outCreateStatsStmt(str, obj); - break; - case T_AlterStatsStmt: - _outAlterStatsStmt(str, obj); - break; - case T_NotifyStmt: - _outNotifyStmt(str, obj); - break; - case T_DeclareCursorStmt: - _outDeclareCursorStmt(str, obj); - break; - case T_SingleRowErrorDesc: - _outSingleRowErrorDesc(str, obj); - break; - case T_CopyStmt: - _outCopyStmt(str, obj); - break; - case T_SelectStmt: - _outSelectStmt(str, obj); - break; - case T_InsertStmt: - _outInsertStmt(str, obj); - break; - case T_DeleteStmt: - _outDeleteStmt(str, obj); - break; - case T_UpdateStmt: - _outUpdateStmt(str, obj); - break; - case T_ColumnDef: - _outColumnDef(str, obj); - break; - case T_TypeName: - _outTypeName(str, obj); - break; - case T_SortBy: - _outSortBy(str, obj); - break; - case T_TypeCast: - _outTypeCast(str, obj); - break; - case T_CollateClause: - _outCollateClause(str, obj); - break; - case T_IndexElem: - _outIndexElem(str, obj); - break; - case T_Query: - _outQuery(str, obj); - break; - case T_WithCheckOption: - _outWithCheckOption(str, obj); - break; - case T_SortGroupClause: - _outSortGroupClause(str, obj); - break; - case T_GroupingSet: - _outGroupingSet(str, obj); - break; - case T_WindowClause: - _outWindowClause(str, obj); - break; - case T_RowMarkClause: - _outRowMarkClause(str, obj); - break; - case T_WithClause: - _outWithClause(str, obj); - break; - case T_CTESearchClause: - _outCTESearchClause(str, obj); - break; - case T_CTECycleClause: - _outCTECycleClause(str, obj); - break; - case T_CommonTableExpr: - _outCommonTableExpr(str, obj); - break; - case T_SetOperationStmt: - _outSetOperationStmt(str, obj); - break; - case T_RangeTblEntry: - _outRangeTblEntry(str, obj); - break; - case T_RangeTblFunction: - _outRangeTblFunction(str, obj); - break; - case T_TableSampleClause: - _outTableSampleClause(str, obj); - break; - case T_A_Expr: - _outAExpr(str, obj); - break; - case T_ColumnRef: - _outColumnRef(str, obj); - break; - case T_ParamRef: - _outParamRef(str, obj); - break; - case T_RawStmt: - _outRawStmt(str, obj); - break; - case T_A_Const: - _outAConst(str, obj); - break; - case T_A_Star: - _outA_Star(str, obj); - break; - case T_A_Indices: - _outA_Indices(str, obj); - break; - case T_A_Indirection: - _outA_Indirection(str, obj); - break; - case T_A_ArrayExpr: - _outA_ArrayExpr(str,obj); - break; - case T_ResTarget: - _outResTarget(str, obj); - break; - case T_MultiAssignRef: - _outMultiAssignRef(str, obj); - break; - case T_Constraint: - _outConstraint(str, obj); - break; - case T_FuncCall: - _outFuncCall(str, obj); - break; - case T_DefElem: - _outDefElem(str, obj); - break; - case T_TableLikeClause: - _outTableLikeClause(str, obj); - break; - case T_LockingClause: - _outLockingClause(str, obj); - break; - case T_XmlSerialize: - _outXmlSerialize(str, obj); - break; - case T_TriggerTransition: - _outTriggerTransition(str, obj); - break; - case T_PartitionElem: - _outPartitionElem(str, obj); - break; - case T_PartitionSpec: - _outPartitionSpec(str, obj); - break; - case T_PartitionBoundSpec: - _outPartitionBoundSpec(str, obj); - break; - case T_PartitionRangeDatum: - _outPartitionRangeDatum(str, obj); - break; - case T_PartitionCmd: - _outPartitionCmd(str, obj); - break; - case T_GpAlterPartitionId: - _outGpAlterPartitionId(str, obj); - break; - case T_GpDropPartitionCmd: - _outGpDropPartitionCmd(str, obj); - break; - case T_GpAlterPartitionCmd: - _outGpAlterPartitionCmd(str, obj); - break; - - case T_CreateSchemaStmt: - _outCreateSchemaStmt(str, obj); - break; - case T_AlterSchemaStmt: - _outAlterSchemaStmt(str, obj); - break; - - case T_CreateTagStmt: - _outCreateTagStmt(str, obj); - break; - case T_AlterTagStmt: - _outAlterTagStmt(str, obj); - break; - case T_DropTagStmt: - _outDropTagStmt(str, obj); - break; - case T_CreatePLangStmt: - _outCreatePLangStmt(str, obj); - break; - case T_VacuumStmt: - _outVacuumStmt(str, obj); - break; - case T_VacuumRelation: - _outVacuumRelation(str, obj); - break; - case T_CdbProcess: - _outCdbProcess(str, obj); - break; - case T_SliceTable: - _outSliceTable(str, obj); - break; - case T_CursorPosInfo: - _outCursorPosInfo(str, obj); - break; - case T_VariableSetStmt: - _outVariableSetStmt(str, obj); - break; - - case T_DMLActionExpr: - _outDMLActionExpr(str, obj); - break; - - case T_CreateTrigStmt: - _outCreateTrigStmt(str, obj); - break; - - case T_CreateTableSpaceStmt: - _outCreateTableSpaceStmt(str, obj); - break; - - case T_DropTableSpaceStmt: - _outDropTableSpaceStmt(str, obj); - break; - - case T_CreateQueueStmt: - _outCreateQueueStmt(str, obj); - break; - case T_AlterQueueStmt: - _outAlterQueueStmt(str, obj); - break; - case T_DropQueueStmt: - _outDropQueueStmt(str, obj); - break; - - case T_CreateResourceGroupStmt: - _outCreateResourceGroupStmt(str, obj); - break; - case T_DropResourceGroupStmt: - _outDropResourceGroupStmt(str, obj); - break; - case T_AlterResourceGroupStmt: - _outAlterResourceGroupStmt(str, obj); - break; - - case T_CommentStmt: - _outCommentStmt(str, obj); - break; - case T_TableValueExpr: - _outTableValueExpr(str, obj); - break; - case T_DenyLoginInterval: - _outDenyLoginInterval(str, obj); - break; - case T_DenyLoginPoint: - _outDenyLoginPoint(str, obj); - break; - - case T_AlterTypeStmt: - _outAlterTypeStmt(str, obj); - break; - case T_AlterExtensionStmt: - _outAlterExtensionStmt(str, obj); - break; - case T_AlterExtensionContentsStmt: - _outAlterExtensionContentsStmt(str, obj); - break; - - case T_TupleDescNode: - _outTupleDescNode(str, obj); - break; - - case T_AlterTSConfigurationStmt: - _outAlterTSConfigurationStmt(str, obj); - break; - case T_AlterTSDictionaryStmt: - _outAlterTSDictionaryStmt(str, obj); - break; - - case T_CookedConstraint: - _outCookedConstraint(str, obj); - break; - - case T_DropUserMappingStmt: - _outDropUserMappingStmt(str, obj); - break; - case T_AlterUserMappingStmt: - _outAlterUserMappingStmt(str, obj); - break; - case T_CreateUserMappingStmt: - _outCreateUserMappingStmt(str, obj); - break; - case T_CreateStorageUserMappingStmt: - _outCreateStorageUserMappingStmt(str, obj); - break; - case T_AlterStorageUserMappingStmt: - _outAlterStorageUserMappingStmt(str, obj); - break; - case T_DropStorageUserMappingStmt: - _outDropStorageUserMappingStmt(str, obj); - break; - case T_AlterForeignServerStmt: - _outAlterForeignServerStmt(str, obj); - break; - case T_CreateForeignServerStmt: - _outCreateForeignServerStmt(str, obj); - break; - case T_AddForeignSegStmt: - _outAddForeignSegstmt(str, obj); - break; - case T_AlterFdwStmt: - _outAlterFdwStmt(str, obj); - break; - case T_CreateStorageServerStmt: - _outCreateStorageServerStmt(str, obj); - break; - case T_AlterStorageServerStmt: - _outAlterStorageServerStmt(str, obj); - break; - case T_DropStorageServerStmt: - _outDropStorageServerStmt(str, obj); - break; - case T_CreateFdwStmt: - _outCreateFdwStmt(str, obj); - break; - case T_GpPolicy: - _outGpPolicy(str, obj); - break; - case T_DistributedBy: - _outDistributedBy(str, obj); - break; - case T_ImportForeignSchemaStmt: - _outImportForeignSchemaStmt(str, obj); - break; - case T_AlterTableMoveAllStmt: - _outAlterTableMoveAllStmt(str, obj); - break; - case T_AlterTableSpaceOptionsStmt: - _outAlterTableSpaceOptionsStmt(str, obj); - break; - - case T_CreatePublicationStmt: - _outCreatePublicationStmt(str, obj); - break; - case T_AlterPublicationStmt: - _outAlterPublicationStmt(str, obj); - break; - case T_CreateSubscriptionStmt: - _outCreateSubscriptionStmt(str, obj); - break; - case T_DropSubscriptionStmt: - _outDropSubscriptionStmt(str, obj); - break; - case T_AlterSubscriptionStmt: - _outAlterSubscriptionStmt(str, obj); - break; - - case T_CreatePolicyStmt: - _outCreatePolicyStmt(str, obj); - break; - case T_AlterPolicyStmt: - _outAlterPolicyStmt(str, obj); - break; - case T_CreateTransformStmt: - _outCreateTransformStmt(str, obj); - break; - case T_CreateAmStmt: - _outCreateAmStmt(str, obj); - break; - case T_AggExprId: - _outAggExprId(str, obj); - break; - case T_RowIdExpr: - _outRowIdExpr(str, obj); - break; - case T_RelAggInfo: - _outRelAggInfo(str, obj); - break; - case T_RestrictInfo: - _outRestrictInfo(str, obj); - break; - case T_IndexClause: - _outIndexClause(str, obj); - break; - case T_PlaceHolderVar: - _outPlaceHolderVar(str, obj); - break; - case T_SpecialJoinInfo: - _outSpecialJoinInfo(str, obj); - break; - case T_AppendRelInfo: - _outAppendRelInfo(str, obj); - break; - case T_PlaceHolderInfo: - _outPlaceHolderInfo(str, obj); - break; - case T_GroupedVarInfo: - _outGroupedVarInfo(str, obj); - break; - case T_MinMaxAggInfo: - _outMinMaxAggInfo(str, obj); - break; - case T_PlannerParamItem: - _outPlannerParamItem(str, obj); - break; - case T_GpPartitionRangeSpec: - _outGpPartitionRangeSpec(str, obj); - break; - case T_GpPartitionRangeItem: - _outGpPartitionRangeItem(str, obj); - break; - case T_GpPartitionListSpec: - _outGpPartitionListSpec(str, obj); - break; - case T_GpSplitPartitionCmd: - _outGpSplitPartitionCmd(str, obj); - break; - case T_GpPartitionDefinition: - _outGpPartitionDefinition(str, obj); - break; - case T_StatsElem: - _outStatsElem(str, obj); - break; - case T_ReturnStmt: - _outReturnStmt(str, obj); - break; - case T_CreateDirectoryTableStmt: - _outCreateDirectoryTableStmt(str, obj); - break; - case T_AlterDirectoryTableStmt: - _outAlterDirectoryTableStmt(str, obj); - break; - case T_DropDirectoryTableStmt: - _outDropDirectoryTableStmt(str, obj); - break; - case T_CreateTaskStmt: - _outCreateTaskStmt(str, obj); - break; - case T_AlterTaskStmt: - _outAlterTaskStmt(str, obj); - break; - case T_DropTaskStmt: - _outDropTaskStmt(str, obj); - break; - case T_EphemeralNamedRelationInfo: - _outEphemeralNamedRelationInfo(str, obj); - break; - case T_AlterDatabaseStmt: - _outAlterDatabaseStmt(str, obj); - break; - case T_RTEPermissionInfo: - _outRTEPermissionInfo(str, obj); - break; - case T_MergeAction: - _outMergeAction(str, obj); - break; - case T_PublicationObjSpec: - _outPublicationObjSpec(str, obj); - break; - case T_PublicationTable: - _outPublicationTable(str, obj); - break; - case T_WindowDef: - _outWindowDef(str, obj); - break; - case T_JsonConstructorExpr: - _outJsonConstructorExpr(str, obj); - break; - case T_JsonIsPredicate: - _outJsonIsPredicate(str, obj); - break; - case T_JsonReturning: - _outJsonReturning(str, obj); - break; - case T_JsonValueExpr: - _outJsonValueExpr(str, obj); - break; - case T_JsonFormat: - _outJsonFormat(str, obj); - break; default: elog(ERROR, "could not serialize unrecognized node type: %d", (int) nodeTag(obj)); diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index c48ded5a813..6c907991dab 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -35,28 +35,23 @@ #include +#include "access/attnum.h" #include "common/shortest_dec.h" +#include "executor/execdesc.h" #include "lib/stringinfo.h" #include "miscadmin.h" -#include "nodes/extensible.h" -#include "nodes/pathnodes.h" -#include "nodes/plannodes.h" +#include "nodes/bitmapset.h" +#include "nodes/altertablenodes.h" +#include "nodes/nodes.h" +#include "nodes/pg_list.h" #include "utils/datum.h" -#include "utils/rel.h" -#include "cdb/cdbgang.h" -#include "nodes/altertablenodes.h" +#include "cdb/cdbpathlocus.h" -/* - * outfuncs.c is compiled normally into outfuncs.o, but it's also - * #included from outfast.c. When #included, outfast.c defines - * COMPILING_BINARY_FUNCS, and provides replacements WRITE_* macros. See - * comments at top of readfast.c. - */ -#ifndef COMPILING_BINARY_FUNCS static void outChar(StringInfo str, char c); static void outDouble(StringInfo str, double d); + /* * Macros to simplify output of different kinds of fields. Use these * wherever possible to reduce the chance for silly typos. Note that these @@ -130,36 +125,33 @@ static void outDouble(StringInfo str, double d); /* Write a variable-length array (not a List) of Node pointers */ #define WRITE_NODE_ARRAY(fldname, len) \ - (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ - writeNodeArray(str, (const Node * const *) node->fldname, len)) + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeNodeArray(str, (const Node * const *) node->fldname, len)) +/* Write a variable-length array of AttrNumber */ #define WRITE_ATTRNUMBER_ARRAY(fldname, len) \ - do { \ - appendStringInfoString(str, " :" CppAsString(fldname) " "); \ - for (int i = 0; i < len; i++) \ - appendStringInfo(str, " %d", node->fldname[i]); \ - } while(0) + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeAttrNumberCols(str, node->fldname, len)) +/* Write a variable-length array of Oid */ #define WRITE_OID_ARRAY(fldname, len) \ - do { \ - appendStringInfoString(str, " :" CppAsString(fldname) " "); \ - for (int i = 0; i < len; i++) \ - appendStringInfo(str, " %u", node->fldname[i]); \ - } while(0) + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeOidCols(str, node->fldname, len)) + +/* Write a variable-length array of Index */ +#define WRITE_INDEX_ARRAY(fldname, len) \ + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeIndexCols(str, node->fldname, len)) +/* Write a variable-length array of int */ #define WRITE_INT_ARRAY(fldname, len) \ - do { \ - appendStringInfoString(str, " :" CppAsString(fldname) " "); \ - for (int i = 0; i < len; i++) \ - appendStringInfo(str, " %d", node->fldname[i]); \ - } while(0) + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeIntCols(str, node->fldname, len)) +/* Write a variable-length array of bool */ #define WRITE_BOOL_ARRAY(fldname, len) \ - do { \ - appendStringInfoString(str, " :" CppAsString(fldname) " "); \ - for (int i = 0; i < len; i++) \ - appendStringInfo(str, " %s", booltostr(node->fldname[i])); \ - } while(0) + (appendStringInfoString(str, " :" CppAsString(fldname) " "), \ + writeBoolCols(str, node->fldname, len)) /* Write a bytea field */ #define WRITE_BYTEA_FIELD(fldname) \ @@ -170,48 +162,31 @@ static void outDouble(StringInfo str, double d); (appendStringInfo(str, " :" CppAsString(fldname) " "), \ outToken(str, NULL)) -static void _outCdbPathLocus(StringInfo str, const CdbPathLocus *node); -#endif /* COMPILING_BINARY_FUNCS */ -#define booltostr(x) ((x) ? "true" : "false") - - -#ifndef COMPILING_BINARY_FUNCS - -/* - * Print an array (not a List) of Node pointers. - * - * The decoration is identical to that of scalar arrays, but we can't - * quite use appendStringInfo() in the loop. - */ static void -writeNodeArray(StringInfo str, const Node *const *arr, int len) +_outCdbPathLocus(StringInfo str, const CdbPathLocus *node) { - if (arr != NULL) - { - appendStringInfoChar(str, '('); - for (int i = 0; i < len; i++) - { - appendStringInfoChar(str, ' '); - outNode(str, arr[i]); - } - appendStringInfoChar(str, ')'); - } - else - appendStringInfoString(str, "<>"); + WRITE_ENUM_FIELD(locustype, CdbLocusType); + WRITE_NODE_FIELD(distkey); + WRITE_INT_FIELD(numsegments); } +#define booltostr(x) ((x) ? "true" : "false") + + /* * outToken * Convert an ordinary string (eg, an identifier) into a form that * will be decoded back to a plain token by read.c's functions. * - * If a null or empty string is given, it is encoded as "<>". + * If a null string pointer is given, it is encoded as '<>'. + * An empty string is encoded as '""'. To avoid ambiguity, input + * strings beginning with '<' or '"' receive a leading backslash. */ void outToken(StringInfo str, const char *s) { - if (s == NULL || *s == '\0') + if (s == NULL) { appendStringInfoString(str, "<>"); return; @@ -279,6 +254,61 @@ outDouble(StringInfo str, double d) appendStringInfoString(str, buf); } +/* + * common implementation for scalar-array-writing functions + * + * The data format is either "<>" for a NULL pointer or "(item item item)". + * fmtstr must include a leading space, and the rest of it must produce + * something that will be seen as a single simple token by pg_strtok(). + * convfunc can be empty, or the name of a conversion macro or function. + */ +#define WRITE_SCALAR_ARRAY(fnname, datatype, fmtstr, convfunc) \ +static void \ +fnname(StringInfo str, const datatype *arr, int len) \ +{ \ + if (arr != NULL) \ + { \ + appendStringInfoChar(str, '('); \ + for (int i = 0; i < len; i++) \ + appendStringInfo(str, fmtstr, convfunc(arr[i])); \ + appendStringInfoChar(str, ')'); \ + } \ + else \ + appendStringInfoString(str, "<>"); \ +} + +WRITE_SCALAR_ARRAY(writeAttrNumberCols, AttrNumber, " %d",) +WRITE_SCALAR_ARRAY(writeOidCols, Oid, " %u",) +WRITE_SCALAR_ARRAY(writeIndexCols, Index, " %u",) +WRITE_SCALAR_ARRAY(writeIntCols, int, " %d",) +WRITE_SCALAR_ARRAY(writeBoolCols, bool, " %s", booltostr) + +/* + * Print an array (not a List) of Node pointers. + * + * The decoration is identical to that of scalar arrays, but we can't + * quite use appendStringInfo() in the loop. + */ +static void +writeNodeArray(StringInfo str, const Node *const *arr, int len) +{ + if (arr != NULL) + { + appendStringInfoChar(str, '('); + for (int i = 0; i < len; i++) + { + appendStringInfoChar(str, ' '); + outNode(str, arr[i]); + } + appendStringInfoChar(str, ')'); + } + else + appendStringInfoString(str, "<>"); +} + +/* + * Print a List. + */ static void _outList(StringInfo str, const List *node) { @@ -325,6 +355,9 @@ _outList(StringInfo str, const List *node) * converts a bitmap set of integers * * Note: the output format is "(b int int ...)", similar to an integer List. + * + * We export this function for use by extensions that define extensible nodes. + * That's somewhat historical, though, because calling outNode() will work. */ void outBitmapset(StringInfo str, const Bitmapset *bms) @@ -374,5289 +407,955 @@ outDatum(StringInfo str, Datum value, int typlen, bool typbyval) } } -#endif /* COMPILING_BINARY_FUNCS */ - -/* - * Stuff from plannodes.h - */ - -static void -_outPlannedStmt(StringInfo str, const PlannedStmt *node) -{ - WRITE_NODE_TYPE("PLANNEDSTMT"); - - WRITE_ENUM_FIELD(commandType, CmdType); - WRITE_ENUM_FIELD(planGen, PlanGenerator); - WRITE_UINT64_FIELD(queryId); - WRITE_BOOL_FIELD(hasReturning); - WRITE_BOOL_FIELD(hasModifyingCTE); - WRITE_BOOL_FIELD(canSetTag); - WRITE_BOOL_FIELD(transientPlan); - WRITE_BOOL_FIELD(oneoffPlan); - WRITE_OID_FIELD(simplyUpdatableRel); - WRITE_BOOL_FIELD(dependsOnRole); - WRITE_BOOL_FIELD(parallelModeNeeded); - WRITE_INT_FIELD(jitFlags); - WRITE_NODE_FIELD(planTree); - WRITE_NODE_FIELD(rtable); - WRITE_NODE_FIELD(permInfos); - WRITE_NODE_FIELD(resultRelations); - WRITE_NODE_FIELD(appendRelations); - WRITE_NODE_FIELD(subplans); - WRITE_BITMAPSET_FIELD(rewindPlanIDs); - WRITE_NODE_FIELD(rowMarks); - WRITE_NODE_FIELD(relationOids); - /* - * Don't serialize invalItems when dispatching. The TIDs of the invalidated items wouldn't - * make sense in segments. - */ -#ifndef COMPILING_BINARY_FUNCS - WRITE_NODE_FIELD(invalItems); -#endif /* COMPILING_BINARY_FUNCS */ - WRITE_NODE_FIELD(paramExecTypes); - WRITE_NODE_FIELD(utilityStmt); - WRITE_LOCATION_FIELD(stmt_location); - WRITE_INT_FIELD(stmt_len); - - WRITE_INT_ARRAY(subplan_sliceIds, list_length(node->subplans)); - - WRITE_INT_FIELD(numSlices); - for (int i = 0; i < node->numSlices; i++) - { - WRITE_INT_FIELD(slices[i].sliceIndex); - WRITE_INT_FIELD(slices[i].parentIndex); - WRITE_INT_FIELD(slices[i].gangType); - WRITE_INT_FIELD(slices[i].numsegments); - WRITE_INT_FIELD(slices[i].parallel_workers); - WRITE_INT_FIELD(slices[i].segindex); - WRITE_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); - WRITE_NODE_FIELD(slices[i].directDispatch.contentIds); - } - - WRITE_BITMAPSET_FIELD(rewindPlanIDs); - - WRITE_NODE_FIELD(intoPolicy); - - WRITE_UINT64_FIELD(query_mem); - - WRITE_NODE_FIELD(intoClause); - WRITE_NODE_FIELD(copyIntoClause); - WRITE_NODE_FIELD(refreshClause); - WRITE_INT_FIELD(metricsQueryType); - WRITE_NODE_FIELD(extensionContext); -} +#include "outfuncs.funcs.c" -/* - * print the basic stuff of all nodes that inherit from Plan - */ -static void -_outPlanInfo(StringInfo str, const Plan *node) -{ - WRITE_FLOAT_FIELD(startup_cost); - WRITE_FLOAT_FIELD(total_cost); - WRITE_FLOAT_FIELD(plan_rows); - WRITE_INT_FIELD(plan_width); - WRITE_BOOL_FIELD(parallel_aware); - WRITE_BOOL_FIELD(parallel_safe); - WRITE_BOOL_FIELD(async_capable); - WRITE_INT_FIELD(plan_node_id); - WRITE_NODE_FIELD(targetlist); - WRITE_NODE_FIELD(qual); - WRITE_NODE_FIELD(lefttree); - WRITE_NODE_FIELD(righttree); - WRITE_NODE_FIELD(initPlan); - WRITE_BITMAPSET_FIELD(extParam); - WRITE_BITMAPSET_FIELD(allParam); - /* 'flow' is only needed during planning. */ -#ifndef COMPILING_BINARY_FUNCS - WRITE_NODE_FIELD(flow); -#endif /* COMPILING_BINARY_FUNCS */ - - WRITE_UINT64_FIELD(operatorMemKB); -} /* - * print the basic stuff of all nodes that inherit from Scan + * Support functions for nodes with custom_read_write attribute or + * special_read_write attribute */ -static void -_outScanInfo(StringInfo str, const Scan *node) -{ - _outPlanInfo(str, (const Plan *) node); - - WRITE_UINT_FIELD(scanrelid); -} -/* - * print the basic stuff of all nodes that inherit from Join - */ static void -_outJoinPlanInfo(StringInfo str, const Join *node) +_outConst(StringInfo str, const Const *node) { - _outPlanInfo(str, (const Plan *) node); - - WRITE_BOOL_FIELD(prefetch_inner); - WRITE_BOOL_FIELD(prefetch_joinqual); - WRITE_BOOL_FIELD(prefetch_qual); - - WRITE_ENUM_FIELD(jointype, JoinType); - WRITE_BOOL_FIELD(inner_unique); - WRITE_NODE_FIELD(joinqual); -} - + WRITE_NODE_TYPE("CONST"); -static void -_outPlan(StringInfo str, const Plan *node) -{ - WRITE_NODE_TYPE("PLAN"); + WRITE_OID_FIELD(consttype); + WRITE_INT_FIELD(consttypmod); + WRITE_OID_FIELD(constcollid); + WRITE_INT_FIELD(constlen); + WRITE_BOOL_FIELD(constbyval); + WRITE_BOOL_FIELD(constisnull); + WRITE_LOCATION_FIELD(location); - _outPlanInfo(str, (const Plan *) node); + appendStringInfoString(str, " :constvalue "); + if (node->constisnull) + appendStringInfoString(str, "<>"); + else + outDatum(str, node->constvalue, node->constlen, node->constbyval); } static void -_outResult(StringInfo str, const Result *node) +_outBoolExpr(StringInfo str, const BoolExpr *node) { - WRITE_NODE_TYPE("RESULT"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_NODE_FIELD(resconstantqual); + char *opstr = NULL; - WRITE_INT_FIELD(numHashFilterCols); - WRITE_ATTRNUMBER_ARRAY(hashFilterColIdx, node->numHashFilterCols); - WRITE_OID_ARRAY(hashFilterFuncs, node->numHashFilterCols); -} + WRITE_NODE_TYPE("BOOLEXPR"); -static void -_outProjectSet(StringInfo str, const ProjectSet *node) -{ - WRITE_NODE_TYPE("PROJECTSET"); + /* do-it-yourself enum representation */ + switch (node->boolop) + { + case AND_EXPR: + opstr = "and"; + break; + case OR_EXPR: + opstr = "or"; + break; + case NOT_EXPR: + opstr = "not"; + break; + } + appendStringInfoString(str, " :boolop "); + outToken(str, opstr); - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_FIELD(args); + WRITE_LOCATION_FIELD(location); } static void -_outModifyTable(StringInfo str, const ModifyTable *node) +_outForeignKeyOptInfo(StringInfo str, const ForeignKeyOptInfo *node) { - WRITE_NODE_TYPE("MODIFYTABLE"); + int i; - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_TYPE("FOREIGNKEYOPTINFO"); - WRITE_ENUM_FIELD(operation, CmdType); - WRITE_BOOL_FIELD(canSetTag); - WRITE_UINT_FIELD(nominalRelation); - WRITE_UINT_FIELD(rootRelation); - WRITE_BOOL_FIELD(partColsUpdated); - WRITE_BOOL_FIELD(splitUpdate); - WRITE_NODE_FIELD(resultRelations); - WRITE_NODE_FIELD(updateColnosLists); - WRITE_NODE_FIELD(withCheckOptionLists); - WRITE_NODE_FIELD(returningLists); - WRITE_NODE_FIELD(fdwPrivLists); - WRITE_BITMAPSET_FIELD(fdwDirectModifyPlans); - WRITE_NODE_FIELD(rowMarks); - WRITE_INT_FIELD(epqParam); - WRITE_ENUM_FIELD(onConflictAction, OnConflictAction); - WRITE_NODE_FIELD(arbiterIndexes); - WRITE_NODE_FIELD(onConflictSet); - WRITE_NODE_FIELD(onConflictCols); - WRITE_NODE_FIELD(onConflictWhere); - WRITE_UINT_FIELD(exclRelRTI); - WRITE_NODE_FIELD(exclRelTlist); - WRITE_BOOL_FIELD(forceTupleRouting); - WRITE_NODE_FIELD(mergeActionLists); + WRITE_UINT_FIELD(con_relid); + WRITE_UINT_FIELD(ref_relid); + WRITE_INT_FIELD(nkeys); + WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys); + WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys); + WRITE_OID_ARRAY(conpfeqop, node->nkeys); + WRITE_INT_FIELD(nmatched_ec); + WRITE_INT_FIELD(nconst_ec); + WRITE_INT_FIELD(nmatched_rcols); + WRITE_INT_FIELD(nmatched_ri); + /* for compactness, just print the number of matches per column: */ + appendStringInfoString(str, " :eclass"); + for (i = 0; i < node->nkeys; i++) + appendStringInfo(str, " %d", (node->eclass[i] != NULL)); + appendStringInfoString(str, " :rinfos"); + for (i = 0; i < node->nkeys; i++) + appendStringInfo(str, " %d", list_length(node->rinfos[i])); } static void -_outAppend(StringInfo str, const Append *node) +_outEquivalenceClass(StringInfo str, const EquivalenceClass *node) { - WRITE_NODE_TYPE("APPEND"); - - _outPlanInfo(str, (const Plan *) node); + /* + * To simplify reading, we just chase up to the topmost merged EC and + * print that, without bothering to show the merge-ees separately. + */ + while (node->ec_merged) + node = node->ec_merged; - WRITE_BITMAPSET_FIELD(apprelids); - WRITE_NODE_FIELD(appendplans); - WRITE_INT_FIELD(nasyncplans); - WRITE_INT_FIELD(first_partial_plan); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); -} + WRITE_NODE_TYPE("EQUIVALENCECLASS"); -static void -_outMergeAppend(StringInfo str, const MergeAppend *node) -{ - WRITE_NODE_TYPE("MERGEAPPEND"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_BITMAPSET_FIELD(apprelids); - WRITE_NODE_FIELD(mergeplans); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols); - WRITE_OID_ARRAY(sortOperators, node->numCols); - WRITE_OID_ARRAY(collations, node->numCols); - WRITE_BOOL_ARRAY(nullsFirst, node->numCols); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); + WRITE_NODE_FIELD(ec_opfamilies); + WRITE_OID_FIELD(ec_collation); + WRITE_NODE_FIELD(ec_members); + WRITE_NODE_FIELD(ec_sources); + WRITE_NODE_FIELD(ec_derives); + WRITE_BITMAPSET_FIELD(ec_relids); + WRITE_BOOL_FIELD(ec_has_const); + WRITE_BOOL_FIELD(ec_has_volatile); + WRITE_BOOL_FIELD(ec_broken); + WRITE_UINT_FIELD(ec_sortref); + WRITE_UINT_FIELD(ec_min_security); + WRITE_UINT_FIELD(ec_max_security); } static void -_outRecursiveUnion(StringInfo str, const RecursiveUnion *node) +_outExtensibleNode(StringInfo str, const ExtensibleNode *node) { - WRITE_NODE_TYPE("RECURSIVEUNION"); - - _outPlanInfo(str, (const Plan *) node); + const ExtensibleNodeMethods *methods; - WRITE_INT_FIELD(wtParam); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(dupColIdx, node->numCols); - WRITE_OID_ARRAY(dupOperators, node->numCols); - WRITE_OID_ARRAY(dupCollations, node->numCols); - WRITE_LONG_FIELD(numGroups); -} + methods = GetExtensibleNodeMethods(node->extnodename, false); -static void -_outBitmapAnd(StringInfo str, const BitmapAnd *node) -{ - WRITE_NODE_TYPE("BITMAPAND"); + WRITE_NODE_TYPE("EXTENSIBLENODE"); - _outPlanInfo(str, (const Plan *) node); + WRITE_STRING_FIELD(extnodename); - WRITE_NODE_FIELD(bitmapplans); + /* serialize the private fields */ + methods->nodeOut(str, node); } static void -_outBitmapOr(StringInfo str, const BitmapOr *node) +_outRangeTblEntry(StringInfo str, const RangeTblEntry *node) { - WRITE_NODE_TYPE("BITMAPOR"); - - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_TYPE("RANGETBLENTRY"); - WRITE_BOOL_FIELD(isshared); - WRITE_NODE_FIELD(bitmapplans); -} - -static void -_outGather(StringInfo str, const Gather *node) -{ - WRITE_NODE_TYPE("GATHER"); + /* put alias + eref first to make dump more legible */ + WRITE_NODE_FIELD(alias); + WRITE_NODE_FIELD(eref); + WRITE_ENUM_FIELD(rtekind, RTEKind); + WRITE_BOOL_FIELD(relisivm); - _outPlanInfo(str, (const Plan *) node); + switch (node->rtekind) + { + case RTE_RELATION: + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + WRITE_INT_FIELD(rellockmode); + WRITE_NODE_FIELD(tablesample); + WRITE_UINT_FIELD(perminfoindex); + break; + case RTE_SUBQUERY: + WRITE_NODE_FIELD(subquery); + WRITE_BOOL_FIELD(security_barrier); + /* we re-use these RELATION fields, too: */ + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + WRITE_INT_FIELD(rellockmode); + WRITE_UINT_FIELD(perminfoindex); + break; + case RTE_JOIN: + WRITE_ENUM_FIELD(jointype, JoinType); + WRITE_INT_FIELD(joinmergedcols); + WRITE_NODE_FIELD(joinaliasvars); + WRITE_NODE_FIELD(joinleftcols); + WRITE_NODE_FIELD(joinrightcols); + WRITE_NODE_FIELD(join_using_alias); + break; + case RTE_FUNCTION: + WRITE_NODE_FIELD(functions); + WRITE_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNCTION: + WRITE_NODE_FIELD(subquery); + WRITE_NODE_FIELD(functions); + WRITE_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNC: + WRITE_NODE_FIELD(tablefunc); + break; + case RTE_VALUES: + WRITE_NODE_FIELD(values_lists); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + break; + case RTE_CTE: + WRITE_STRING_FIELD(ctename); + WRITE_UINT_FIELD(ctelevelsup); + WRITE_BOOL_FIELD(self_reference); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + break; + case RTE_NAMEDTUPLESTORE: + WRITE_STRING_FIELD(enrname); + WRITE_FLOAT_FIELD(enrtuples); + WRITE_NODE_FIELD(coltypes); + WRITE_NODE_FIELD(coltypmods); + WRITE_NODE_FIELD(colcollations); + /* we re-use these RELATION fields, too: */ + WRITE_OID_FIELD(relid); + break; + case RTE_RESULT: + /* no extra fields */ + break; + case RTE_VOID: /*CDB*/ + break; + default: + elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind); + break; + } - WRITE_INT_FIELD(num_workers); - WRITE_INT_FIELD(rescan_param); - WRITE_BOOL_FIELD(single_copy); - WRITE_BOOL_FIELD(invisible); - WRITE_BITMAPSET_FIELD(initParam); -} + WRITE_BOOL_FIELD(lateral); + WRITE_BOOL_FIELD(inh); + WRITE_BOOL_FIELD(inFromCl); + WRITE_NODE_FIELD(securityQuals); -static void -_outGatherMerge(StringInfo str, const GatherMerge *node) -{ - WRITE_NODE_TYPE("GATHERMERGE"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_INT_FIELD(num_workers); - WRITE_INT_FIELD(rescan_param); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols); - WRITE_OID_ARRAY(sortOperators, node->numCols); - WRITE_OID_ARRAY(collations, node->numCols); - WRITE_BOOL_ARRAY(nullsFirst, node->numCols); - WRITE_BITMAPSET_FIELD(initParam); + WRITE_BOOL_FIELD(forceDistRandom); } static void -_outScan(StringInfo str, const Scan *node) +_outSerializedParams(StringInfo str, const SerializedParams *node) { - WRITE_NODE_TYPE("SCAN"); - - _outScanInfo(str, node); -} + WRITE_NODE_TYPE("SERIALIZEDPARAMS"); -static void -_outSeqScan(StringInfo str, const SeqScan *node) -{ - WRITE_NODE_TYPE("SEQSCAN"); + WRITE_INT_FIELD(nExternParams); + for (int i = 0; i < node->nExternParams; i++) + { + WRITE_BOOL_FIELD(externParams[i].isnull); + WRITE_INT_FIELD(externParams[i].pflags); + WRITE_OID_FIELD(externParams[i].ptype); + WRITE_INT_FIELD(externParams[i].plen); + WRITE_BOOL_FIELD(externParams[i].pbyval); + + if (!node->externParams[i].isnull) + outDatum(str, + node->externParams[i].value, + node->externParams[i].plen, + node->externParams[i].pbyval); + } - _outScanInfo(str, (const Scan *) node); + WRITE_INT_FIELD(nExecParams); + for (int i = 0; i < node->nExecParams; i++) + { + WRITE_BOOL_FIELD(execParams[i].isnull); + WRITE_BOOL_FIELD(execParams[i].isvalid); + WRITE_INT_FIELD(execParams[i].plen); + WRITE_BOOL_FIELD(execParams[i].pbyval); + + if (node->execParams[i].isvalid && !node->execParams[i].isnull) + outDatum(str, + node->execParams[i].value, + node->execParams[i].plen, + node->execParams[i].pbyval); + WRITE_BOOL_FIELD(execParams[i].pbyval); + } } static void -_outDynamicSeqScan(StringInfo str, const DynamicSeqScan *node) +_outSliceTable(StringInfo str, const SliceTable *node) { - WRITE_NODE_TYPE("DYNAMICSEQSCAN"); + WRITE_NODE_TYPE("SLICETABLE"); - _outScanInfo(str, (Scan *)node); - WRITE_NODE_FIELD(partOids); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); + WRITE_INT_FIELD(localSlice); + WRITE_INT_FIELD(numSlices); + for (int i = 0; i < node->numSlices; i++) + { + WRITE_INT_FIELD(slices[i].sliceIndex); + WRITE_INT_FIELD(slices[i].rootIndex); + WRITE_INT_FIELD(slices[i].parentIndex); + WRITE_INT_FIELD(slices[i].planNumSegments); + WRITE_NODE_FIELD(slices[i].children); /* List of int index */ + WRITE_ENUM_FIELD(slices[i].gangType, GangType); + WRITE_NODE_FIELD(slices[i].segments); /* List of int */ + WRITE_BOOL_FIELD(slices[i].useMppParallelMode); + WRITE_INT_FIELD(slices[i].parallel_workers); + WRITE_DUMMY_FIELD(slices[i].primaryGang); + WRITE_NODE_FIELD(slices[i].primaryProcesses); /* List of (CDBProcess *) */ + WRITE_BITMAPSET_FIELD(slices[i].processesMap); + } + WRITE_BOOL_FIELD(hasMotions); + WRITE_INT_FIELD(instrument_options); + WRITE_INT_FIELD(ic_instance_id); } static void -_outSampleScan(StringInfo str, const SampleScan *node) +_outA_Expr(StringInfo str, const A_Expr *node) { - WRITE_NODE_TYPE("SAMPLESCAN"); + WRITE_NODE_TYPE("A_EXPR"); - _outScanInfo(str, (const Scan *) node); + switch (node->kind) + { + case AEXPR_OP: + appendStringInfoChar(str, ' '); + WRITE_NODE_FIELD(name); + break; + case AEXPR_OP_ANY: + appendStringInfoChar(str, ' '); + WRITE_NODE_FIELD(name); + appendStringInfoString(str, " ANY "); + break; + case AEXPR_OP_ALL: + appendStringInfoChar(str, ' '); + WRITE_NODE_FIELD(name); + appendStringInfoString(str, " ALL "); + break; + case AEXPR_DISTINCT: + appendStringInfoString(str, " DISTINCT "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_NOT_DISTINCT: + appendStringInfoString(str, " NOT_DISTINCT "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_NULLIF: + appendStringInfoString(str, " NULLIF "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_IN: + appendStringInfoString(str, " IN "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_LIKE: + appendStringInfoString(str, " LIKE "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_ILIKE: + appendStringInfoString(str, " ILIKE "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_SIMILAR: + appendStringInfoString(str, " SIMILAR "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_BETWEEN: + appendStringInfoString(str, " BETWEEN "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_NOT_BETWEEN: + appendStringInfoString(str, " NOT_BETWEEN "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_BETWEEN_SYM: + appendStringInfoString(str, " BETWEEN_SYM "); + WRITE_NODE_FIELD(name); + break; + case AEXPR_NOT_BETWEEN_SYM: + appendStringInfoString(str, " NOT_BETWEEN_SYM "); + WRITE_NODE_FIELD(name); + break; + default: + appendStringInfoString(str, " ??"); + break; + } - WRITE_NODE_FIELD(tablesample); + WRITE_NODE_FIELD(lexpr); + WRITE_NODE_FIELD(rexpr); + WRITE_LOCATION_FIELD(location); } static void -outIndexScanFields(StringInfo str, const IndexScan *node) +_outInteger(StringInfo str, const Integer *node) { - _outScanInfo(str, (const Scan *) node); - - WRITE_OID_FIELD(indexid); - WRITE_NODE_FIELD(indexqual); - WRITE_NODE_FIELD(indexqualorig); - WRITE_NODE_FIELD(indexorderby); - WRITE_NODE_FIELD(indexorderbyorig); - WRITE_NODE_FIELD(indexorderbyops); - WRITE_ENUM_FIELD(indexorderdir, ScanDirection); + appendStringInfo(str, "%d", node->ival); } static void -_outIndexScan(StringInfo str, const IndexScan *node) +_outFloat(StringInfo str, const Float *node) { - WRITE_NODE_TYPE("INDEXSCAN"); - - outIndexScanFields(str, node); + /* + * We assume the value is a valid numeric literal and so does not need + * quoting. + */ + appendStringInfoString(str, node->fval); } static void -outIndexOnlyScanFields(StringInfo str, const IndexOnlyScan *node) +_outBoolean(StringInfo str, const Boolean *node) { - _outScanInfo(str, (const Scan *) node); - - WRITE_OID_FIELD(indexid); - WRITE_NODE_FIELD(indexqual); - WRITE_NODE_FIELD(recheckqual); - WRITE_NODE_FIELD(indexorderby); - WRITE_NODE_FIELD(indextlist); - WRITE_ENUM_FIELD(indexorderdir, ScanDirection); + appendStringInfoString(str, node->boolval ? "true" : "false"); } static void -_outIndexOnlyScan(StringInfo str, const IndexOnlyScan *node) +_outString(StringInfo str, const String *node) { - WRITE_NODE_TYPE("INDEXONLYSCAN"); - - outIndexOnlyScanFields(str, node); + /* + * We use outToken to provide escaping of the string's content, but we + * don't want it to convert an empty string to '""', because we're putting + * double quotes around the string already. + */ + appendStringInfoChar(str, '"'); + if (node->sval[0] != '\0') + outToken(str, node->sval); + appendStringInfoChar(str, '"'); } static void -_outDynamicIndexScan(StringInfo str, const DynamicIndexScan *node) +_outBitString(StringInfo str, const BitString *node) { - WRITE_NODE_TYPE("DYNAMICINDEXSCAN"); - - outIndexScanFields(str, &node->indexscan); - WRITE_NODE_FIELD(partOids); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); + /* + * The lexer will always produce a string starting with 'b' or 'x'. There + * might be characters following that that need escaping, but outToken + * won't escape the 'b' or 'x'. This is relied on by nodeTokenType. + */ + Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x'); + outToken(str, node->bsval); } static void -_outDynamicIndexOnlyScan(StringInfo str, const DynamicIndexOnlyScan *node) +_outA_Const(StringInfo str, const A_Const *node) { - WRITE_NODE_TYPE("DYNAMICINDEXONLYSCAN"); + WRITE_NODE_TYPE("A_CONST"); - outIndexOnlyScanFields(str, &node->indexscan); - WRITE_NODE_FIELD(partOids); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); + if (node->isnull) + appendStringInfoString(str, " NULL"); + else + { + appendStringInfoString(str, " :val "); + outNode(str, &node->val); + } + WRITE_LOCATION_FIELD(location); } static void -_outBitmapIndexScanFields(StringInfo str, const BitmapIndexScan *node) +_outConstraint(StringInfo str, const Constraint *node) { - _outScanInfo(str, (Scan *) node); - - WRITE_OID_FIELD(indexid); - WRITE_BOOL_FIELD(isshared); - WRITE_NODE_FIELD(indexqual); - WRITE_NODE_FIELD(indexqualorig); -} + WRITE_NODE_TYPE("CONSTRAINT"); -static void -_outBitmapIndexScan(StringInfo str, const BitmapIndexScan *node) -{ - WRITE_NODE_TYPE("BITMAPINDEXSCAN"); + WRITE_STRING_FIELD(conname); + WRITE_BOOL_FIELD(deferrable); + WRITE_BOOL_FIELD(initdeferred); + WRITE_LOCATION_FIELD(location); - _outBitmapIndexScanFields(str, node); -} + appendStringInfoString(str, " :contype "); + switch (node->contype) + { + case CONSTR_NULL: + appendStringInfoString(str, "NULL"); + break; -static void -_outDynamicBitmapIndexScan(StringInfo str, const DynamicBitmapIndexScan *node) -{ - WRITE_NODE_TYPE("DYNAMICBITMAPINDEXSCAN"); + case CONSTR_NOTNULL: + appendStringInfoString(str, "NOT_NULL"); + break; - _outBitmapIndexScanFields(str, &node->biscan); -} + case CONSTR_DEFAULT: + appendStringInfoString(str, "DEFAULT"); + WRITE_NODE_FIELD(raw_expr); + WRITE_STRING_FIELD(cooked_expr); + break; -static void -outBitmapHeapScanFields(StringInfo str, const BitmapHeapScan *node) -{ - _outScanInfo(str, (const Scan *) node); + case CONSTR_IDENTITY: + appendStringInfoString(str, "IDENTITY"); + WRITE_NODE_FIELD(options); + WRITE_CHAR_FIELD(generated_when); + break; - WRITE_NODE_FIELD(bitmapqualorig); -} + case CONSTR_GENERATED: + appendStringInfoString(str, "GENERATED"); + WRITE_NODE_FIELD(raw_expr); + WRITE_STRING_FIELD(cooked_expr); + WRITE_CHAR_FIELD(generated_when); + break; -static void -_outBitmapHeapScan(StringInfo str, const BitmapHeapScan *node) -{ - WRITE_NODE_TYPE("BITMAPHEAPSCAN"); + case CONSTR_CHECK: + appendStringInfoString(str, "CHECK"); + WRITE_BOOL_FIELD(is_no_inherit); + WRITE_NODE_FIELD(raw_expr); + WRITE_STRING_FIELD(cooked_expr); + WRITE_BOOL_FIELD(skip_validation); + WRITE_BOOL_FIELD(initially_valid); + break; - outBitmapHeapScanFields(str, node); -} + case CONSTR_PRIMARY: + appendStringInfoString(str, "PRIMARY_KEY"); + WRITE_NODE_FIELD(keys); + WRITE_NODE_FIELD(including); + WRITE_NODE_FIELD(options); + WRITE_STRING_FIELD(indexname); + WRITE_STRING_FIELD(indexspace); + WRITE_BOOL_FIELD(reset_default_tblspc); + /* access_method and where_clause not currently used */ + break; -static void -_outDynamicBitmapHeapScan(StringInfo str, const DynamicBitmapHeapScan *node) -{ - WRITE_NODE_TYPE("DYNAMICBITMAPHEAPSCAN"); + case CONSTR_UNIQUE: + appendStringInfoString(str, "UNIQUE"); + WRITE_BOOL_FIELD(nulls_not_distinct); + WRITE_NODE_FIELD(keys); + WRITE_NODE_FIELD(including); + WRITE_NODE_FIELD(options); + WRITE_STRING_FIELD(indexname); + WRITE_STRING_FIELD(indexspace); + WRITE_BOOL_FIELD(reset_default_tblspc); + /* access_method and where_clause not currently used */ + break; - outBitmapHeapScanFields(str, &node->bitmapheapscan); - WRITE_NODE_FIELD(partOids); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); -} + case CONSTR_EXCLUSION: + appendStringInfoString(str, "EXCLUSION"); + WRITE_NODE_FIELD(exclusions); + WRITE_NODE_FIELD(including); + WRITE_NODE_FIELD(options); + WRITE_STRING_FIELD(indexname); + WRITE_STRING_FIELD(indexspace); + WRITE_BOOL_FIELD(reset_default_tblspc); + WRITE_STRING_FIELD(access_method); + WRITE_NODE_FIELD(where_clause); + break; -static void -_outTidScan(StringInfo str, const TidScan *node) -{ - WRITE_NODE_TYPE("TIDSCAN"); + case CONSTR_FOREIGN: + appendStringInfoString(str, "FOREIGN_KEY"); + WRITE_NODE_FIELD(pktable); + WRITE_NODE_FIELD(fk_attrs); + WRITE_NODE_FIELD(pk_attrs); + WRITE_CHAR_FIELD(fk_matchtype); + WRITE_CHAR_FIELD(fk_upd_action); + WRITE_CHAR_FIELD(fk_del_action); + WRITE_NODE_FIELD(fk_del_set_cols); + WRITE_NODE_FIELD(old_conpfeqop); + WRITE_OID_FIELD(old_pktable_oid); + WRITE_BOOL_FIELD(skip_validation); + WRITE_BOOL_FIELD(initially_valid); + break; - _outScanInfo(str, (const Scan *) node); + case CONSTR_ATTR_DEFERRABLE: + appendStringInfoString(str, "ATTR_DEFERRABLE"); + break; - WRITE_NODE_FIELD(tidquals); -} + case CONSTR_ATTR_NOT_DEFERRABLE: + appendStringInfoString(str, "ATTR_NOT_DEFERRABLE"); + break; -static void -_outSubqueryScan(StringInfo str, const SubqueryScan *node) -{ - WRITE_NODE_TYPE("SUBQUERYSCAN"); + case CONSTR_ATTR_DEFERRED: + appendStringInfoString(str, "ATTR_DEFERRED"); + break; - _outScanInfo(str, (const Scan *) node); + case CONSTR_ATTR_IMMEDIATE: + appendStringInfoString(str, "ATTR_IMMEDIATE"); + break; - WRITE_NODE_FIELD(subplan); + default: + elog(ERROR, "unrecognized ConstrType: %d", (int) node->contype); + break; + } } + static void -_outFunctionScan(StringInfo str, const FunctionScan *node) +_outColumnDef(StringInfo str, const ColumnDef *node) { - WRITE_NODE_TYPE("FUNCTIONSCAN"); + WRITE_NODE_TYPE("COLUMNDEF"); - _outScanInfo(str, (const Scan *) node); - - WRITE_NODE_FIELD(functions); - WRITE_BOOL_FIELD(funcordinality); - WRITE_NODE_FIELD(param); - WRITE_BOOL_FIELD(resultInTupleStore); - WRITE_INT_FIELD(initplanId); -} - -static void -_outTableFuncScan(StringInfo str, const TableFuncScan *node) -{ - WRITE_NODE_TYPE("TABLEFUNCSCAN"); - - _outScanInfo(str, (const Scan *) node); - - WRITE_NODE_FIELD(tablefunc); -} - -static void -_outValuesScan(StringInfo str, const ValuesScan *node) -{ - WRITE_NODE_TYPE("VALUESSCAN"); + WRITE_STRING_FIELD(colname); + WRITE_NODE_FIELD(typeName); + WRITE_STRING_FIELD(compression); + WRITE_INT_FIELD(inhcount); + WRITE_BOOL_FIELD(is_local); + WRITE_BOOL_FIELD(is_not_null); + WRITE_BOOL_FIELD(is_from_type); + WRITE_INT_FIELD(attnum); + WRITE_INT_FIELD(storage); + WRITE_NODE_FIELD(raw_default); + WRITE_NODE_FIELD(cooked_default); - _outScanInfo(str, (const Scan *) node); + WRITE_BOOL_FIELD(hasCookedMissingVal); + WRITE_BOOL_FIELD(missingIsNull); + if (node->hasCookedMissingVal && !node->missingIsNull) + outDatum(str, node->missingVal, -1, false); - WRITE_NODE_FIELD(values_lists); + WRITE_CHAR_FIELD(identity); + WRITE_NODE_FIELD(identitySequence); + WRITE_CHAR_FIELD(generated); + WRITE_NODE_FIELD(collClause); + WRITE_OID_FIELD(collOid); + WRITE_NODE_FIELD(constraints); + WRITE_NODE_FIELD(encoding); + WRITE_NODE_FIELD(fdwoptions); + WRITE_LOCATION_FIELD(location); } -static void -_outCteScan(StringInfo str, const CteScan *node) -{ - WRITE_NODE_TYPE("CTESCAN"); - - _outScanInfo(str, (const Scan *) node); - - WRITE_INT_FIELD(ctePlanId); - WRITE_INT_FIELD(cteParam); -} static void -_outNamedTuplestoreScan(StringInfo str, const NamedTuplestoreScan *node) +_outPlannerGlobal(StringInfo str, const PlannerGlobal *node) { - WRITE_NODE_TYPE("NAMEDTUPLESTORESCAN"); - - _outScanInfo(str, (const Scan *) node); + WRITE_NODE_TYPE("PLANNERGLOBAL"); - WRITE_STRING_FIELD(enrname); + /* NB: this isn't a complete set of fields */ + WRITE_NODE_FIELD(subplans); + WRITE_BITMAPSET_FIELD(rewindPlanIDs); + WRITE_NODE_FIELD(finalrtable); + WRITE_NODE_FIELD(finalrowmarks); + WRITE_NODE_FIELD(resultRelations); + WRITE_NODE_FIELD(appendRelations); + WRITE_NODE_FIELD(relationOids); + WRITE_NODE_FIELD(invalItems); + WRITE_NODE_FIELD(paramExecTypes); + WRITE_UINT_FIELD(lastPHId); + WRITE_UINT_FIELD(lastRowMarkId); + WRITE_INT_FIELD(lastPlanNodeId); + WRITE_BOOL_FIELD(transientPlan); + WRITE_BOOL_FIELD(oneoffPlan); + WRITE_NODE_FIELD(share.motStack); + WRITE_BITMAPSET_FIELD(share.qdShares); + WRITE_BOOL_FIELD(dependsOnRole); + WRITE_BOOL_FIELD(parallelModeOK); + WRITE_BOOL_FIELD(parallelModeNeeded); + WRITE_CHAR_FIELD(maxParallelHazard); } static void -_outWorkTableScan(StringInfo str, const WorkTableScan *node) +_outPlannerInfo(StringInfo str, const PlannerInfo *node) { - WRITE_NODE_TYPE("WORKTABLESCAN"); - - _outScanInfo(str, (const Scan *) node); + WRITE_NODE_TYPE("PLANNERINFO"); - WRITE_INT_FIELD(wtParam); + /* NB: this isn't a complete set of fields */ + WRITE_NODE_FIELD(parse); + WRITE_NODE_FIELD(glob); + WRITE_UINT_FIELD(query_level); + WRITE_NODE_FIELD(plan_params); + WRITE_BITMAPSET_FIELD(outer_params); + WRITE_NODE_ARRAY(simple_rel_array, node->simple_rel_array_size); + WRITE_INT_FIELD(simple_rel_array_size); + WRITE_BITMAPSET_FIELD(all_baserels); + WRITE_BITMAPSET_FIELD(outer_join_rels); + WRITE_NODE_FIELD(join_rel_list); + WRITE_NODE_FIELD(join_rel_list); + WRITE_BOOL_FIELD(setup_agg_pushdown); + WRITE_NODE_FIELD(grouped_rel_info_list); + WRITE_INT_FIELD(join_cur_level); + WRITE_NODE_FIELD(init_plans); + WRITE_NODE_FIELD(cte_plan_ids); + WRITE_NODE_FIELD(multiexpr_params); + WRITE_NODE_FIELD(join_domains); + WRITE_NODE_FIELD(eq_classes); + WRITE_BOOL_FIELD(ec_merging_done); + WRITE_NODE_FIELD(canon_pathkeys); + WRITE_NODE_FIELD(left_join_clauses); + WRITE_NODE_FIELD(right_join_clauses); + WRITE_NODE_FIELD(full_join_clauses); + WRITE_NODE_FIELD(join_info_list); + WRITE_INT_FIELD(last_rinfo_serial); + WRITE_BITMAPSET_FIELD(all_result_relids); + WRITE_BITMAPSET_FIELD(leaf_result_relids); + WRITE_NODE_FIELD(append_rel_list); + WRITE_NODE_FIELD(row_identity_vars); + WRITE_NODE_FIELD(rowMarks); + WRITE_NODE_FIELD(placeholder_list); + WRITE_NODE_FIELD(grouped_var_list); + WRITE_NODE_FIELD(fkey_list); + WRITE_NODE_FIELD(query_pathkeys); + WRITE_NODE_FIELD(group_pathkeys); + WRITE_INT_FIELD(num_groupby_pathkeys); + WRITE_NODE_FIELD(window_pathkeys); + WRITE_NODE_FIELD(distinct_pathkeys); + WRITE_NODE_FIELD(sort_pathkeys); + WRITE_NODE_FIELD(processed_groupClause); + WRITE_NODE_FIELD(processed_distinctClause); + WRITE_NODE_FIELD(processed_tlist); + WRITE_INT_FIELD(max_sortgroupref); + WRITE_NODE_FIELD(update_colnos); + WRITE_NODE_FIELD(minmax_aggs); + WRITE_FLOAT_FIELD(total_table_pages); + WRITE_FLOAT_FIELD(tuple_fraction); + WRITE_FLOAT_FIELD(limit_tuples); + WRITE_UINT_FIELD(qual_security_level); + WRITE_BOOL_FIELD(hasJoinRTEs); + WRITE_BOOL_FIELD(hasLateralRTEs); + WRITE_BOOL_FIELD(hasHavingQual); + WRITE_BOOL_FIELD(hasPseudoConstantQuals); + WRITE_BOOL_FIELD(hasAlternativeSubPlans); + WRITE_BOOL_FIELD(placeholdersFrozen); + WRITE_BOOL_FIELD(hasRecursion); + WRITE_NODE_FIELD(agginfos); + WRITE_NODE_FIELD(aggtransinfos); + WRITE_INT_FIELD(numOrderedAggs); + WRITE_BOOL_FIELD(hasNonPartialAggs); + WRITE_BOOL_FIELD(hasNonSerialAggs); + WRITE_INT_FIELD(wt_param_id); + WRITE_NODE_FIELD(non_recursive_path); + WRITE_BITMAPSET_FIELD(curOuterRels); + WRITE_NODE_FIELD(curOuterParams); + WRITE_BOOL_FIELD(partColsUpdated); } static void -outForeignScanFields(StringInfo str, const ForeignScan *node) +_outTupleDescNode(StringInfo str, const TupleDescNode *node) { - _outScanInfo(str, (const Scan *) node); - - WRITE_ENUM_FIELD(operation, CmdType); - WRITE_UINT_FIELD(resultRelation); - WRITE_OID_FIELD(fs_server); - WRITE_NODE_FIELD(fdw_exprs); - WRITE_NODE_FIELD(fdw_private); - WRITE_NODE_FIELD(fdw_scan_tlist); - WRITE_NODE_FIELD(fdw_recheck_quals); - WRITE_BITMAPSET_FIELD(fs_relids); - WRITE_BOOL_FIELD(fsSystemCol); -} + Assert(node->tuple->tdtypeid == RECORDOID); -static void -_outForeignScan(StringInfo str, const ForeignScan *node) -{ - WRITE_NODE_TYPE("FOREIGNSCAN"); + WRITE_NODE_TYPE("TUPLEDESCNODE"); + WRITE_INT_FIELD(natts); + WRITE_INT_FIELD(tuple->natts); - outForeignScanFields(str, node); + WRITE_OID_FIELD(tuple->tdtypeid); + WRITE_INT_FIELD(tuple->tdtypmod); + WRITE_INT_FIELD(tuple->tdrefcount); } -static void -_outDynamicForeignScan(StringInfo str, const DynamicForeignScan *node) -{ - WRITE_NODE_TYPE("DYNAMICFOREIGNSCAN"); - - outForeignScanFields(str, &node->foreignscan); - WRITE_NODE_FIELD(partOids); - WRITE_NODE_FIELD(part_prune_info); - WRITE_NODE_FIELD(join_prune_paramids); - WRITE_NODE_FIELD(fdw_private_list); -} -#ifndef COMPILING_BINARY_FUNCS static void -_outCustomScan(StringInfo str, const CustomScan *node) +wrapStringList(List *list) { - WRITE_NODE_TYPE("CUSTOMSCAN"); - - _outScanInfo(str, (const Scan *) node); - - WRITE_UINT_FIELD(flags); - WRITE_NODE_FIELD(custom_plans); - WRITE_NODE_FIELD(custom_exprs); - WRITE_NODE_FIELD(custom_private); - WRITE_NODE_FIELD(custom_scan_tlist); - WRITE_BITMAPSET_FIELD(custom_relids); - /* CustomName is a key to lookup CustomScanMethods */ - appendStringInfoString(str, " :methods "); - outToken(str, node->methods->CustomName); -} -#endif /* COMPILING_BINARY_FUNCS */ + ListCell *lc; -static void -_outJoin(StringInfo str, const Join *node) -{ - WRITE_NODE_TYPE("JOIN"); + foreach(lc, list) + { + char *str = (char *) lfirst(lc); - _outJoinPlanInfo(str, (const Join *) node); + lfirst(lc) = makeString(str); + } } static void -_outNestLoop(StringInfo str, const NestLoop *node) +unwrapStringList(List *list) { - WRITE_NODE_TYPE("NESTLOOP"); - - _outJoinPlanInfo(str, (const Join *) node); + ListCell *lc; - WRITE_NODE_FIELD(nestParams); + foreach(lc, list) + { + String *val = lfirst(lc); - WRITE_BOOL_FIELD(shared_outer); - WRITE_BOOL_FIELD(singleton_outer); /*CDB-OLAP*/ + lfirst(lc) = strVal(val); + pfree(val); + } } static void -_outMergeJoin(StringInfo str, const MergeJoin *node) +_outAlteredTableInfo(StringInfo str, const AlteredTableInfo *node) { - int numCols; - - WRITE_NODE_TYPE("MERGEJOIN"); - - _outJoinPlanInfo(str, (const Join *) node); + ListCell *lc; - WRITE_BOOL_FIELD(skip_mark_restore); - WRITE_NODE_FIELD(mergeclauses); + WRITE_NODE_TYPE("ALTEREDTABLEINFO"); - numCols = list_length(node->mergeclauses); - - WRITE_OID_ARRAY(mergeFamilies, numCols); - WRITE_OID_ARRAY(mergeCollations, numCols); - WRITE_INT_ARRAY(mergeStrategies, numCols); - WRITE_BOOL_ARRAY(mergeNullsFirst, numCols); - WRITE_BOOL_FIELD(unique_outer); -} + WRITE_OID_FIELD(relid); + WRITE_CHAR_FIELD(relkind); + /* oldDesc is omitted */ -static void -_outHashJoin(StringInfo str, const HashJoin *node) -{ - WRITE_NODE_TYPE("HASHJOIN"); + for (int i = 0; i < AT_NUM_PASSES; i++) + { + WRITE_NODE_FIELD(subcmds[i]); + } - _outJoinPlanInfo(str, (const Join *) node); + /* + * These aren't Nodes in upstream, so make sure the node tags + * are set correctly before trying to serialize them. + */ + foreach(lc, node->constraints) + { + NewConstraint *e = (NewConstraint *) lfirst(lc); + e->type = T_NewConstraint; + } + foreach(lc, node->newvals) + { + NewColumnValue *e = (NewColumnValue *) lfirst(lc); + e->type = T_NewColumnValue; + } - WRITE_NODE_FIELD(hashclauses); - WRITE_NODE_FIELD(hashoperators); - WRITE_NODE_FIELD(hashcollations); - WRITE_NODE_FIELD(hashkeys); - WRITE_NODE_FIELD(hashqualclauses); - WRITE_BOOL_FIELD(batch0_barrier); - WRITE_BOOL_FIELD(outer_motionhazard); -} + WRITE_NODE_FIELD(constraints); + WRITE_NODE_FIELD(newvals); + WRITE_NODE_FIELD(afterStmts); + WRITE_BOOL_FIELD(verify_new_notnull); + WRITE_INT_FIELD(rewrite); + WRITE_OID_FIELD(newAccessMethod); + WRITE_BOOL_FIELD(dist_opfamily_changed); + WRITE_OID_FIELD(new_opclass); + /* + * NB: newTableSpace is excluded, it will be assigned in phase 1 of AlterTable. + * If newTableSpace is required, refer to the name in its corresponding cmd. + * If newTableSpace is strongly required in serialization, please add it + * and update `ATPrepSetTableSpace()` to avoid error. + */ + WRITE_BOOL_FIELD(chgPersistence); + WRITE_CHAR_FIELD(newrelpersistence); + WRITE_NODE_FIELD(partition_constraint); + WRITE_BOOL_FIELD(validate_default); + WRITE_NODE_FIELD(changedConstraintOids); + + /* node->changedConstraintDefs is a list of naked strings, so + * we can't use WRITE_NODE_FIELD on it. Temporarily wrap them in Values. + */ + wrapStringList(node->changedConstraintDefs); + WRITE_NODE_FIELD(changedConstraintDefs); + /* unwrap them again */ + unwrapStringList(node->changedConstraintDefs); -static void -_outAgg(StringInfo str, const Agg *node) -{ - WRITE_NODE_TYPE("AGG"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_ENUM_FIELD(aggstrategy, AggStrategy); - WRITE_ENUM_FIELD(aggsplit, AggSplit); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(grpColIdx, node->numCols); - WRITE_OID_ARRAY(grpOperators, node->numCols); - WRITE_OID_ARRAY(grpCollations, node->numCols); - WRITE_LONG_FIELD(numGroups); - WRITE_UINT64_FIELD(transitionSpace); - WRITE_BITMAPSET_FIELD(aggParams); - WRITE_NODE_FIELD(groupingSets); - WRITE_NODE_FIELD(chain); - WRITE_BOOL_FIELD(streaming); - WRITE_UINT_FIELD(agg_expr_id); + WRITE_NODE_FIELD(changedIndexOids); + wrapStringList(node->changedIndexDefs); + WRITE_NODE_FIELD(changedIndexDefs); + unwrapStringList(node->changedIndexDefs); + WRITE_NODE_FIELD(beforeStmtLists); + WRITE_NODE_FIELD(constraintLists); } static void -_outWindowAgg(StringInfo str, const WindowAgg *node) +_outNewConstraint(StringInfo str, const NewConstraint *node) { - WRITE_NODE_TYPE("WINDOWAGG"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_UINT_FIELD(winref); - WRITE_INT_FIELD(partNumCols); - WRITE_ATTRNUMBER_ARRAY(partColIdx, node->partNumCols); - WRITE_OID_ARRAY(partOperators, node->partNumCols); - WRITE_OID_ARRAY(partCollations, node->partNumCols); - WRITE_INT_FIELD(ordNumCols); - WRITE_ATTRNUMBER_ARRAY(ordColIdx, node->ordNumCols); - WRITE_OID_ARRAY(ordOperators, node->ordNumCols); - WRITE_OID_ARRAY(ordCollations, node->ordNumCols); - WRITE_INT_FIELD(firstOrderCol); - WRITE_OID_FIELD(firstOrderCmpOperator); - WRITE_BOOL_FIELD(firstOrderNullsFirst); - WRITE_INT_FIELD(frameOptions); - WRITE_NODE_FIELD(startOffset); - WRITE_NODE_FIELD(endOffset); - WRITE_NODE_FIELD(runCondition); - WRITE_NODE_FIELD(runConditionOrig); - WRITE_OID_FIELD(startInRangeFunc); - WRITE_OID_FIELD(endInRangeFunc); - WRITE_OID_FIELD(inRangeColl); - WRITE_BOOL_FIELD(inRangeAsc); - WRITE_BOOL_FIELD(inRangeNullsFirst); - WRITE_BOOL_FIELD(topWindow); -} + WRITE_NODE_TYPE("NEWCONSTRAINT"); -static void -_outWindowHashAgg(StringInfo str, const WindowHashAgg *node) -{ - WRITE_NODE_TYPE("WINDOWHASHAGG"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_UINT_FIELD(winref); - WRITE_INT_FIELD(partNumCols); - WRITE_ATTRNUMBER_ARRAY(partColIdx, node->partNumCols); - WRITE_OID_ARRAY(partOperators, node->partNumCols); - WRITE_OID_ARRAY(partCollations, node->partNumCols); - WRITE_INT_FIELD(ordNumCols); - WRITE_ATTRNUMBER_ARRAY(ordColIdx, node->ordNumCols); - WRITE_OID_ARRAY(ordOperators, node->ordNumCols); - WRITE_OID_ARRAY(ordCollations, node->ordNumCols); - WRITE_BOOL_ARRAY(ordNullsFirst, node->ordNumCols); - WRITE_INT_FIELD(frameOptions); - WRITE_NODE_FIELD(startOffset); - WRITE_NODE_FIELD(endOffset); - WRITE_OID_FIELD(startInRangeFunc); - WRITE_OID_FIELD(endInRangeFunc); - WRITE_OID_FIELD(inRangeColl); - WRITE_BOOL_FIELD(inRangeAsc); - WRITE_BOOL_FIELD(inRangeNullsFirst); + WRITE_STRING_FIELD(name); + WRITE_ENUM_FIELD(contype, ConstrType); + WRITE_OID_FIELD(refrelid); + WRITE_OID_FIELD(refindid); + WRITE_OID_FIELD(conid); + WRITE_NODE_FIELD(qual); + /* can't serialize qualstate */ } static void -_outGroup(StringInfo str, const Group *node) +_outPlannedStmt(StringInfo str, const PlannedStmt *node) { - WRITE_NODE_TYPE("GROUP"); - - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_TYPE("PLANNEDSTMT"); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(grpColIdx, node->numCols); - WRITE_OID_ARRAY(grpOperators, node->numCols); - WRITE_OID_ARRAY(grpCollations, node->numCols); -} + WRITE_ENUM_FIELD(commandType, CmdType); + WRITE_ENUM_FIELD(planGen, PlanGenerator); + WRITE_UINT64_FIELD(queryId); + WRITE_BOOL_FIELD(hasReturning); + WRITE_BOOL_FIELD(hasModifyingCTE); + WRITE_BOOL_FIELD(canSetTag); + WRITE_BOOL_FIELD(transientPlan); + WRITE_BOOL_FIELD(oneoffPlan); + WRITE_OID_FIELD(simplyUpdatableRel); + WRITE_BOOL_FIELD(dependsOnRole); + WRITE_BOOL_FIELD(parallelModeNeeded); + WRITE_INT_FIELD(jitFlags); + WRITE_NODE_FIELD(planTree); + WRITE_NODE_FIELD(rtable); + WRITE_NODE_FIELD(permInfos); + WRITE_NODE_FIELD(resultRelations); + WRITE_NODE_FIELD(appendRelations); + WRITE_NODE_FIELD(subplans); + WRITE_BITMAPSET_FIELD(rewindPlanIDs); + WRITE_NODE_FIELD(rowMarks); + WRITE_NODE_FIELD(relationOids); + WRITE_NODE_FIELD(invalItems); + WRITE_NODE_FIELD(paramExecTypes); + WRITE_NODE_FIELD(utilityStmt); + WRITE_LOCATION_FIELD(stmt_location); + WRITE_INT_FIELD(stmt_len); -static void -_outMaterial(StringInfo str, const Material *node) -{ - WRITE_NODE_TYPE("MATERIAL"); + WRITE_INT_ARRAY(subplan_sliceIds, list_length(node->subplans)); - _outPlanInfo(str, (const Plan *) node); + WRITE_INT_FIELD(numSlices); + for (int i = 0; i < node->numSlices; i++) + { + WRITE_INT_FIELD(slices[i].sliceIndex); + WRITE_INT_FIELD(slices[i].parentIndex); + WRITE_INT_FIELD(slices[i].gangType); + WRITE_INT_FIELD(slices[i].numsegments); + WRITE_INT_FIELD(slices[i].parallel_workers); + WRITE_INT_FIELD(slices[i].segindex); + WRITE_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); + WRITE_NODE_FIELD(slices[i].directDispatch.contentIds); + } - WRITE_BOOL_FIELD(cdb_strict); - WRITE_BOOL_FIELD(cdb_shield_child_from_rescans); -} + WRITE_BITMAPSET_FIELD(rewindPlanIDs); -static void -_outSortInfo(StringInfo str, const Sort *node) -{ - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_FIELD(intoPolicy); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numCols); - WRITE_OID_ARRAY(sortOperators, node->numCols); - WRITE_OID_ARRAY(collations, node->numCols); - WRITE_BOOL_ARRAY(nullsFirst, node->numCols); -} + WRITE_UINT64_FIELD(query_mem); -static void -_outSort(StringInfo str, const Sort *node) -{ - WRITE_NODE_TYPE("SORT"); + WRITE_NODE_FIELD(intoClause); + WRITE_NODE_FIELD(copyIntoClause); + WRITE_NODE_FIELD(refreshClause); + WRITE_INT_FIELD(metricsQueryType); + WRITE_NODE_FIELD(extensionContext); - _outSortInfo(str, node); } static void -_outIncrementalSort(StringInfo str, const IncrementalSort *node) +_outMotion(StringInfo str, const Motion *node) { - WRITE_NODE_TYPE("INCREMENTALSORT"); + WRITE_NODE_TYPE("MOTION"); - _outSortInfo(str, (const Sort *) node); - - WRITE_INT_FIELD(nPresortedCols); -} + WRITE_FLOAT_FIELD(plan.startup_cost); + WRITE_FLOAT_FIELD(plan.total_cost); + WRITE_FLOAT_FIELD(plan.plan_rows); + WRITE_INT_FIELD(plan.plan_width); + WRITE_BOOL_FIELD(plan.parallel_aware); + WRITE_BOOL_FIELD(plan.parallel_safe); + WRITE_BOOL_FIELD(plan.async_capable); + WRITE_INT_FIELD(plan.plan_node_id); + WRITE_NODE_FIELD(plan.targetlist); + WRITE_NODE_FIELD(plan.qual); + WRITE_NODE_FIELD(plan.lefttree); + WRITE_NODE_FIELD(plan.righttree); + WRITE_NODE_FIELD(plan.initPlan); + WRITE_BITMAPSET_FIELD(plan.extParam); + WRITE_BITMAPSET_FIELD(plan.allParam); + WRITE_NODE_FIELD(plan.flow); + WRITE_UINT_FIELD(plan.locustype); + WRITE_INT_FIELD(plan.parallel); + WRITE_UINT64_FIELD(plan.operatorMemKB); + + WRITE_INT_FIELD(motionID); + WRITE_ENUM_FIELD(motionType, MotionType); -static void -_outUnique(StringInfo str, const Unique *node) -{ - WRITE_NODE_TYPE("UNIQUE"); + WRITE_BOOL_FIELD(sendSorted); - _outPlanInfo(str, (const Plan *) node); + WRITE_NODE_FIELD(hashExprs); + WRITE_OID_ARRAY(hashFuncs, list_length(node->hashExprs)); + WRITE_INT_FIELD(numSortCols); + WRITE_ATTRNUMBER_ARRAY(sortColIdx, node->numSortCols); + WRITE_OID_ARRAY(sortOperators, node->numSortCols); + WRITE_OID_ARRAY(collations, node->numSortCols); + WRITE_BOOL_ARRAY(nullsFirst, node->numSortCols); + WRITE_INT_FIELD(segidColIdx); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(uniqColIdx, node->numCols); - WRITE_OID_ARRAY(uniqOperators, node->numCols); - WRITE_OID_ARRAY(uniqCollations, node->numCols); + WRITE_INT_FIELD(numHashSegments); } static void -_outHash(StringInfo str, const Hash *node) +_outOidAssignment(StringInfo str, const OidAssignment *node) { - WRITE_NODE_TYPE("HASH"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_NODE_FIELD(hashkeys); - WRITE_OID_FIELD(skewTable); - WRITE_INT_FIELD(skewColumn); - WRITE_BOOL_FIELD(skewInherit); - WRITE_FLOAT_FIELD(rows_total); - WRITE_BOOL_FIELD(rescannable); /*CDB*/ - WRITE_BOOL_FIELD(sync_barrier); -} + WRITE_NODE_TYPE("OIDASSIGNMENT"); -static void -_outSetOp(StringInfo str, const SetOp *node) -{ - WRITE_NODE_TYPE("SETOP"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_ENUM_FIELD(cmd, SetOpCmd); - WRITE_ENUM_FIELD(strategy, SetOpStrategy); - WRITE_INT_FIELD(numCols); - WRITE_ATTRNUMBER_ARRAY(dupColIdx, node->numCols); - WRITE_OID_ARRAY(dupOperators, node->numCols); - WRITE_OID_ARRAY(dupCollations, node->numCols); - WRITE_INT_FIELD(flagColIdx); - WRITE_INT_FIELD(firstFlag); - WRITE_LONG_FIELD(numGroups); + WRITE_OID_FIELD(catalog); + WRITE_STRING_FIELD(objname); + WRITE_OID_FIELD(namespaceOid); + WRITE_OID_FIELD(keyOid1); + WRITE_OID_FIELD(keyOid2); + WRITE_OID_FIELD(oid); } -static void -_outLockRows(StringInfo str, const LockRows *node) +/* + * outNode - + * converts a Node into ascii string and append it to 'str' + */ +void +outNode(StringInfo str, const void *obj) { - WRITE_NODE_TYPE("LOCKROWS"); + /* Guard against stack overflow due to overly complex expressions */ + check_stack_depth(); - _outPlanInfo(str, (const Plan *) node); - - WRITE_NODE_FIELD(rowMarks); - WRITE_INT_FIELD(epqParam); -} - -static void -_outRuntimeFilter(StringInfo str, const RuntimeFilter *node) -{ - WRITE_NODE_TYPE("RUNTIME_FILTER"); - - _outPlanInfo(str, (const Plan *) node); -} - -static void -_outLimit(StringInfo str, const Limit *node) -{ - WRITE_NODE_TYPE("LIMIT"); - - _outPlanInfo(str, (const Plan *) node); - - WRITE_NODE_FIELD(limitOffset); - WRITE_NODE_FIELD(limitCount); - WRITE_ENUM_FIELD(limitOption, LimitOption); - WRITE_INT_FIELD(uniqNumCols); - WRITE_ATTRNUMBER_ARRAY(uniqColIdx, node->uniqNumCols); - WRITE_OID_ARRAY(uniqOperators, node->uniqNumCols); - WRITE_OID_ARRAY(uniqCollations, node->uniqNumCols); -} - -static void -_outNestLoopParam(StringInfo str, const NestLoopParam *node) -{ - WRITE_NODE_TYPE("NESTLOOPPARAM"); - - WRITE_INT_FIELD(paramno); - WRITE_NODE_FIELD(paramval); -} - -static void -_outPlanRowMark(StringInfo str, const PlanRowMark *node) -{ - WRITE_NODE_TYPE("PLANROWMARK"); - - WRITE_UINT_FIELD(rti); - WRITE_UINT_FIELD(prti); - WRITE_UINT_FIELD(rowmarkId); - WRITE_ENUM_FIELD(markType, RowMarkType); - WRITE_INT_FIELD(allMarkTypes); - WRITE_ENUM_FIELD(strength, LockClauseStrength); - WRITE_ENUM_FIELD(waitPolicy, LockWaitPolicy); - WRITE_BOOL_FIELD(isParent); -} - -static void -_outPartitionPruneInfo(StringInfo str, const PartitionPruneInfo *node) -{ - WRITE_NODE_TYPE("PARTITIONPRUNEINFO"); - - WRITE_NODE_FIELD(prune_infos); - WRITE_BITMAPSET_FIELD(other_subplans); -} - -static void -_outPartitionedRelPruneInfo(StringInfo str, const PartitionedRelPruneInfo *node) -{ - WRITE_NODE_TYPE("PARTITIONEDRELPRUNEINFO"); - - WRITE_UINT_FIELD(rtindex); - WRITE_BITMAPSET_FIELD(present_parts); - WRITE_INT_FIELD(nparts); - WRITE_INT_ARRAY(subplan_map, node->nparts); - WRITE_INT_ARRAY(subpart_map, node->nparts); - WRITE_OID_ARRAY(relid_map, node->nparts); - WRITE_NODE_FIELD(initial_pruning_steps); - WRITE_NODE_FIELD(exec_pruning_steps); - WRITE_BITMAPSET_FIELD(execparamids); -} - -static void -_outPartitionPruneStepOp(StringInfo str, const PartitionPruneStepOp *node) -{ - WRITE_NODE_TYPE("PARTITIONPRUNESTEPOP"); - - WRITE_INT_FIELD(step.step_id); - WRITE_INT_FIELD(opstrategy); - WRITE_NODE_FIELD(exprs); - WRITE_NODE_FIELD(cmpfns); - WRITE_BITMAPSET_FIELD(nullkeys); -} - -static void -_outPartitionPruneStepCombine(StringInfo str, const PartitionPruneStepCombine *node) -{ - WRITE_NODE_TYPE("PARTITIONPRUNESTEPCOMBINE"); - - WRITE_INT_FIELD(step.step_id); - WRITE_ENUM_FIELD(combineOp, PartitionPruneCombineOp); - WRITE_NODE_FIELD(source_stepids); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outPlanInvalItem(StringInfo str, const PlanInvalItem *node) -{ - WRITE_NODE_TYPE("PLANINVALITEM"); - - WRITE_INT_FIELD(cacheId); - WRITE_UINT_FIELD(hashValue); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/***************************************************************************** - * - * Stuff from primnodes.h. - * - *****************************************************************************/ - -static void -_outAlias(StringInfo str, const Alias *node) -{ - WRITE_NODE_TYPE("ALIAS"); - - WRITE_STRING_FIELD(aliasname); - WRITE_NODE_FIELD(colnames); -} - -static void -_outRangeVar(StringInfo str, const RangeVar *node) -{ - WRITE_NODE_TYPE("RANGEVAR"); - - /* - * we deliberately ignore catalogname here, since it is presently not - * semantically meaningful - */ - WRITE_STRING_FIELD(catalogname); - WRITE_STRING_FIELD(schemaname); - WRITE_STRING_FIELD(relname); - WRITE_BOOL_FIELD(inh); - WRITE_CHAR_FIELD(relpersistence); - WRITE_NODE_FIELD(alias); - WRITE_LOCATION_FIELD(location); -} - -static void -_outTableFunc(StringInfo str, const TableFunc *node) -{ - WRITE_NODE_TYPE("TABLEFUNC"); - - WRITE_NODE_FIELD(ns_uris); - WRITE_NODE_FIELD(ns_names); - WRITE_NODE_FIELD(docexpr); - WRITE_NODE_FIELD(rowexpr); - WRITE_NODE_FIELD(colnames); - WRITE_NODE_FIELD(coltypes); - WRITE_NODE_FIELD(coltypmods); - WRITE_NODE_FIELD(colcollations); - WRITE_NODE_FIELD(colexprs); - WRITE_NODE_FIELD(coldefexprs); - WRITE_BITMAPSET_FIELD(notnulls); - WRITE_INT_FIELD(ordinalitycol); - WRITE_LOCATION_FIELD(location); -} - -static void -_outIntoClause(StringInfo str, const IntoClause *node) -{ - WRITE_NODE_TYPE("INTOCLAUSE"); - - WRITE_NODE_FIELD(rel); - WRITE_NODE_FIELD(colNames); - WRITE_STRING_FIELD(accessMethod); - WRITE_NODE_FIELD(options); - WRITE_ENUM_FIELD(onCommit, OnCommitAction); - WRITE_STRING_FIELD(tableSpaceName); - WRITE_NODE_FIELD(viewQuery); - WRITE_BOOL_FIELD(skipData); - WRITE_NODE_FIELD(distributedBy); - WRITE_BOOL_FIELD(ivm); - WRITE_OID_FIELD(matviewOid); - WRITE_STRING_FIELD(enrname); - WRITE_BOOL_FIELD(dynamicTbl); - WRITE_STRING_FIELD(schedule); -} - -static void -_outVar(StringInfo str, const Var *node) -{ - WRITE_NODE_TYPE("VAR"); - - WRITE_UINT_FIELD(varno); - WRITE_INT_FIELD(varattno); - WRITE_OID_FIELD(vartype); - WRITE_INT_FIELD(vartypmod); - WRITE_OID_FIELD(varcollid); - WRITE_BITMAPSET_FIELD(varnullingrels); - WRITE_UINT_FIELD(varlevelsup); - WRITE_UINT_FIELD(varnosyn); - WRITE_INT_FIELD(varattnosyn); - WRITE_LOCATION_FIELD(location); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outConst(StringInfo str, const Const *node) -{ - WRITE_NODE_TYPE("CONST"); - - WRITE_OID_FIELD(consttype); - WRITE_INT_FIELD(consttypmod); - WRITE_OID_FIELD(constcollid); - WRITE_INT_FIELD(constlen); - WRITE_BOOL_FIELD(constbyval); - WRITE_BOOL_FIELD(constisnull); - WRITE_LOCATION_FIELD(location); - - appendStringInfoString(str, " :constvalue "); - if (node->constisnull) + if (obj == NULL) appendStringInfoString(str, "<>"); + else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) || + IsA(obj, XidList)) + _outList(str, obj); + /* nodeRead does not want to see { } around these! */ + else if (IsA(obj, Integer)) + _outInteger(str, (Integer *) obj); + else if (IsA(obj, Float)) + _outFloat(str, (Float *) obj); + else if (IsA(obj, Boolean)) + _outBoolean(str, (Boolean *) obj); + else if (IsA(obj, String)) + _outString(str, (String *) obj); + else if (IsA(obj, BitString)) + _outBitString(str, (BitString *) obj); + else if (IsA(obj, Bitmapset)) + outBitmapset(str, (Bitmapset *) obj); else - outDatum(str, node->constvalue, node->constlen, node->constbyval); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outParam(StringInfo str, const Param *node) -{ - WRITE_NODE_TYPE("PARAM"); - - WRITE_ENUM_FIELD(paramkind, ParamKind); - WRITE_INT_FIELD(paramid); - WRITE_OID_FIELD(paramtype); - WRITE_INT_FIELD(paramtypmod); - WRITE_OID_FIELD(paramcollid); - WRITE_LOCATION_FIELD(location); -} - -static void -_outAggref(StringInfo str, const Aggref *node) -{ - WRITE_NODE_TYPE("AGGREF"); - - WRITE_OID_FIELD(aggfnoid); - WRITE_OID_FIELD(aggtype); - WRITE_OID_FIELD(aggcollid); - WRITE_OID_FIELD(inputcollid); - WRITE_OID_FIELD(aggtranstype); - WRITE_NODE_FIELD(aggargtypes); - WRITE_NODE_FIELD(aggdirectargs); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(aggorder); - WRITE_NODE_FIELD(aggdistinct); - WRITE_NODE_FIELD(aggfilter); - WRITE_BOOL_FIELD(aggstar); - WRITE_BOOL_FIELD(aggvariadic); - WRITE_CHAR_FIELD(aggkind); - WRITE_UINT_FIELD(agglevelsup); - WRITE_ENUM_FIELD(aggsplit, AggSplit); - WRITE_INT_FIELD(aggno); - WRITE_INT_FIELD(aggtransno); - WRITE_LOCATION_FIELD(location); - WRITE_INT_FIELD(agg_expr_id); -} - -static void -_outGroupingFunc(StringInfo str, const GroupingFunc *node) -{ - WRITE_NODE_TYPE("GROUPINGFUNC"); - - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(refs); - WRITE_NODE_FIELD(cols); - WRITE_UINT_FIELD(agglevelsup); - WRITE_LOCATION_FIELD(location); -} - -static void -_outWindowFunc(StringInfo str, const WindowFunc *node) -{ - WRITE_NODE_TYPE("WINDOWFUNC"); - - WRITE_OID_FIELD(winfnoid); - WRITE_OID_FIELD(wintype); - WRITE_OID_FIELD(wincollid); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(aggfilter); - WRITE_UINT_FIELD(winref); - WRITE_BOOL_FIELD(winstar); - WRITE_BOOL_FIELD(winagg); - WRITE_BOOL_FIELD(windistinct); - WRITE_LOCATION_FIELD(location); -} - -static void -_outSubscriptingRef(StringInfo str, const SubscriptingRef *node) -{ - WRITE_NODE_TYPE("SUBSCRIPTINGREF"); - - WRITE_OID_FIELD(refcontainertype); - WRITE_OID_FIELD(refelemtype); - WRITE_OID_FIELD(refrestype); - WRITE_INT_FIELD(reftypmod); - WRITE_OID_FIELD(refcollid); - WRITE_NODE_FIELD(refupperindexpr); - WRITE_NODE_FIELD(reflowerindexpr); - WRITE_NODE_FIELD(refexpr); - WRITE_NODE_FIELD(refassgnexpr); -} - -static void -_outFuncExpr(StringInfo str, const FuncExpr *node) -{ - WRITE_NODE_TYPE("FUNCEXPR"); - - WRITE_OID_FIELD(funcid); - WRITE_OID_FIELD(funcresulttype); - WRITE_BOOL_FIELD(funcretset); - WRITE_BOOL_FIELD(funcvariadic); - WRITE_ENUM_FIELD(funcformat, CoercionForm); - WRITE_OID_FIELD(funccollid); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); - WRITE_BOOL_FIELD(is_tablefunc); /* GPDB */ -} - -static void -_outNamedArgExpr(StringInfo str, const NamedArgExpr *node) -{ - WRITE_NODE_TYPE("NAMEDARGEXPR"); - - WRITE_NODE_FIELD(arg); - WRITE_STRING_FIELD(name); - WRITE_INT_FIELD(argnumber); - WRITE_LOCATION_FIELD(location); -} - -static void -_outOpExpr(StringInfo str, const OpExpr *node) -{ - WRITE_NODE_TYPE("OPEXPR"); - - WRITE_OID_FIELD(opno); - WRITE_OID_FIELD(opfuncid); - WRITE_OID_FIELD(opresulttype); - WRITE_BOOL_FIELD(opretset); - WRITE_OID_FIELD(opcollid); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -static void -_outDistinctExpr(StringInfo str, const DistinctExpr *node) -{ - WRITE_NODE_TYPE("DISTINCTEXPR"); - - WRITE_OID_FIELD(opno); - WRITE_OID_FIELD(opfuncid); - WRITE_OID_FIELD(opresulttype); - WRITE_BOOL_FIELD(opretset); - WRITE_OID_FIELD(opcollid); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -static void -_outNullIfExpr(StringInfo str, const NullIfExpr *node) -{ - WRITE_NODE_TYPE("NULLIFEXPR"); - - WRITE_OID_FIELD(opno); - WRITE_OID_FIELD(opfuncid); - WRITE_OID_FIELD(opresulttype); - WRITE_BOOL_FIELD(opretset); - WRITE_OID_FIELD(opcollid); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -static void -_outScalarArrayOpExpr(StringInfo str, const ScalarArrayOpExpr *node) -{ - WRITE_NODE_TYPE("SCALARARRAYOPEXPR"); - - WRITE_OID_FIELD(opno); - WRITE_OID_FIELD(opfuncid); - WRITE_OID_FIELD(hashfuncid); - WRITE_BOOL_FIELD(useOr); - WRITE_OID_FIELD(inputcollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outBoolExpr(StringInfo str, const BoolExpr *node) -{ - char *opstr = NULL; - - WRITE_NODE_TYPE("BOOLEXPR"); - - /* do-it-yourself enum representation */ - switch (node->boolop) { - case AND_EXPR: - opstr = "and"; - break; - case OR_EXPR: - opstr = "or"; - break; - case NOT_EXPR: - opstr = "not"; - break; - } - appendStringInfoString(str, " :boolop "); - outToken(str, opstr); - - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outSubLink(StringInfo str, const SubLink *node) -{ - WRITE_NODE_TYPE("SUBLINK"); - - WRITE_ENUM_FIELD(subLinkType, SubLinkType); - WRITE_INT_FIELD(subLinkId); - WRITE_NODE_FIELD(testexpr); - WRITE_NODE_FIELD(operName); - WRITE_NODE_FIELD(subselect); - WRITE_LOCATION_FIELD(location); -} - -static void -_outSubPlan(StringInfo str, const SubPlan *node) -{ - WRITE_NODE_TYPE("SUBPLAN"); - - WRITE_ENUM_FIELD(subLinkType, SubLinkType); - WRITE_NODE_FIELD(testexpr); - WRITE_NODE_FIELD(paramIds); - WRITE_INT_FIELD(plan_id); - WRITE_STRING_FIELD(plan_name); - WRITE_OID_FIELD(firstColType); - WRITE_INT_FIELD(firstColTypmod); - WRITE_OID_FIELD(firstColCollation); - WRITE_BOOL_FIELD(useHashTable); - WRITE_BOOL_FIELD(unknownEqFalse); - WRITE_BOOL_FIELD(parallel_safe); - WRITE_BOOL_FIELD(is_initplan); /*CDB*/ - WRITE_BOOL_FIELD(is_multirow); /*CDB*/ - WRITE_NODE_FIELD(setParam); - WRITE_NODE_FIELD(parParam); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(extParam); - WRITE_FLOAT_FIELD(startup_cost); - WRITE_FLOAT_FIELD(per_call_cost); -} - -static void -_outAlternativeSubPlan(StringInfo str, const AlternativeSubPlan *node) -{ - WRITE_NODE_TYPE("ALTERNATIVESUBPLAN"); - - WRITE_NODE_FIELD(subplans); -} - -static void -_outFieldSelect(StringInfo str, const FieldSelect *node) -{ - WRITE_NODE_TYPE("FIELDSELECT"); - - WRITE_NODE_FIELD(arg); - WRITE_INT_FIELD(fieldnum); - WRITE_OID_FIELD(resulttype); - WRITE_INT_FIELD(resulttypmod); - WRITE_OID_FIELD(resultcollid); -} - -static void -_outFieldStore(StringInfo str, const FieldStore *node) -{ - WRITE_NODE_TYPE("FIELDSTORE"); - - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(newvals); - WRITE_NODE_FIELD(fieldnums); - WRITE_OID_FIELD(resulttype); -} - -static void -_outRelabelType(StringInfo str, const RelabelType *node) -{ - WRITE_NODE_TYPE("RELABELTYPE"); - - WRITE_NODE_FIELD(arg); - WRITE_OID_FIELD(resulttype); - WRITE_INT_FIELD(resulttypmod); - WRITE_OID_FIELD(resultcollid); - WRITE_ENUM_FIELD(relabelformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCoerceViaIO(StringInfo str, const CoerceViaIO *node) -{ - WRITE_NODE_TYPE("COERCEVIAIO"); - - WRITE_NODE_FIELD(arg); - WRITE_OID_FIELD(resulttype); - WRITE_OID_FIELD(resultcollid); - WRITE_ENUM_FIELD(coerceformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} - -static void -_outArrayCoerceExpr(StringInfo str, const ArrayCoerceExpr *node) -{ - WRITE_NODE_TYPE("ARRAYCOERCEEXPR"); - - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(elemexpr); - WRITE_OID_FIELD(resulttype); - WRITE_INT_FIELD(resulttypmod); - WRITE_OID_FIELD(resultcollid); - WRITE_ENUM_FIELD(coerceformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} + appendStringInfoChar(str, '{'); + switch (nodeTag(obj)) + { +#include "outfuncs.switch.c" -static void -_outConvertRowtypeExpr(StringInfo str, const ConvertRowtypeExpr *node) -{ - WRITE_NODE_TYPE("CONVERTROWTYPEEXPR"); - - WRITE_NODE_FIELD(arg); - WRITE_OID_FIELD(resulttype); - WRITE_ENUM_FIELD(convertformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCollateExpr(StringInfo str, const CollateExpr *node) -{ - WRITE_NODE_TYPE("COLLATE"); - - WRITE_NODE_FIELD(arg); - WRITE_OID_FIELD(collOid); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCaseExpr(StringInfo str, const CaseExpr *node) -{ - WRITE_NODE_TYPE("CASE"); - - WRITE_OID_FIELD(casetype); - WRITE_OID_FIELD(casecollid); - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(defresult); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCaseWhen(StringInfo str, const CaseWhen *node) -{ - WRITE_NODE_TYPE("WHEN"); - - WRITE_NODE_FIELD(expr); - WRITE_NODE_FIELD(result); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCaseTestExpr(StringInfo str, const CaseTestExpr *node) -{ - WRITE_NODE_TYPE("CASETESTEXPR"); - - WRITE_OID_FIELD(typeId); - WRITE_INT_FIELD(typeMod); - WRITE_OID_FIELD(collation); -} - -static void -_outArrayExpr(StringInfo str, const ArrayExpr *node) -{ - WRITE_NODE_TYPE("ARRAY"); - - WRITE_OID_FIELD(array_typeid); - WRITE_OID_FIELD(array_collid); - WRITE_OID_FIELD(element_typeid); - WRITE_NODE_FIELD(elements); - WRITE_BOOL_FIELD(multidims); - WRITE_LOCATION_FIELD(location); -} - -static void -_outRowExpr(StringInfo str, const RowExpr *node) -{ - WRITE_NODE_TYPE("ROW"); - - WRITE_NODE_FIELD(args); - WRITE_OID_FIELD(row_typeid); - WRITE_ENUM_FIELD(row_format, CoercionForm); - WRITE_NODE_FIELD(colnames); - WRITE_LOCATION_FIELD(location); -} - -static void -_outRowCompareExpr(StringInfo str, const RowCompareExpr *node) -{ - WRITE_NODE_TYPE("ROWCOMPARE"); - - WRITE_ENUM_FIELD(rctype, RowCompareType); - WRITE_NODE_FIELD(opnos); - WRITE_NODE_FIELD(opfamilies); - WRITE_NODE_FIELD(inputcollids); - WRITE_NODE_FIELD(largs); - WRITE_NODE_FIELD(rargs); -} - -static void -_outCoalesceExpr(StringInfo str, const CoalesceExpr *node) -{ - WRITE_NODE_TYPE("COALESCE"); - - WRITE_OID_FIELD(coalescetype); - WRITE_OID_FIELD(coalescecollid); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -static void -_outMinMaxExpr(StringInfo str, const MinMaxExpr *node) -{ - WRITE_NODE_TYPE("MINMAX"); - - WRITE_OID_FIELD(minmaxtype); - WRITE_OID_FIELD(minmaxcollid); - WRITE_OID_FIELD(inputcollid); - WRITE_ENUM_FIELD(op, MinMaxOp); - WRITE_NODE_FIELD(args); - WRITE_LOCATION_FIELD(location); -} - -static void -_outSQLValueFunction(StringInfo str, const SQLValueFunction *node) -{ - WRITE_NODE_TYPE("SQLVALUEFUNCTION"); - - WRITE_ENUM_FIELD(op, SQLValueFunctionOp); - WRITE_OID_FIELD(type); - WRITE_INT_FIELD(typmod); - WRITE_LOCATION_FIELD(location); -} - -static void -_outXmlExpr(StringInfo str, const XmlExpr *node) -{ - WRITE_NODE_TYPE("XMLEXPR"); - - WRITE_ENUM_FIELD(op, XmlExprOp); - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(named_args); - WRITE_NODE_FIELD(arg_names); - WRITE_NODE_FIELD(args); - WRITE_ENUM_FIELD(xmloption, XmlOptionType); - WRITE_OID_FIELD(type); - WRITE_INT_FIELD(typmod); - WRITE_LOCATION_FIELD(location); -} - -static void -_outNullTest(StringInfo str, const NullTest *node) -{ - WRITE_NODE_TYPE("NULLTEST"); - - WRITE_NODE_FIELD(arg); - WRITE_ENUM_FIELD(nulltesttype, NullTestType); - WRITE_BOOL_FIELD(argisrow); - WRITE_LOCATION_FIELD(location); -} - -static void -_outBooleanTest(StringInfo str, const BooleanTest *node) -{ - WRITE_NODE_TYPE("BOOLEANTEST"); - - WRITE_NODE_FIELD(arg); - WRITE_ENUM_FIELD(booltesttype, BoolTestType); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCoerceToDomain(StringInfo str, const CoerceToDomain *node) -{ - WRITE_NODE_TYPE("COERCETODOMAIN"); - - WRITE_NODE_FIELD(arg); - WRITE_OID_FIELD(resulttype); - WRITE_INT_FIELD(resulttypmod); - WRITE_OID_FIELD(resultcollid); - WRITE_ENUM_FIELD(coercionformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCoerceToDomainValue(StringInfo str, const CoerceToDomainValue *node) -{ - WRITE_NODE_TYPE("COERCETODOMAINVALUE"); - - WRITE_OID_FIELD(typeId); - WRITE_INT_FIELD(typeMod); - WRITE_OID_FIELD(collation); - WRITE_LOCATION_FIELD(location); -} - -static void -_outSetToDefault(StringInfo str, const SetToDefault *node) -{ - WRITE_NODE_TYPE("SETTODEFAULT"); - - WRITE_OID_FIELD(typeId); - WRITE_INT_FIELD(typeMod); - WRITE_OID_FIELD(collation); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCurrentOfExpr(StringInfo str, const CurrentOfExpr *node) -{ - WRITE_NODE_TYPE("CURRENTOFEXPR"); - - WRITE_UINT_FIELD(cvarno); - WRITE_STRING_FIELD(cursor_name); - WRITE_INT_FIELD(cursor_param); - WRITE_OID_FIELD(target_relid); -} - -static void -_outNextValueExpr(StringInfo str, const NextValueExpr *node) -{ - WRITE_NODE_TYPE("NEXTVALUEEXPR"); - - WRITE_OID_FIELD(seqid); - WRITE_OID_FIELD(typeId); -} - -static void -_outInferenceElem(StringInfo str, const InferenceElem *node) -{ - WRITE_NODE_TYPE("INFERENCEELEM"); - - WRITE_NODE_FIELD(expr); - WRITE_OID_FIELD(infercollid); - WRITE_OID_FIELD(inferopclass); -} - -static void -_outTargetEntry(StringInfo str, const TargetEntry *node) -{ - WRITE_NODE_TYPE("TARGETENTRY"); - - WRITE_NODE_FIELD(expr); - WRITE_INT_FIELD(resno); - WRITE_STRING_FIELD(resname); - WRITE_UINT_FIELD(ressortgroupref); - WRITE_OID_FIELD(resorigtbl); - WRITE_INT_FIELD(resorigcol); - WRITE_BOOL_FIELD(resjunk); -} - -static void -_outRangeTblRef(StringInfo str, const RangeTblRef *node) -{ - WRITE_NODE_TYPE("RANGETBLREF"); - - WRITE_INT_FIELD(rtindex); -} - -static void -_outJoinExpr(StringInfo str, const JoinExpr *node) -{ - WRITE_NODE_TYPE("JOINEXPR"); - - WRITE_ENUM_FIELD(jointype, JoinType); - WRITE_BOOL_FIELD(isNatural); - WRITE_NODE_FIELD(larg); - WRITE_NODE_FIELD(rarg); - WRITE_NODE_FIELD(usingClause); - WRITE_NODE_FIELD(join_using_alias); - WRITE_NODE_FIELD(quals); - WRITE_NODE_FIELD(alias); - WRITE_INT_FIELD(rtindex); -} - -static void -_outFromExpr(StringInfo str, const FromExpr *node) -{ - WRITE_NODE_TYPE("FROMEXPR"); - - WRITE_NODE_FIELD(fromlist); - WRITE_NODE_FIELD(quals); -} - -static void -_outOnConflictExpr(StringInfo str, const OnConflictExpr *node) -{ - WRITE_NODE_TYPE("ONCONFLICTEXPR"); - - WRITE_ENUM_FIELD(action, OnConflictAction); - WRITE_NODE_FIELD(arbiterElems); - WRITE_NODE_FIELD(arbiterWhere); - WRITE_OID_FIELD(constraint); - WRITE_NODE_FIELD(onConflictSet); - WRITE_NODE_FIELD(onConflictWhere); - WRITE_INT_FIELD(exclRelIndex); - WRITE_NODE_FIELD(exclRelTlist); -} - -/***************************************************************************** - * - * Stuff from pathnodes.h. - * - *****************************************************************************/ - -/* - * None of this stuff is needed after planning, and doesn't need to be - * dispatched to QEs. - */ -#ifndef COMPILING_BINARY_FUNCS - -/* - * print the basic stuff of all nodes that inherit from Path - * - * Note we do NOT print the parent, else we'd be in infinite recursion. - * We can print the parent's relids for identification purposes, though. - * We print the pathtarget only if it's not the default one for the rel. - * We also do not print the whole of param_info, since it's printed by - * _outRelOptInfo; it's sufficient and less cluttering to print just the - * required outer relids. - */ -static void -_outPathInfo(StringInfo str, const Path *node) -{ - WRITE_ENUM_FIELD(pathtype, NodeTag); - appendStringInfoString(str, " :parent_relids "); - outBitmapset(str, node->parent->relids); - if (node->pathtarget != node->parent->reltarget) - WRITE_NODE_FIELD(pathtarget); - appendStringInfoString(str, " :required_outer "); - if (node->param_info) - outBitmapset(str, node->param_info->ppi_req_outer); - else - outBitmapset(str, NULL); - WRITE_BOOL_FIELD(parallel_aware); - WRITE_BOOL_FIELD(parallel_safe); - WRITE_INT_FIELD(parallel_workers); - WRITE_FLOAT_FIELD(rows); - WRITE_FLOAT_FIELD(startup_cost); - WRITE_FLOAT_FIELD(total_cost); - _outCdbPathLocus(str, &node->locus); - WRITE_NODE_FIELD(pathkeys); -} - -/* - * print the basic stuff of all nodes that inherit from JoinPath - */ -static void -_outJoinPathInfo(StringInfo str, const JoinPath *node) -{ - _outPathInfo(str, (const Path *) node); - - WRITE_ENUM_FIELD(jointype, JoinType); - WRITE_BOOL_FIELD(inner_unique); - WRITE_NODE_FIELD(outerjoinpath); - WRITE_NODE_FIELD(innerjoinpath); - WRITE_NODE_FIELD(joinrestrictinfo); -} - -static void -_outPath(StringInfo str, const Path *node) -{ - WRITE_NODE_TYPE("PATH"); - - _outPathInfo(str, (const Path *) node); -} - -static void -_outIndexPath(StringInfo str, const IndexPath *node) -{ - WRITE_NODE_TYPE("INDEXPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(indexinfo); - WRITE_NODE_FIELD(indexclauses); - WRITE_NODE_FIELD(indexorderbys); - WRITE_NODE_FIELD(indexorderbycols); - WRITE_ENUM_FIELD(indexscandir, ScanDirection); - WRITE_FLOAT_FIELD(indextotalcost); - WRITE_FLOAT_FIELD(indexselectivity); - WRITE_INT_FIELD(num_leading_eq); -} - -static void -_outBitmapHeapPath(StringInfo str, const BitmapHeapPath *node) -{ - WRITE_NODE_TYPE("BITMAPHEAPPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(bitmapqual); -} - -static void -_outBitmapAndPath(StringInfo str, const BitmapAndPath *node) -{ - WRITE_NODE_TYPE("BITMAPANDPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(bitmapquals); - WRITE_FLOAT_FIELD(bitmapselectivity); -} - -static void -_outBitmapOrPath(StringInfo str, const BitmapOrPath *node) -{ - WRITE_NODE_TYPE("BITMAPORPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(bitmapquals); - WRITE_FLOAT_FIELD(bitmapselectivity); -} - -static void -_outTidPath(StringInfo str, const TidPath *node) -{ - WRITE_NODE_TYPE("TIDPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(tidquals); -} - -static void -_outTidRangePath(StringInfo str, const TidRangePath *node) -{ - WRITE_NODE_TYPE("TIDRANGEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(tidrangequals); -} - -static void -_outSubqueryScanPath(StringInfo str, const SubqueryScanPath *node) -{ - WRITE_NODE_TYPE("SUBQUERYSCANPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); -} - -static void -_outForeignPath(StringInfo str, const ForeignPath *node) -{ - WRITE_NODE_TYPE("FOREIGNPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(fdw_outerpath); - WRITE_NODE_FIELD(fdw_private); -} - -static void -_outCustomPath(StringInfo str, const CustomPath *node) -{ - WRITE_NODE_TYPE("CUSTOMPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_UINT_FIELD(flags); - WRITE_NODE_FIELD(custom_paths); - WRITE_NODE_FIELD(custom_private); - appendStringInfoString(str, " :methods "); - outToken(str, node->methods->CustomName); -} - -static void -_outAppendPath(StringInfo str, const AppendPath *node) -{ - WRITE_NODE_TYPE("APPENDPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpaths); - WRITE_INT_FIELD(first_partial_path); - WRITE_FLOAT_FIELD(limit_tuples); -} - -static void -_outMergeAppendPath(StringInfo str, const MergeAppendPath *node) -{ - WRITE_NODE_TYPE("MERGEAPPENDPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpaths); - WRITE_FLOAT_FIELD(limit_tuples); -} - -static void -_outGroupResultPath(StringInfo str, const GroupResultPath *node) -{ - WRITE_NODE_TYPE("GROUPRESULTPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(quals); -} - -static void -_outMaterialPath(StringInfo str, const MaterialPath *node) -{ - WRITE_NODE_TYPE("MATERIALPATH"); - - _outPathInfo(str, (const Path *) node); - WRITE_BOOL_FIELD(cdb_strict); - WRITE_BOOL_FIELD(cdb_shield_child_from_rescans); - - WRITE_NODE_FIELD(subpath); -} - -static void -_outMemoizePath(StringInfo str, const MemoizePath *node) -{ - WRITE_NODE_TYPE("MEMOIZEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_NODE_FIELD(hash_operators); - WRITE_NODE_FIELD(param_exprs); - WRITE_BOOL_FIELD(singlerow); - WRITE_BOOL_FIELD(binary_mode); - WRITE_FLOAT_FIELD(calls); - WRITE_UINT_FIELD(est_entries); -} - -static void -_outUniquePath(StringInfo str, const UniquePath *node) -{ - WRITE_NODE_TYPE("UNIQUEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_ENUM_FIELD(umethod, UniquePathMethod); - WRITE_NODE_FIELD(in_operators); - WRITE_NODE_FIELD(uniq_exprs); -} - -static void -_outGatherPath(StringInfo str, const GatherPath *node) -{ - WRITE_NODE_TYPE("GATHERPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_BOOL_FIELD(single_copy); - WRITE_INT_FIELD(num_workers); -} - -static void -_outProjectionPath(StringInfo str, const ProjectionPath *node) -{ - WRITE_NODE_TYPE("PROJECTIONPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_BOOL_FIELD(dummypp); -} - -static void -_outProjectSetPath(StringInfo str, const ProjectSetPath *node) -{ - WRITE_NODE_TYPE("PROJECTSETPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); -} - -static void -_outSortPathInfo(StringInfo str, const SortPath *node) -{ - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); -} - -static void -_outSortPath(StringInfo str, const SortPath *node) -{ - WRITE_NODE_TYPE("SORTPATH"); - - _outSortPathInfo(str, node); -} - -static void -_outIncrementalSortPath(StringInfo str, const IncrementalSortPath *node) -{ - WRITE_NODE_TYPE("INCREMENTALSORTPATH"); - - _outSortPathInfo(str, (const SortPath *) node); - - WRITE_INT_FIELD(nPresortedCols); -} - -static void -_outGroupPath(StringInfo str, const GroupPath *node) -{ - WRITE_NODE_TYPE("GROUPPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_NODE_FIELD(groupClause); - WRITE_NODE_FIELD(qual); -} - -static void -_outUpperUniquePath(StringInfo str, const UpperUniquePath *node) -{ - WRITE_NODE_TYPE("UPPERUNIQUEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_INT_FIELD(numkeys); -} - -static void -_outAggPath(StringInfo str, const AggPath *node) -{ - WRITE_NODE_TYPE("AGGPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_ENUM_FIELD(aggstrategy, AggStrategy); - WRITE_ENUM_FIELD(aggsplit, AggSplit); - WRITE_FLOAT_FIELD(numGroups); - WRITE_UINT64_FIELD(transitionSpace); - WRITE_NODE_FIELD(groupClause); - WRITE_NODE_FIELD(qual); - WRITE_BOOL_FIELD(streaming); -} - -static void -_outRollupData(StringInfo str, const RollupData *node) -{ - WRITE_NODE_TYPE("ROLLUP"); - - WRITE_NODE_FIELD(groupClause); - WRITE_NODE_FIELD(gsets); - WRITE_NODE_FIELD(gsets_data); - WRITE_FLOAT_FIELD(numGroups); - WRITE_BOOL_FIELD(hashable); - WRITE_BOOL_FIELD(is_hashed); -} - -static void -_outGroupingSetData(StringInfo str, const GroupingSetData *node) -{ - WRITE_NODE_TYPE("GSDATA"); - - WRITE_NODE_FIELD(set); - WRITE_FLOAT_FIELD(numGroups); -} - -static void -_outGroupingSetsPath(StringInfo str, const GroupingSetsPath *node) -{ - WRITE_NODE_TYPE("GROUPINGSETSPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_ENUM_FIELD(aggstrategy, AggStrategy); - WRITE_NODE_FIELD(rollups); - WRITE_NODE_FIELD(qual); - WRITE_UINT64_FIELD(transitionSpace); -} - -static void -_outMinMaxAggPath(StringInfo str, const MinMaxAggPath *node) -{ - WRITE_NODE_TYPE("MINMAXAGGPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(mmaggregates); - WRITE_NODE_FIELD(quals); -} - -static void -_outWindowAggPath(StringInfo str, const WindowAggPath *node) -{ - WRITE_NODE_TYPE("WINDOWAGGPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_NODE_FIELD(winclause); -} - -static void -_outSetOpPath(StringInfo str, const SetOpPath *node) -{ - WRITE_NODE_TYPE("SETOPPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_ENUM_FIELD(cmd, SetOpCmd); - WRITE_ENUM_FIELD(strategy, SetOpStrategy); - WRITE_NODE_FIELD(distinctList); - WRITE_INT_FIELD(flagColIdx); - WRITE_INT_FIELD(firstFlag); - WRITE_FLOAT_FIELD(numGroups); -} - -static void -_outRecursiveUnionPath(StringInfo str, const RecursiveUnionPath *node) -{ - WRITE_NODE_TYPE("RECURSIVEUNIONPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(leftpath); - WRITE_NODE_FIELD(rightpath); - WRITE_NODE_FIELD(distinctList); - WRITE_INT_FIELD(wtParam); - WRITE_FLOAT_FIELD(numGroups); -} - -static void -_outLockRowsPath(StringInfo str, const LockRowsPath *node) -{ - WRITE_NODE_TYPE("LOCKROWSPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_NODE_FIELD(rowMarks); - WRITE_INT_FIELD(epqParam); -} - -static void -_outModifyTablePath(StringInfo str, const ModifyTablePath *node) -{ - WRITE_NODE_TYPE("MODIFYTABLEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_ENUM_FIELD(operation, CmdType); - WRITE_BOOL_FIELD(canSetTag); - WRITE_UINT_FIELD(nominalRelation); - WRITE_UINT_FIELD(rootRelation); - WRITE_BOOL_FIELD(partColsUpdated); - WRITE_NODE_FIELD(resultRelations); - WRITE_NODE_FIELD(updateColnosLists); - WRITE_NODE_FIELD(withCheckOptionLists); - WRITE_NODE_FIELD(returningLists); - WRITE_NODE_FIELD(rowMarks); - WRITE_NODE_FIELD(onconflict); - WRITE_INT_FIELD(epqParam); - WRITE_NODE_FIELD(mergeActionLists); -} - -static void -_outRuntimeFilterPath(StringInfo str, const LimitPath *node) -{ - WRITE_NODE_TYPE("RUNTIMEFILTER"); - - _outPathInfo(str, (const Path *) node); -} - -static void -_outLimitPath(StringInfo str, const LimitPath *node) -{ - WRITE_NODE_TYPE("LIMITPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_NODE_FIELD(limitOffset); - WRITE_NODE_FIELD(limitCount); - WRITE_ENUM_FIELD(limitOption, LimitOption); -} - -static void -_outGatherMergePath(StringInfo str, const GatherMergePath *node) -{ - WRITE_NODE_TYPE("GATHERMERGEPATH"); - - _outPathInfo(str, (const Path *) node); - - WRITE_NODE_FIELD(subpath); - WRITE_INT_FIELD(num_workers); -} - -static void -_outNestPath(StringInfo str, const NestPath *node) -{ - WRITE_NODE_TYPE("NESTPATH"); - - _outJoinPathInfo(str, (const JoinPath *) node); -} - -static void -_outMergePath(StringInfo str, const MergePath *node) -{ - WRITE_NODE_TYPE("MERGEPATH"); - - _outJoinPathInfo(str, (const JoinPath *) node); - - WRITE_NODE_FIELD(path_mergeclauses); - WRITE_NODE_FIELD(outersortkeys); - WRITE_NODE_FIELD(innersortkeys); - WRITE_BOOL_FIELD(skip_mark_restore); - WRITE_BOOL_FIELD(materialize_inner); -} - -static void -_outHashPath(StringInfo str, const HashPath *node) -{ - WRITE_NODE_TYPE("HASHPATH"); - - _outJoinPathInfo(str, (const JoinPath *) node); - - WRITE_NODE_FIELD(path_hashclauses); - WRITE_INT_FIELD(num_batches); - WRITE_FLOAT_FIELD(inner_rows_total); -} - -static void -_outPlannerGlobal(StringInfo str, const PlannerGlobal *node) -{ - WRITE_NODE_TYPE("PLANNERGLOBAL"); - - /* NB: this isn't a complete set of fields */ - WRITE_NODE_FIELD(subplans); - WRITE_BITMAPSET_FIELD(rewindPlanIDs); - WRITE_NODE_FIELD(finalrtable); - WRITE_NODE_FIELD(finalrowmarks); - WRITE_NODE_FIELD(resultRelations); - WRITE_NODE_FIELD(appendRelations); - WRITE_NODE_FIELD(relationOids); - WRITE_NODE_FIELD(invalItems); - WRITE_NODE_FIELD(paramExecTypes); - WRITE_UINT_FIELD(lastPHId); - WRITE_UINT_FIELD(lastRowMarkId); - WRITE_INT_FIELD(lastPlanNodeId); - WRITE_BOOL_FIELD(transientPlan); - WRITE_BOOL_FIELD(oneoffPlan); - WRITE_NODE_FIELD(share.motStack); - WRITE_BITMAPSET_FIELD(share.qdShares); - WRITE_BOOL_FIELD(dependsOnRole); - WRITE_BOOL_FIELD(parallelModeOK); - WRITE_BOOL_FIELD(parallelModeNeeded); - WRITE_CHAR_FIELD(maxParallelHazard); -} - -static void -_outPlannerInfo(StringInfo str, const PlannerInfo *node) -{ - WRITE_NODE_TYPE("PLANNERINFO"); - - /* NB: this isn't a complete set of fields */ - WRITE_NODE_FIELD(parse); - WRITE_NODE_FIELD(glob); - WRITE_UINT_FIELD(query_level); - WRITE_NODE_FIELD(plan_params); - WRITE_BITMAPSET_FIELD(outer_params); - WRITE_NODE_ARRAY(simple_rel_array, node->simple_rel_array_size); - WRITE_INT_FIELD(simple_rel_array_size); - WRITE_BITMAPSET_FIELD(all_baserels); - WRITE_BITMAPSET_FIELD(outer_join_rels); - WRITE_NODE_FIELD(join_rel_list); - WRITE_NODE_FIELD(join_rel_list); - WRITE_BOOL_FIELD(setup_agg_pushdown); - WRITE_NODE_FIELD(grouped_rel_info_list); - WRITE_INT_FIELD(join_cur_level); - WRITE_NODE_FIELD(init_plans); - WRITE_NODE_FIELD(cte_plan_ids); - WRITE_NODE_FIELD(multiexpr_params); - WRITE_NODE_FIELD(join_domains); - WRITE_NODE_FIELD(eq_classes); - WRITE_BOOL_FIELD(ec_merging_done); - WRITE_NODE_FIELD(canon_pathkeys); - WRITE_NODE_FIELD(left_join_clauses); - WRITE_NODE_FIELD(right_join_clauses); - WRITE_NODE_FIELD(full_join_clauses); - WRITE_NODE_FIELD(join_info_list); - WRITE_INT_FIELD(last_rinfo_serial); - WRITE_BITMAPSET_FIELD(all_result_relids); - WRITE_BITMAPSET_FIELD(leaf_result_relids); - WRITE_NODE_FIELD(append_rel_list); - WRITE_NODE_FIELD(row_identity_vars); - WRITE_NODE_FIELD(rowMarks); - WRITE_NODE_FIELD(placeholder_list); - WRITE_NODE_FIELD(grouped_var_list); - WRITE_NODE_FIELD(fkey_list); - WRITE_NODE_FIELD(query_pathkeys); - WRITE_NODE_FIELD(group_pathkeys); - WRITE_INT_FIELD(num_groupby_pathkeys); - WRITE_NODE_FIELD(window_pathkeys); - WRITE_NODE_FIELD(distinct_pathkeys); - WRITE_NODE_FIELD(sort_pathkeys); - WRITE_NODE_FIELD(processed_groupClause); - WRITE_NODE_FIELD(processed_distinctClause); - WRITE_NODE_FIELD(processed_tlist); - WRITE_INT_FIELD(max_sortgroupref); - WRITE_NODE_FIELD(update_colnos); - WRITE_NODE_FIELD(minmax_aggs); - WRITE_FLOAT_FIELD(total_table_pages); - WRITE_FLOAT_FIELD(tuple_fraction); - WRITE_FLOAT_FIELD(limit_tuples); - WRITE_UINT_FIELD(qual_security_level); - WRITE_BOOL_FIELD(hasJoinRTEs); - WRITE_BOOL_FIELD(hasLateralRTEs); - WRITE_BOOL_FIELD(hasHavingQual); - WRITE_BOOL_FIELD(hasPseudoConstantQuals); - WRITE_BOOL_FIELD(hasAlternativeSubPlans); - WRITE_BOOL_FIELD(placeholdersFrozen); - WRITE_BOOL_FIELD(hasRecursion); - WRITE_NODE_FIELD(agginfos); - WRITE_NODE_FIELD(aggtransinfos); - WRITE_INT_FIELD(numOrderedAggs); - WRITE_BOOL_FIELD(hasNonPartialAggs); - WRITE_BOOL_FIELD(hasNonSerialAggs); - WRITE_INT_FIELD(wt_param_id); - WRITE_NODE_FIELD(non_recursive_path); - WRITE_BITMAPSET_FIELD(curOuterRels); - WRITE_NODE_FIELD(curOuterParams); - WRITE_BOOL_FIELD(partColsUpdated); -} - -static void -_outRelOptInfo(StringInfo str, const RelOptInfo *node) -{ - WRITE_NODE_TYPE("RELOPTINFO"); - - /* NB: this isn't a complete set of fields */ - WRITE_ENUM_FIELD(reloptkind, RelOptKind); - WRITE_BITMAPSET_FIELD(relids); - WRITE_FLOAT_FIELD(rows); - WRITE_BOOL_FIELD(consider_startup); - WRITE_BOOL_FIELD(consider_param_startup); - WRITE_BOOL_FIELD(consider_parallel); - WRITE_NODE_FIELD(reltarget); - WRITE_NODE_FIELD(pathlist); - WRITE_NODE_FIELD(ppilist); - WRITE_NODE_FIELD(partial_pathlist); - WRITE_NODE_FIELD(cheapest_startup_path); - WRITE_NODE_FIELD(cheapest_total_path); - WRITE_NODE_FIELD(cheapest_unique_path); - WRITE_NODE_FIELD(cheapest_parameterized_paths); - WRITE_BITMAPSET_FIELD(direct_lateral_relids); - WRITE_BITMAPSET_FIELD(lateral_relids); - WRITE_UINT_FIELD(relid); - WRITE_OID_FIELD(reltablespace); - WRITE_ENUM_FIELD(rtekind, RTEKind); - WRITE_INT_FIELD(min_attr); - WRITE_INT_FIELD(max_attr); - WRITE_NODE_FIELD(lateral_vars); - WRITE_BITMAPSET_FIELD(lateral_referencers); - WRITE_NODE_FIELD(indexlist); - WRITE_NODE_FIELD(statlist); - WRITE_UINT_FIELD(pages); - WRITE_FLOAT_FIELD(tuples); - WRITE_FLOAT_FIELD(allvisfrac); - WRITE_BITMAPSET_FIELD(eclass_indexes); - WRITE_NODE_FIELD(subroot); - WRITE_NODE_FIELD(subplan_params); - WRITE_INT_FIELD(rel_parallel_workers); - WRITE_UINT_FIELD(amflags); - WRITE_OID_FIELD(serverid); - WRITE_OID_FIELD(userid); - WRITE_BOOL_FIELD(useridiscurrent); - /* we don't try to print fdwroutine or fdw_private */ - /* can't print unique_for_rels/non_unique_for_rels; BMSes aren't Nodes */ - WRITE_NODE_FIELD(baserestrictinfo); - WRITE_UINT_FIELD(baserestrict_min_security); - WRITE_NODE_FIELD(joininfo); - WRITE_BOOL_FIELD(has_eclass_joins); - WRITE_BOOL_FIELD(consider_partitionwise_join); - WRITE_BITMAPSET_FIELD(top_parent_relids); - WRITE_BOOL_FIELD(partbounds_merged); - WRITE_BITMAPSET_FIELD(all_partrels); -} - -static void -_outIndexOptInfo(StringInfo str, const IndexOptInfo *node) -{ - WRITE_NODE_TYPE("INDEXOPTINFO"); - - /* NB: this isn't a complete set of fields */ - WRITE_OID_FIELD(indexoid); - /* Do NOT print rel field, else infinite recursion */ - WRITE_UINT_FIELD(pages); - WRITE_FLOAT_FIELD(tuples); - WRITE_INT_FIELD(tree_height); - WRITE_INT_FIELD(ncolumns); - /* array fields aren't really worth the trouble to print */ - WRITE_OID_FIELD(relam); - /* indexprs is redundant since we print indextlist */ - WRITE_NODE_FIELD(indpred); - WRITE_NODE_FIELD(indextlist); - WRITE_NODE_FIELD(indrestrictinfo); - WRITE_BOOL_FIELD(predOK); - WRITE_BOOL_FIELD(unique); - WRITE_BOOL_FIELD(immediate); - WRITE_BOOL_FIELD(hypothetical); - /* we don't bother with fields copied from the index AM's API struct */ -} - -static void -_outForeignKeyOptInfo(StringInfo str, const ForeignKeyOptInfo *node) -{ - WRITE_NODE_TYPE("FOREIGNKEYOPTINFO"); - - WRITE_UINT_FIELD(con_relid); - WRITE_UINT_FIELD(ref_relid); - WRITE_INT_FIELD(nkeys); - WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys); - WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys); - WRITE_OID_ARRAY(conpfeqop, node->nkeys); - WRITE_INT_FIELD(nmatched_ec); - WRITE_INT_FIELD(nconst_ec); - WRITE_INT_FIELD(nmatched_rcols); - WRITE_INT_FIELD(nmatched_ri); - /* for compactness, just print the number of matches per column: */ - appendStringInfoString(str, " :eclass"); - for (int i = 0; i < node->nkeys; i++) - appendStringInfo(str, " %d", (node->eclass[i] != NULL)); - appendStringInfoString(str, " :rinfos"); - for (int i = 0; i < node->nkeys; i++) - appendStringInfo(str, " %d", list_length(node->rinfos[i])); -} - -static void -_outStatisticExtInfo(StringInfo str, const StatisticExtInfo *node) -{ - WRITE_NODE_TYPE("STATISTICEXTINFO"); - - /* NB: this isn't a complete set of fields */ - WRITE_OID_FIELD(statOid); - /* don't write rel, leads to infinite recursion in plan tree dump */ - WRITE_CHAR_FIELD(kind); - WRITE_BITMAPSET_FIELD(keys); -} - -static void -_outEquivalenceClass(StringInfo str, const EquivalenceClass *node) -{ - /* - * To simplify reading, we just chase up to the topmost merged EC and - * print that, without bothering to show the merge-ees separately. - */ - while (node->ec_merged) - node = node->ec_merged; - - WRITE_NODE_TYPE("EQUIVALENCECLASS"); - - WRITE_NODE_FIELD(ec_opfamilies); - WRITE_OID_FIELD(ec_collation); - WRITE_NODE_FIELD(ec_members); - WRITE_NODE_FIELD(ec_sources); - WRITE_NODE_FIELD(ec_derives); - WRITE_BITMAPSET_FIELD(ec_relids); - WRITE_BOOL_FIELD(ec_has_const); - WRITE_BOOL_FIELD(ec_has_volatile); - WRITE_BOOL_FIELD(ec_broken); - WRITE_UINT_FIELD(ec_sortref); - WRITE_UINT_FIELD(ec_min_security); - WRITE_UINT_FIELD(ec_max_security); -} - -static void -_outEquivalenceMember(StringInfo str, const EquivalenceMember *node) -{ - WRITE_NODE_TYPE("EQUIVALENCEMEMBER"); - - WRITE_NODE_FIELD(em_expr); - WRITE_BITMAPSET_FIELD(em_relids); - WRITE_BOOL_FIELD(em_is_const); - WRITE_BOOL_FIELD(em_is_child); - WRITE_OID_FIELD(em_datatype); - WRITE_NODE_FIELD(em_jdomain); -} - -static void -_outPathKey(StringInfo str, const PathKey *node) -{ - WRITE_NODE_TYPE("PATHKEY"); - - WRITE_NODE_FIELD(pk_eclass); - WRITE_OID_FIELD(pk_opfamily); - WRITE_INT_FIELD(pk_strategy); - WRITE_BOOL_FIELD(pk_nulls_first); -} - -static void -_outPathTarget(StringInfo str, const PathTarget *node) -{ - WRITE_NODE_TYPE("PATHTARGET"); - - WRITE_NODE_FIELD(exprs); - if (node->sortgrouprefs) - { - int i; - - appendStringInfoString(str, " :sortgrouprefs"); - for (i = 0; i < list_length(node->exprs); i++) - appendStringInfo(str, " %u", node->sortgrouprefs[i]); - } - WRITE_FLOAT_FIELD(cost.startup); - WRITE_FLOAT_FIELD(cost.per_tuple); - WRITE_INT_FIELD(width); - WRITE_ENUM_FIELD(has_volatile_expr, VolatileFunctionStatus); -} - -static void -_outParamPathInfo(StringInfo str, const ParamPathInfo *node) -{ - WRITE_NODE_TYPE("PARAMPATHINFO"); - - WRITE_BITMAPSET_FIELD(ppi_req_outer); - WRITE_FLOAT_FIELD(ppi_rows); - WRITE_NODE_FIELD(ppi_clauses); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outRelAggInfo(StringInfo str, const RelAggInfo *node) -{ - WRITE_NODE_TYPE("RELAGGINFO"); - - WRITE_BITMAPSET_FIELD(relids); - WRITE_NODE_FIELD(target); - WRITE_NODE_FIELD(agg_input); - WRITE_FLOAT_FIELD(input_rows); - WRITE_NODE_FIELD(group_clauses); - WRITE_NODE_FIELD(group_exprs); - WRITE_NODE_FIELD(agg_exprs); - - WRITE_BOOL_FIELD(build_from_plain); - - WRITE_NODE_FIELD(rel_grouped); - WRITE_NODE_FIELD(rel_grouped_non_plain); -} - -static void -_outRestrictInfo(StringInfo str, const RestrictInfo *node) -{ - WRITE_NODE_TYPE("RESTRICTINFO"); - - /* NB: this isn't a complete set of fields */ - WRITE_NODE_FIELD(clause); - WRITE_BOOL_FIELD(is_pushed_down); - WRITE_BOOL_FIELD(can_join); - WRITE_BOOL_FIELD(pseudoconstant); - WRITE_BOOL_FIELD(has_clone); - WRITE_BOOL_FIELD(is_clone); - WRITE_BOOL_FIELD(leakproof); - WRITE_ENUM_FIELD(has_volatile, VolatileFunctionStatus); - WRITE_UINT_FIELD(security_level); - WRITE_INT_FIELD(num_base_rels); - WRITE_BOOL_FIELD(contain_outer_query_references); - WRITE_BITMAPSET_FIELD(clause_relids); - WRITE_BITMAPSET_FIELD(required_relids); - WRITE_BITMAPSET_FIELD(incompatible_relids); - WRITE_BITMAPSET_FIELD(outer_relids); - WRITE_BITMAPSET_FIELD(left_relids); - WRITE_BITMAPSET_FIELD(right_relids); - WRITE_NODE_FIELD(orclause); - /* don't write parent_ec, leads to infinite recursion in plan tree dump */ - WRITE_INT_FIELD(rinfo_serial); - WRITE_FLOAT_FIELD(eval_cost.startup); - WRITE_FLOAT_FIELD(eval_cost.per_tuple); - WRITE_FLOAT_FIELD(norm_selec); - WRITE_FLOAT_FIELD(outer_selec); - WRITE_NODE_FIELD(mergeopfamilies); - /* don't write left_ec, leads to infinite recursion in plan tree dump */ - /* don't write right_ec, leads to infinite recursion in plan tree dump */ - WRITE_NODE_FIELD(left_em); - WRITE_NODE_FIELD(right_em); - WRITE_BOOL_FIELD(outer_is_left); - WRITE_OID_FIELD(hashjoinoperator); - WRITE_FLOAT_FIELD(left_bucketsize); - WRITE_FLOAT_FIELD(left_mcvfreq); - WRITE_FLOAT_FIELD(right_mcvfreq); - WRITE_OID_FIELD(left_hasheqoperator); - WRITE_OID_FIELD(right_hasheqoperator); - WRITE_OID_FIELD(hasheqoperator); -} - -static void -_outIndexClause(StringInfo str, const IndexClause *node) -{ - WRITE_NODE_TYPE("INDEXCLAUSE"); - - WRITE_NODE_FIELD(rinfo); - WRITE_NODE_FIELD(indexquals); - WRITE_BOOL_FIELD(lossy); - WRITE_INT_FIELD(indexcol); - WRITE_NODE_FIELD(indexcols); -} - -static void -_outPlaceHolderVar(StringInfo str, const PlaceHolderVar *node) -{ - WRITE_NODE_TYPE("PLACEHOLDERVAR"); - - WRITE_NODE_FIELD(phexpr); - WRITE_BITMAPSET_FIELD(phrels); - WRITE_BITMAPSET_FIELD(phnullingrels); - WRITE_UINT_FIELD(phid); - WRITE_UINT_FIELD(phlevelsup); -} - -static void -_outSpecialJoinInfo(StringInfo str, const SpecialJoinInfo *node) -{ - WRITE_NODE_TYPE("SPECIALJOININFO"); - - WRITE_BITMAPSET_FIELD(min_lefthand); - WRITE_BITMAPSET_FIELD(min_righthand); - WRITE_BITMAPSET_FIELD(syn_lefthand); - WRITE_BITMAPSET_FIELD(syn_righthand); - WRITE_ENUM_FIELD(jointype, JoinType); - WRITE_UINT_FIELD(ojrelid); - WRITE_BITMAPSET_FIELD(commute_above_l); - WRITE_BITMAPSET_FIELD(commute_above_r); - WRITE_BITMAPSET_FIELD(commute_below_l); - WRITE_BITMAPSET_FIELD(commute_below_r); - WRITE_BOOL_FIELD(lhs_strict); - WRITE_BOOL_FIELD(semi_can_btree); - WRITE_BOOL_FIELD(semi_can_hash); - WRITE_NODE_FIELD(semi_operators); - WRITE_NODE_FIELD(semi_rhs_exprs); -} - -static void -_outAppendRelInfo(StringInfo str, const AppendRelInfo *node) -{ - WRITE_NODE_TYPE("APPENDRELINFO"); - - WRITE_UINT_FIELD(parent_relid); - WRITE_UINT_FIELD(child_relid); - WRITE_OID_FIELD(parent_reltype); - WRITE_OID_FIELD(child_reltype); - WRITE_NODE_FIELD(translated_vars); - WRITE_INT_FIELD(num_child_cols); - WRITE_ATTRNUMBER_ARRAY(parent_colnos, node->num_child_cols); - WRITE_OID_FIELD(parent_reloid); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outRowIdentityVarInfo(StringInfo str, const RowIdentityVarInfo *node) -{ - WRITE_NODE_TYPE("ROWIDENTITYVARINFO"); - - WRITE_NODE_FIELD(rowidvar); - WRITE_INT_FIELD(rowidwidth); - WRITE_STRING_FIELD(rowidname); - WRITE_BITMAPSET_FIELD(rowidrels); -} -#endif - -static void -_outPlaceHolderInfo(StringInfo str, const PlaceHolderInfo *node) -{ - WRITE_NODE_TYPE("PLACEHOLDERINFO"); - - WRITE_UINT_FIELD(phid); - WRITE_NODE_FIELD(ph_var); - WRITE_BITMAPSET_FIELD(ph_eval_at); - WRITE_BITMAPSET_FIELD(ph_lateral); - WRITE_BITMAPSET_FIELD(ph_needed); - WRITE_INT_FIELD(ph_width); -} - -static void -_outGroupedVarInfo(StringInfo str, const GroupedVarInfo *node) -{ - WRITE_NODE_TYPE("GROUPEDVARINFO"); - - WRITE_NODE_FIELD(gvexpr); - WRITE_NODE_FIELD(agg_partial); - WRITE_UINT_FIELD(sortgroupref); - WRITE_BITMAPSET_FIELD(gv_eval_at); -} - -static void -_outMinMaxAggInfo(StringInfo str, const MinMaxAggInfo *node) -{ - WRITE_NODE_TYPE("MINMAXAGGINFO"); - - WRITE_OID_FIELD(aggfnoid); - WRITE_OID_FIELD(aggsortop); - WRITE_NODE_FIELD(target); - /* We intentionally omit subroot --- too large, not interesting enough */ - WRITE_NODE_FIELD(path); - WRITE_FLOAT_FIELD(pathcost); - WRITE_NODE_FIELD(param); -} - -static void -_outPlannerParamItem(StringInfo str, const PlannerParamItem *node) -{ - WRITE_NODE_TYPE("PLANNERPARAMITEM"); - - WRITE_NODE_FIELD(item); - WRITE_INT_FIELD(paramId); -} - -/***************************************************************************** - * - * Stuff from extensible.h - * - *****************************************************************************/ - -#ifndef COMPILING_BINARY_FUNCS -static void -_outExtensibleNode(StringInfo str, const ExtensibleNode *node) -{ - const ExtensibleNodeMethods *methods; - - methods = GetExtensibleNodeMethods(node->extnodename, false); - - WRITE_NODE_TYPE("EXTENSIBLENODE"); - - WRITE_STRING_FIELD(extnodename); - - /* serialize the private fields */ - methods->nodeOut(str, node); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/***************************************************************************** - * - * Stuff from parsenodes.h. - * - *****************************************************************************/ - -/* - * print the basic stuff of all nodes that inherit from CreateStmt - */ -static void -_outCreateStmtInfo(StringInfo str, const CreateStmt *node) -{ - WRITE_NODE_FIELD(relation); - WRITE_NODE_FIELD(tableElts); - WRITE_NODE_FIELD(inhRelations); - WRITE_NODE_FIELD(partspec); - WRITE_NODE_FIELD(partbound); - WRITE_NODE_FIELD(ofTypename); - WRITE_NODE_FIELD(constraints); - WRITE_NODE_FIELD(options); - WRITE_ENUM_FIELD(oncommit, OnCommitAction); - WRITE_STRING_FIELD(tablespacename); - WRITE_STRING_FIELD(accessMethod); - WRITE_BOOL_FIELD(if_not_exists); - WRITE_ENUM_FIELD(origin, CreateStmtOrigin); - - WRITE_NODE_FIELD(distributedBy); - WRITE_NODE_FIELD(partitionBy); - WRITE_CHAR_FIELD(relKind); - WRITE_OID_FIELD(ownerid); - WRITE_BOOL_FIELD(buildAoBlkdir); - WRITE_NODE_FIELD(attr_encodings); - WRITE_BOOL_FIELD(isCtas); - WRITE_NODE_FIELD(intoQuery); - WRITE_NODE_FIELD(intoPolicy); - - WRITE_NODE_FIELD(part_idx_oids); - WRITE_NODE_FIELD(part_idx_names); - WRITE_NODE_FIELD(tags); - - /* - * Some extra checks to make sure we didn't get lost - * during serialization/deserialization - */ - Assert(node->relKind != 0); - Assert(node->oncommit <= ONCOMMIT_DROP); -} - -static void -_outCreateStmt(StringInfo str, const CreateStmt *node) -{ - WRITE_NODE_TYPE("CREATESTMT"); - - _outCreateStmtInfo(str, (const CreateStmt *) node); -} - -static void -_outCreateForeignTableStmt(StringInfo str, const CreateForeignTableStmt *node) -{ - WRITE_NODE_TYPE("CREATEFOREIGNTABLESTMT"); - - _outCreateStmtInfo(str, (const CreateStmt *) node); - - WRITE_STRING_FIELD(servername); - WRITE_NODE_FIELD(options); - WRITE_NODE_FIELD(distributedBy); -} - -static void -_outImportForeignSchemaStmt(StringInfo str, const ImportForeignSchemaStmt *node) -{ - WRITE_NODE_TYPE("IMPORTFOREIGNSCHEMASTMT"); - - WRITE_STRING_FIELD(server_name); - WRITE_STRING_FIELD(remote_schema); - WRITE_STRING_FIELD(local_schema); - WRITE_ENUM_FIELD(list_type, ImportForeignSchemaType); - WRITE_NODE_FIELD(table_list); - WRITE_NODE_FIELD(options); -} - -static void -_outIndexStmt(StringInfo str, const IndexStmt *node) -{ - WRITE_NODE_TYPE("INDEXSTMT"); - - WRITE_STRING_FIELD(idxname); - WRITE_NODE_FIELD(relation); - WRITE_OID_FIELD(relationOid); - WRITE_STRING_FIELD(accessMethod); - WRITE_STRING_FIELD(tableSpace); - WRITE_NODE_FIELD(indexParams); - WRITE_NODE_FIELD(indexIncludingParams); - WRITE_NODE_FIELD(options); - WRITE_NODE_FIELD(whereClause); - WRITE_NODE_FIELD(excludeOpNames); - WRITE_STRING_FIELD(idxcomment); - WRITE_OID_FIELD(indexOid); - WRITE_OID_FIELD(oldNumber); - WRITE_UINT_FIELD(oldCreateSubid); - WRITE_UINT_FIELD(oldFirstRelfilelocatorSubid); - WRITE_BOOL_FIELD(unique); - WRITE_BOOL_FIELD(nulls_not_distinct); - WRITE_BOOL_FIELD(primary); - WRITE_BOOL_FIELD(isconstraint); - WRITE_BOOL_FIELD(deferrable); - WRITE_BOOL_FIELD(initdeferred); - WRITE_BOOL_FIELD(transformed); - WRITE_BOOL_FIELD(concurrent); - WRITE_BOOL_FIELD(if_not_exists); - WRITE_BOOL_FIELD(reset_default_tblspc); - WRITE_ENUM_FIELD(concurrentlyPhase, IndexConcurrentlyPhase); - WRITE_OID_FIELD(indexRelationOid); - WRITE_NODE_FIELD(tags); -} - -static void -_outCreateStatsStmt(StringInfo str, const CreateStatsStmt *node) -{ - WRITE_NODE_TYPE("CREATESTATSSTMT"); - - WRITE_NODE_FIELD(defnames); - WRITE_NODE_FIELD(stat_types); - WRITE_NODE_FIELD(exprs); - WRITE_NODE_FIELD(relations); - WRITE_STRING_FIELD(stxcomment); - WRITE_BOOL_FIELD(transformed); - WRITE_BOOL_FIELD(if_not_exists); -} - -static void -_outAlterStatsStmt(StringInfo str, const AlterStatsStmt *node) -{ - WRITE_NODE_TYPE("ALTERSTATSSTMT"); - - WRITE_NODE_FIELD(defnames); - WRITE_INT_FIELD(stxstattarget); - WRITE_BOOL_FIELD(missing_ok); -} - -static void -_outNotifyStmt(StringInfo str, const NotifyStmt *node) -{ - WRITE_NODE_TYPE("NOTIFY"); - - WRITE_STRING_FIELD(conditionname); - WRITE_STRING_FIELD(payload); -} - -static void -_outDeclareCursorStmt(StringInfo str, const DeclareCursorStmt *node) -{ - WRITE_NODE_TYPE("DECLARECURSOR"); - - WRITE_STRING_FIELD(portalname); - WRITE_INT_FIELD(options); - WRITE_NODE_FIELD(query); -} - -/* - * SelectStmt's are never written to the catalog, they only exist - * between parse and parseTransform. The only use of this function - * is for debugging purposes. - * - * In GPDB, these are also dispatched from QD to QEs, so we need full - * out/read support. - * - * If the Nodes Struct changed, we need to maintain these funtions. - */ -static void -_outSelectStmt(StringInfo str, const SelectStmt *node) -{ - WRITE_NODE_TYPE("SELECT"); - - WRITE_NODE_FIELD(distinctClause); - WRITE_NODE_FIELD(intoClause); - WRITE_NODE_FIELD(targetList); - WRITE_NODE_FIELD(fromClause); - WRITE_NODE_FIELD(whereClause); - WRITE_NODE_FIELD(groupClause); - WRITE_BOOL_FIELD(groupDistinct); - WRITE_NODE_FIELD(havingClause); - WRITE_NODE_FIELD(windowClause); - WRITE_NODE_FIELD(valuesLists); - WRITE_NODE_FIELD(sortClause); - WRITE_NODE_FIELD(scatterClause); - WRITE_NODE_FIELD(limitOffset); - WRITE_NODE_FIELD(limitCount); - WRITE_ENUM_FIELD(limitOption, LimitOption); - WRITE_NODE_FIELD(lockingClause); - WRITE_NODE_FIELD(withClause); - WRITE_ENUM_FIELD(op, SetOperation); - WRITE_BOOL_FIELD(all); - WRITE_NODE_FIELD(larg); - WRITE_NODE_FIELD(rarg); - WRITE_BOOL_FIELD(disableLockingOptimization); -} - -static void -_outReturnStmt(StringInfo str, const ReturnStmt *node) -{ - WRITE_NODE_TYPE("RETURN"); - - WRITE_NODE_FIELD(returnval); -} - -#ifndef COMPILING_BINARY_FUNCS - -static void -_outPLAssignStmt(StringInfo str, const PLAssignStmt *node) -{ - WRITE_NODE_TYPE("PLASSIGN"); - - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(indirection); - WRITE_INT_FIELD(nnames); - WRITE_NODE_FIELD(val); - WRITE_LOCATION_FIELD(location); -} -#endif - -static void -_outFuncCall(StringInfo str, const FuncCall *node) -{ - WRITE_NODE_TYPE("FUNCCALL"); - - WRITE_NODE_FIELD(funcname); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(agg_order); - WRITE_NODE_FIELD(agg_filter); - WRITE_NODE_FIELD(over); - WRITE_BOOL_FIELD(agg_within_group); - WRITE_BOOL_FIELD(agg_star); - WRITE_BOOL_FIELD(agg_distinct); - WRITE_BOOL_FIELD(func_variadic); - WRITE_ENUM_FIELD(funcformat, CoercionForm); - WRITE_LOCATION_FIELD(location); -} - -static void -_outDefElem(StringInfo str, const DefElem *node) -{ - WRITE_NODE_TYPE("DEFELEM"); - - WRITE_STRING_FIELD(defnamespace); - WRITE_STRING_FIELD(defname); - WRITE_NODE_FIELD(arg); - WRITE_ENUM_FIELD(defaction, DefElemAction); - WRITE_LOCATION_FIELD(location); -} - -static void -_outTableLikeClause(StringInfo str, const TableLikeClause *node) -{ - WRITE_NODE_TYPE("TABLELIKECLAUSE"); - - WRITE_NODE_FIELD(relation); - WRITE_UINT_FIELD(options); - WRITE_OID_FIELD(relationOid); -} - -static void -_outLockingClause(StringInfo str, const LockingClause *node) -{ - WRITE_NODE_TYPE("LOCKINGCLAUSE"); - - WRITE_NODE_FIELD(lockedRels); - WRITE_ENUM_FIELD(strength, LockClauseStrength); - WRITE_ENUM_FIELD(waitPolicy, LockWaitPolicy); -} - -static void -_outXmlSerialize(StringInfo str, const XmlSerialize *node) -{ - WRITE_NODE_TYPE("XMLSERIALIZE"); - - WRITE_ENUM_FIELD(xmloption, XmlOptionType); - WRITE_NODE_FIELD(expr); - WRITE_NODE_FIELD(typeName); - WRITE_LOCATION_FIELD(location); -} - -static void -_outTriggerTransition(StringInfo str, const TriggerTransition *node) -{ - WRITE_NODE_TYPE("TRIGGERTRANSITION"); - - WRITE_STRING_FIELD(name); - WRITE_BOOL_FIELD(isNew); - WRITE_BOOL_FIELD(isTable); -} - -static void -_outColumnDef(StringInfo str, const ColumnDef *node) -{ - WRITE_NODE_TYPE("COLUMNDEF"); - - WRITE_STRING_FIELD(colname); - WRITE_NODE_FIELD(typeName); - WRITE_STRING_FIELD(compression); - WRITE_INT_FIELD(inhcount); - WRITE_BOOL_FIELD(is_local); - WRITE_BOOL_FIELD(is_not_null); - WRITE_BOOL_FIELD(is_from_type); - WRITE_INT_FIELD(attnum); - WRITE_INT_FIELD(storage); - WRITE_STRING_FIELD(storage_name); - WRITE_NODE_FIELD(raw_default); - WRITE_NODE_FIELD(cooked_default); - - WRITE_BOOL_FIELD(hasCookedMissingVal); - WRITE_BOOL_FIELD(missingIsNull); - if (node->hasCookedMissingVal && !node->missingIsNull) - outDatum(str, node->missingVal, -1, false); - - WRITE_CHAR_FIELD(identity); - WRITE_NODE_FIELD(identitySequence); - WRITE_CHAR_FIELD(generated); - WRITE_NODE_FIELD(collClause); - WRITE_OID_FIELD(collOid); - WRITE_NODE_FIELD(constraints); - WRITE_NODE_FIELD(encoding); - WRITE_NODE_FIELD(fdwoptions); - WRITE_LOCATION_FIELD(location); -} - -static void -_outTypeName(StringInfo str, const TypeName *node) -{ - WRITE_NODE_TYPE("TYPENAME"); - - WRITE_NODE_FIELD(names); - WRITE_OID_FIELD(typeOid); - WRITE_BOOL_FIELD(setof); - WRITE_BOOL_FIELD(pct_type); - WRITE_NODE_FIELD(typmods); - WRITE_INT_FIELD(typemod); - WRITE_NODE_FIELD(arrayBounds); - WRITE_LOCATION_FIELD(location); -} - -static void -_outTypeCast(StringInfo str, const TypeCast *node) -{ - WRITE_NODE_TYPE("TYPECAST"); - - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(typeName); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCollateClause(StringInfo str, const CollateClause *node) -{ - WRITE_NODE_TYPE("COLLATECLAUSE"); - - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(collname); - WRITE_LOCATION_FIELD(location); -} - -static void -_outIndexElem(StringInfo str, const IndexElem *node) -{ - WRITE_NODE_TYPE("INDEXELEM"); - - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(expr); - WRITE_STRING_FIELD(indexcolname); - WRITE_NODE_FIELD(collation); - WRITE_NODE_FIELD(opclass); - WRITE_NODE_FIELD(opclassopts); - WRITE_ENUM_FIELD(ordering, SortByDir); - WRITE_ENUM_FIELD(nulls_ordering, SortByNulls); -} - -static void -_outStatsElem(StringInfo str, const StatsElem *node) -{ - WRITE_NODE_TYPE("STATSELEM"); - - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(expr); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outQuery(StringInfo str, const Query *node) -{ - WRITE_NODE_TYPE("QUERY"); - - WRITE_ENUM_FIELD(commandType, CmdType); - WRITE_ENUM_FIELD(querySource, QuerySource); - /* we intentionally do not print the queryId field */ - WRITE_BOOL_FIELD(canSetTag); - - /* - * Hack to work around missing outfuncs routines for a lot of the - * utility-statement node types. (The only one we actually *need* for - * rules support is NotifyStmt.) Someday we ought to support 'em all, but - * for the meantime do this to avoid getting lots of warnings when running - * with debug_print_parse on. - */ - if (node->utilityStmt) - { - switch (nodeTag(node->utilityStmt)) - { - case T_CreateStmt: - case T_CreateExternalStmt: - case T_DropStmt: - case T_TruncateStmt: - case T_AlterTableStmt: - case T_AlterTableCmd: - case T_ViewStmt: - case T_RuleStmt: - - case T_CreateRoleStmt: - case T_AlterRoleStmt: - case T_AlterRoleSetStmt: - case T_DropRoleStmt: - - case T_CreateProfileStmt: - case T_AlterProfileStmt: - case T_DropProfileStmt: - - case T_CreateSchemaStmt: - case T_AlterSchemaStmt: - case T_CreatePLangStmt: - case T_AlterOwnerStmt: - case T_AlterObjectSchemaStmt: - - case T_CreateTableSpaceStmt: - - case T_RenameStmt: - case T_IndexStmt: - case T_NotifyStmt: - case T_DeclareCursorStmt: - case T_VacuumStmt: - case T_CreateSeqStmt: - case T_AlterSeqStmt: - case T_CreatedbStmt: - case T_AlterDatabaseSetStmt: - case T_DropdbStmt: - case T_CreateDomainStmt: - case T_AlterDomainStmt: - case T_ClusterStmt: - - case T_CreateFunctionStmt: - case T_AlterFunctionStmt: - - case T_TransactionStmt: - case T_GrantStmt: - case T_GrantRoleStmt: - case T_LockStmt: - case T_CopyStmt: - case T_ReindexStmt: - case T_ConstraintsSetStmt: - case T_VariableSetStmt: - case T_CreateTrigStmt: - case T_DefineStmt: - case T_CompositeTypeStmt: - case T_CreateCastStmt: - case T_CreateOpClassStmt: - case T_CreateOpClassItem: - case T_CreateConversionStmt: - WRITE_NODE_FIELD(utilityStmt); - break; - default: - appendStringInfoString(str, " :utilityStmt ?"); - appendStringInfo(str, "%u", nodeTag(node->utilityStmt)); - break; - } - } - else - appendStringInfoString(str, " :utilityStmt <>"); - - WRITE_INT_FIELD(resultRelation); - WRITE_BOOL_FIELD(hasAggs); - WRITE_BOOL_FIELD(hasWindowFuncs); - WRITE_BOOL_FIELD(hasTargetSRFs); - WRITE_BOOL_FIELD(hasSubLinks); - WRITE_BOOL_FIELD(hasDynamicFunctions); - WRITE_BOOL_FIELD(hasFuncsWithExecRestrictions); - WRITE_BOOL_FIELD(hasDistinctOn); - WRITE_BOOL_FIELD(hasRecursive); - WRITE_BOOL_FIELD(hasModifyingCTE); - WRITE_BOOL_FIELD(hasForUpdate); - WRITE_BOOL_FIELD(hasRowSecurity); - WRITE_BOOL_FIELD(canOptSelectLockingClause); - WRITE_BOOL_FIELD(isReturn); - WRITE_NODE_FIELD(cteList); - WRITE_NODE_FIELD(rtable); - WRITE_NODE_FIELD(rteperminfos); - WRITE_NODE_FIELD(jointree); - WRITE_NODE_FIELD(mergeActionList); - WRITE_BOOL_FIELD(mergeUseOuterJoin); - WRITE_NODE_FIELD(targetList); - WRITE_ENUM_FIELD(override, OverridingKind); - WRITE_NODE_FIELD(onConflict); - WRITE_NODE_FIELD(returningList); - WRITE_NODE_FIELD(groupClause); - WRITE_BOOL_FIELD(groupDistinct); - WRITE_NODE_FIELD(groupingSets); - WRITE_NODE_FIELD(havingQual); - WRITE_NODE_FIELD(windowClause); - WRITE_NODE_FIELD(distinctClause); - WRITE_NODE_FIELD(sortClause); - WRITE_NODE_FIELD(scatterClause); - WRITE_BOOL_FIELD(isTableValueSelect); - WRITE_NODE_FIELD(limitOffset); - WRITE_NODE_FIELD(limitCount); - WRITE_ENUM_FIELD(limitOption, LimitOption); - WRITE_NODE_FIELD(rowMarks); - WRITE_NODE_FIELD(setOperations); - WRITE_NODE_FIELD(constraintDeps); - WRITE_NODE_FIELD(withCheckOptions); - WRITE_LOCATION_FIELD(stmt_location); - WRITE_INT_FIELD(stmt_len); - WRITE_BOOL_FIELD(parentStmtType); - - /* Don't serialize policy */ -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outWithCheckOption(StringInfo str, const WithCheckOption *node) -{ - WRITE_NODE_TYPE("WITHCHECKOPTION"); - - WRITE_ENUM_FIELD(kind, WCOKind); - WRITE_STRING_FIELD(relname); - WRITE_STRING_FIELD(polname); - WRITE_NODE_FIELD(qual); - WRITE_BOOL_FIELD(cascaded); -} - -static void -_outSortGroupClause(StringInfo str, const SortGroupClause *node) -{ - WRITE_NODE_TYPE("SORTGROUPCLAUSE"); - - WRITE_UINT_FIELD(tleSortGroupRef); - WRITE_OID_FIELD(eqop); - WRITE_OID_FIELD(sortop); - WRITE_BOOL_FIELD(nulls_first); - WRITE_BOOL_FIELD(hashable); -} - -static void -_outGroupingSet(StringInfo str, const GroupingSet *node) -{ - WRITE_NODE_TYPE("GROUPINGSET"); - - WRITE_ENUM_FIELD(kind, GroupingSetKind); - WRITE_NODE_FIELD(content); - WRITE_LOCATION_FIELD(location); -} - -static void -_outWindowClause(StringInfo str, const WindowClause *node) -{ - WRITE_NODE_TYPE("WINDOWCLAUSE"); - - WRITE_STRING_FIELD(name); - WRITE_STRING_FIELD(refname); - WRITE_NODE_FIELD(partitionClause); - WRITE_NODE_FIELD(orderClause); - WRITE_INT_FIELD(frameOptions); - WRITE_NODE_FIELD(startOffset); - WRITE_NODE_FIELD(endOffset); - WRITE_OID_FIELD(startInRangeFunc); - WRITE_OID_FIELD(endInRangeFunc); - WRITE_OID_FIELD(inRangeColl); - WRITE_BOOL_FIELD(inRangeAsc); - WRITE_BOOL_FIELD(inRangeNullsFirst); - WRITE_UINT_FIELD(winref); - WRITE_BOOL_FIELD(copiedOrder); -} - -static void -_outRowMarkClause(StringInfo str, const RowMarkClause *node) -{ - WRITE_NODE_TYPE("ROWMARKCLAUSE"); - - WRITE_UINT_FIELD(rti); - WRITE_ENUM_FIELD(strength, LockClauseStrength); - WRITE_ENUM_FIELD(waitPolicy, LockWaitPolicy); - WRITE_BOOL_FIELD(pushedDown); -} - -static void -_outWithClause(StringInfo str, const WithClause *node) -{ - WRITE_NODE_TYPE("WITHCLAUSE"); - - WRITE_NODE_FIELD(ctes); - WRITE_BOOL_FIELD(recursive); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCommonTableExpr(StringInfo str, const CommonTableExpr *node) -{ - WRITE_NODE_TYPE("COMMONTABLEEXPR"); - - WRITE_STRING_FIELD(ctename); - WRITE_NODE_FIELD(aliascolnames); - WRITE_ENUM_FIELD(ctematerialized, CTEMaterialize); - WRITE_NODE_FIELD(ctequery); - WRITE_NODE_FIELD(search_clause); - WRITE_NODE_FIELD(cycle_clause); - WRITE_LOCATION_FIELD(location); - WRITE_BOOL_FIELD(cterecursive); - WRITE_INT_FIELD(cterefcount); - WRITE_NODE_FIELD(ctecolnames); - WRITE_NODE_FIELD(ctecoltypes); - WRITE_NODE_FIELD(ctecoltypmods); - WRITE_NODE_FIELD(ctecolcollations); -} - -static void -_outSetOperationStmt(StringInfo str, const SetOperationStmt *node) -{ - WRITE_NODE_TYPE("SETOPERATIONSTMT"); - - WRITE_ENUM_FIELD(op, SetOperation); - WRITE_BOOL_FIELD(all); - WRITE_NODE_FIELD(larg); - WRITE_NODE_FIELD(rarg); - WRITE_NODE_FIELD(colTypes); - WRITE_NODE_FIELD(colTypmods); - WRITE_NODE_FIELD(colCollations); - WRITE_NODE_FIELD(groupClauses); -} - -static void -_outRangeTblEntry(StringInfo str, const RangeTblEntry *node) -{ - WRITE_NODE_TYPE("RTE"); - - /* put alias + eref first to make dump more legible */ - WRITE_NODE_FIELD(alias); - WRITE_NODE_FIELD(eref); - WRITE_ENUM_FIELD(rtekind, RTEKind); - WRITE_BOOL_FIELD(relisivm); - - switch (node->rtekind) - { - case RTE_RELATION: - WRITE_OID_FIELD(relid); - WRITE_CHAR_FIELD(relkind); - WRITE_INT_FIELD(rellockmode); - WRITE_NODE_FIELD(tablesample); - WRITE_UINT_FIELD(perminfoindex); - break; - case RTE_SUBQUERY: - WRITE_NODE_FIELD(subquery); - WRITE_BOOL_FIELD(security_barrier); - WRITE_OID_FIELD(relid); - WRITE_CHAR_FIELD(relkind); - WRITE_INT_FIELD(rellockmode); - WRITE_UINT_FIELD(perminfoindex); - break; - case RTE_JOIN: - WRITE_ENUM_FIELD(jointype, JoinType); - WRITE_INT_FIELD(joinmergedcols); - WRITE_NODE_FIELD(joinaliasvars); - WRITE_NODE_FIELD(joinleftcols); - WRITE_NODE_FIELD(joinrightcols); - WRITE_NODE_FIELD(join_using_alias); - break; - case RTE_FUNCTION: - WRITE_NODE_FIELD(functions); - WRITE_BOOL_FIELD(funcordinality); - break; - case RTE_TABLEFUNCTION: - WRITE_NODE_FIELD(subquery); - WRITE_NODE_FIELD(functions); - WRITE_BOOL_FIELD(funcordinality); - break; - case RTE_TABLEFUNC: - WRITE_NODE_FIELD(tablefunc); - break; - case RTE_VALUES: - WRITE_NODE_FIELD(values_lists); - WRITE_NODE_FIELD(coltypes); - WRITE_NODE_FIELD(coltypmods); - WRITE_NODE_FIELD(colcollations); - break; - case RTE_CTE: - WRITE_STRING_FIELD(ctename); - WRITE_UINT_FIELD(ctelevelsup); - WRITE_BOOL_FIELD(self_reference); - WRITE_NODE_FIELD(coltypes); - WRITE_NODE_FIELD(coltypmods); - WRITE_NODE_FIELD(colcollations); - break; - case RTE_NAMEDTUPLESTORE: - WRITE_STRING_FIELD(enrname); - WRITE_FLOAT_FIELD(enrtuples); - WRITE_OID_FIELD(relid); - WRITE_NODE_FIELD(coltypes); - WRITE_NODE_FIELD(coltypmods); - WRITE_NODE_FIELD(colcollations); - break; - case RTE_RESULT: - /* no extra fields */ - break; - case RTE_VOID: /*CDB*/ - break; - default: - elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind); - break; - } - - WRITE_BOOL_FIELD(lateral); - WRITE_BOOL_FIELD(inh); - WRITE_BOOL_FIELD(inFromCl); - WRITE_NODE_FIELD(securityQuals); - - WRITE_BOOL_FIELD(forceDistRandom); -} - -static void -_outRangeTblFunction(StringInfo str, const RangeTblFunction *node) -{ - WRITE_NODE_TYPE("RANGETBLFUNCTION"); - - WRITE_NODE_FIELD(funcexpr); - WRITE_INT_FIELD(funccolcount); - WRITE_NODE_FIELD(funccolnames); - WRITE_NODE_FIELD(funccoltypes); - WRITE_NODE_FIELD(funccoltypmods); - WRITE_NODE_FIELD(funccolcollations); - /* funcuserdata is only serialized in binary out/read functions */ -#ifdef COMPILING_BINARY_FUNCS - WRITE_BYTEA_FIELD(funcuserdata); -#endif - WRITE_BITMAPSET_FIELD(funcparams); -} - -static void -_outTableSampleClause(StringInfo str, const TableSampleClause *node) -{ - WRITE_NODE_TYPE("TABLESAMPLECLAUSE"); - - WRITE_OID_FIELD(tsmhandler); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(repeatable); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outAExpr(StringInfo str, const A_Expr *node) -{ - WRITE_NODE_TYPE("AEXPR"); - - switch (node->kind) - { - case AEXPR_OP: - appendStringInfoChar(str, ' '); - WRITE_NODE_FIELD(name); - break; - case AEXPR_OP_ANY: - appendStringInfoChar(str, ' '); - WRITE_NODE_FIELD(name); - appendStringInfoString(str, " ANY "); - break; - case AEXPR_OP_ALL: - appendStringInfoChar(str, ' '); - WRITE_NODE_FIELD(name); - appendStringInfoString(str, " ALL "); - break; - case AEXPR_DISTINCT: - appendStringInfoString(str, " DISTINCT "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_NOT_DISTINCT: - appendStringInfoString(str, " NOT_DISTINCT "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_NULLIF: - appendStringInfoString(str, " NULLIF "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_IN: - appendStringInfoString(str, " IN "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_LIKE: - appendStringInfoString(str, " LIKE "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_ILIKE: - appendStringInfoString(str, " ILIKE "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_SIMILAR: - appendStringInfoString(str, " SIMILAR "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_BETWEEN: - appendStringInfoString(str, " BETWEEN "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_NOT_BETWEEN: - appendStringInfoString(str, " NOT_BETWEEN "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_BETWEEN_SYM: - appendStringInfoString(str, " BETWEEN_SYM "); - WRITE_NODE_FIELD(name); - break; - case AEXPR_NOT_BETWEEN_SYM: - appendStringInfoString(str, " NOT_BETWEEN_SYM "); - WRITE_NODE_FIELD(name); - break; - default: - appendStringInfoString(str, " ??"); - break; - } - - WRITE_NODE_FIELD(lexpr); - WRITE_NODE_FIELD(rexpr); - WRITE_LOCATION_FIELD(location); -} - -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outColumnRef(StringInfo str, const ColumnRef *node) -{ - WRITE_NODE_TYPE("COLUMNREF"); - - WRITE_NODE_FIELD(fields); - WRITE_LOCATION_FIELD(location); -} - -static void -_outParamRef(StringInfo str, const ParamRef *node) -{ - WRITE_NODE_TYPE("PARAMREF"); - - WRITE_INT_FIELD(number); - WRITE_LOCATION_FIELD(location); -} - -/* - * Node types found in raw parse trees (supported for debug purposes) - */ - -static void -_outRawStmt(StringInfo str, const RawStmt *node) -{ - WRITE_NODE_TYPE("RAWSTMT"); - - WRITE_NODE_FIELD(stmt); - WRITE_LOCATION_FIELD(stmt_location); - WRITE_INT_FIELD(stmt_len); -} - -#ifndef COMPILING_BINARY_FUNCS - - -static void -_outInteger(StringInfo str, const Integer *node) -{ - appendStringInfo(str, "%d", node->ival); -} - -static void -_outFloat(StringInfo str, const Float *node) -{ - /* - * We assume the value is a valid numeric literal and so does not need - * quoting. - */ - appendStringInfoString(str, node->fval); -} - -static void -_outBoolean(StringInfo str, const Boolean *node) -{ - appendStringInfoString(str, node->boolval ? "true" : "false"); -} - -static void -_outString(StringInfo str, const String *node) -{ - /* - * We use outToken to provide escaping of the string's content, but we - * don't want it to convert an empty string to '""', because we're putting - * double quotes around the string already. - */ - appendStringInfoChar(str, '"'); - if (node->sval[0] != '\0') - outToken(str, node->sval); - appendStringInfoChar(str, '"'); -} - -static void -_outBitString(StringInfo str, const BitString *node) -{ - /* - * The lexer will always produce a string starting with 'b' or 'x'. There - * might be characters following that that need escaping, but outToken - * won't escape the 'b' or 'x'. This is relied on by nodeTokenType. - */ - Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x'); - outToken(str, node->bsval); -} - -static void -_outAConst(StringInfo str, const A_Const *node) -{ - WRITE_NODE_TYPE("A_CONST"); - - if (node->isnull) - appendStringInfoString(str, " NULL"); - else - { - appendStringInfoString(str, " :val "); - outNode(str, &node->val); - } - WRITE_LOCATION_FIELD(location); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outA_Star(StringInfo str, const A_Star *node) -{ - WRITE_NODE_TYPE("A_STAR"); -} - -static void -_outA_Indices(StringInfo str, const A_Indices *node) -{ - WRITE_NODE_TYPE("A_INDICES"); - - WRITE_BOOL_FIELD(is_slice); - WRITE_NODE_FIELD(lidx); - WRITE_NODE_FIELD(uidx); -} - -static void -_outA_Indirection(StringInfo str, const A_Indirection *node) -{ - WRITE_NODE_TYPE("A_INDIRECTION"); - - WRITE_NODE_FIELD(arg); - WRITE_NODE_FIELD(indirection); -} - -static void -_outA_ArrayExpr(StringInfo str, const A_ArrayExpr *node) -{ - WRITE_NODE_TYPE("A_ARRAYEXPR"); - - WRITE_NODE_FIELD(elements); - WRITE_LOCATION_FIELD(location); -} - -static void -_outResTarget(StringInfo str, const ResTarget *node) -{ - WRITE_NODE_TYPE("RESTARGET"); - - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(indirection); - WRITE_NODE_FIELD(val); - WRITE_LOCATION_FIELD(location); -} - -static void -_outMultiAssignRef(StringInfo str, const MultiAssignRef *node) -{ - WRITE_NODE_TYPE("MULTIASSIGNREF"); - - WRITE_NODE_FIELD(source); - WRITE_INT_FIELD(colno); - WRITE_INT_FIELD(ncolumns); -} - -static void -_outSortBy(StringInfo str, const SortBy *node) -{ - WRITE_NODE_TYPE("SORTBY"); - - WRITE_NODE_FIELD(node); - WRITE_ENUM_FIELD(sortby_dir, SortByDir); - WRITE_ENUM_FIELD(sortby_nulls, SortByNulls); - WRITE_NODE_FIELD(useOp); - WRITE_LOCATION_FIELD(location); -} - -static void -_outWindowDef(StringInfo str, const WindowDef *node) -{ - WRITE_NODE_TYPE("WINDOWDEF"); - - WRITE_STRING_FIELD(name); - WRITE_STRING_FIELD(refname); - WRITE_NODE_FIELD(partitionClause); - WRITE_NODE_FIELD(orderClause); - WRITE_INT_FIELD(frameOptions); - WRITE_NODE_FIELD(startOffset); - WRITE_NODE_FIELD(endOffset); - WRITE_LOCATION_FIELD(location); -} - -#ifndef COMPILING_BINARY_FUNCS - -static void -_outRangeSubselect(StringInfo str, const RangeSubselect *node) -{ - WRITE_NODE_TYPE("RANGESUBSELECT"); - - WRITE_BOOL_FIELD(lateral); - WRITE_NODE_FIELD(subquery); - WRITE_NODE_FIELD(alias); -} - -static void -_outRangeFunction(StringInfo str, const RangeFunction *node) -{ - WRITE_NODE_TYPE("RANGEFUNCTION"); - - WRITE_BOOL_FIELD(lateral); - WRITE_BOOL_FIELD(ordinality); - WRITE_BOOL_FIELD(is_rowsfrom); - WRITE_NODE_FIELD(functions); - WRITE_NODE_FIELD(alias); - WRITE_NODE_FIELD(coldeflist); -} - -static void -_outRangeTableSample(StringInfo str, const RangeTableSample *node) -{ - WRITE_NODE_TYPE("RANGETABLESAMPLE"); - - WRITE_NODE_FIELD(relation); - WRITE_NODE_FIELD(method); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(repeatable); - WRITE_LOCATION_FIELD(location); -} - -static void -_outRangeTableFunc(StringInfo str, const RangeTableFunc *node) -{ - WRITE_NODE_TYPE("RANGETABLEFUNC"); - - WRITE_BOOL_FIELD(lateral); - WRITE_NODE_FIELD(docexpr); - WRITE_NODE_FIELD(rowexpr); - WRITE_NODE_FIELD(namespaces); - WRITE_NODE_FIELD(columns); - WRITE_NODE_FIELD(alias); - WRITE_LOCATION_FIELD(location); -} - -static void -_outRangeTableFuncCol(StringInfo str, const RangeTableFuncCol *node) -{ - WRITE_NODE_TYPE("RANGETABLEFUNCCOL"); - - WRITE_STRING_FIELD(colname); - WRITE_NODE_FIELD(typeName); - WRITE_BOOL_FIELD(for_ordinality); - WRITE_BOOL_FIELD(is_not_null); - WRITE_NODE_FIELD(colexpr); - WRITE_NODE_FIELD(coldefexpr); - WRITE_LOCATION_FIELD(location); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outConstraint(StringInfo str, const Constraint *node) -{ - WRITE_NODE_TYPE("CONSTRAINT"); - - WRITE_ENUM_FIELD(contype, ConstrType); - /* name, or NULL if unnamed */ - WRITE_STRING_FIELD(conname); - WRITE_BOOL_FIELD(deferrable); - WRITE_BOOL_FIELD(initdeferred); - WRITE_LOCATION_FIELD(location); - - WRITE_BOOL_FIELD(is_no_inherit); - WRITE_NODE_FIELD(raw_expr); - WRITE_STRING_FIELD(cooked_expr); - WRITE_CHAR_FIELD(generated_when); - WRITE_BOOL_FIELD(nulls_not_distinct); - - WRITE_NODE_FIELD(keys); - WRITE_NODE_FIELD(including); - - WRITE_NODE_FIELD(exclusions); - - WRITE_NODE_FIELD(options); - WRITE_STRING_FIELD(indexname); - WRITE_STRING_FIELD(indexspace); - WRITE_BOOL_FIELD(reset_default_tblspc); - - WRITE_STRING_FIELD(access_method); - WRITE_NODE_FIELD(where_clause); - - WRITE_NODE_FIELD(pktable); - WRITE_NODE_FIELD(fk_attrs); - WRITE_NODE_FIELD(pk_attrs); - WRITE_CHAR_FIELD(fk_matchtype); - WRITE_CHAR_FIELD(fk_upd_action); - WRITE_CHAR_FIELD(fk_del_action); - WRITE_NODE_FIELD(old_conpfeqop); - WRITE_OID_FIELD(old_pktable_oid); - - WRITE_BOOL_FIELD(skip_validation); - WRITE_BOOL_FIELD(initially_valid); -} - -#ifndef COMPILING_BINARY_FUNCS -static void -_outForeignKeyCacheInfo(StringInfo str, const ForeignKeyCacheInfo *node) -{ - WRITE_NODE_TYPE("FOREIGNKEYCACHEINFO"); - - WRITE_OID_FIELD(conoid); - WRITE_OID_FIELD(conrelid); - WRITE_OID_FIELD(confrelid); - WRITE_INT_FIELD(nkeys); - WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys); - WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys); - WRITE_OID_ARRAY(conpfeqop, node->nkeys); -} -#endif /* COMPILING_BINARY_FUNCS */ - -static void -_outPartitionElem(StringInfo str, const PartitionElem *node) -{ - WRITE_NODE_TYPE("PARTITIONELEM"); - - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(expr); - WRITE_NODE_FIELD(collation); - WRITE_NODE_FIELD(opclass); - WRITE_LOCATION_FIELD(location); -} - -static void -_outPartitionSpec(StringInfo str, const PartitionSpec *node) -{ - WRITE_NODE_TYPE("PARTITIONSPEC"); - - WRITE_ENUM_FIELD(strategy, PartitionStrategy); - WRITE_NODE_FIELD(partParams); - WRITE_LOCATION_FIELD(location); -} - -static void -_outPartitionBoundSpec(StringInfo str, const PartitionBoundSpec *node) -{ - WRITE_NODE_TYPE("PARTITIONBOUNDSPEC"); - - WRITE_CHAR_FIELD(strategy); - WRITE_BOOL_FIELD(is_default); - WRITE_INT_FIELD(modulus); - WRITE_INT_FIELD(remainder); - WRITE_NODE_FIELD(listdatums); - WRITE_NODE_FIELD(lowerdatums); - WRITE_NODE_FIELD(upperdatums); - WRITE_LOCATION_FIELD(location); -} - -static void -_outPartitionRangeDatum(StringInfo str, const PartitionRangeDatum *node) -{ - WRITE_NODE_TYPE("PARTITIONRANGEDATUM"); - - WRITE_ENUM_FIELD(kind, PartitionRangeDatumKind); - WRITE_NODE_FIELD(value); - WRITE_LOCATION_FIELD(location); -} - -static void -_outCreateDirectoryTableStmt(StringInfo str, const CreateDirectoryTableStmt *node) -{ - WRITE_NODE_TYPE("CREATEDIRECTORYTABLESTMT"); - - _outCreateStmtInfo(str, (const CreateStmt *) node); - WRITE_STRING_FIELD(tablespacename); - WRITE_STRING_FIELD(location); -} - -static void -_outAlterDirectoryTableStmt(StringInfo str, const AlterDirectoryTableStmt *node) -{ - WRITE_NODE_TYPE("ALTERDIRECTORYTABLESTMT"); - - WRITE_NODE_FIELD(relation); - WRITE_NODE_FIELD(tags); - WRITE_BOOL_FIELD(unsettag); -} - -static void -_outCreateTaskStmt(StringInfo str, const CreateTaskStmt *node) -{ - WRITE_NODE_TYPE("CREATETASKSTMT"); - - WRITE_STRING_FIELD(taskname); - WRITE_STRING_FIELD(schedule); - WRITE_STRING_FIELD(sql); - WRITE_NODE_FIELD(options); - WRITE_BOOL_FIELD(if_not_exists); -} - -static void -_outAlterTaskStmt(StringInfo str, const AlterTaskStmt *node) -{ - WRITE_NODE_TYPE("ALTERTASKSTMT"); - - WRITE_STRING_FIELD(taskname); - WRITE_NODE_FIELD(options); - WRITE_BOOL_FIELD(missing_ok); -} - -static void -_outDropTaskStmt(StringInfo str, const DropTaskStmt *node) -{ - WRITE_NODE_TYPE("DROPTASKSTMT"); - - WRITE_STRING_FIELD(taskname); - WRITE_BOOL_FIELD(missing_ok); -} - -static void -_outRTEPermissionInfo(StringInfo str, const RTEPermissionInfo *node) -{ - WRITE_NODE_TYPE("RTEPERMISSIONINFO"); - - WRITE_OID_FIELD(relid); - WRITE_BOOL_FIELD(inh); - WRITE_UINT64_FIELD(requiredPerms); - WRITE_OID_FIELD(checkAsUser); - WRITE_BITMAPSET_FIELD(selectedCols); - WRITE_BITMAPSET_FIELD(insertedCols); - WRITE_BITMAPSET_FIELD(updatedCols); -} - -static void -_outGpPolicy(StringInfo str, const GpPolicy *node) -{ - WRITE_NODE_TYPE("GPPOLICY"); - - WRITE_ENUM_FIELD(ptype, GpPolicyType); - WRITE_INT_FIELD(numsegments); - WRITE_INT_FIELD(nattrs); - WRITE_ATTRNUMBER_ARRAY(attrs, node->nattrs); - WRITE_OID_ARRAY(opclasses, node->nattrs); -} - -static void -_outMergeAction(StringInfo str, const MergeAction *node) -{ - WRITE_NODE_TYPE("MERGEACTION"); - - WRITE_BOOL_FIELD(matched); - WRITE_ENUM_FIELD(commandType, CmdType); - WRITE_ENUM_FIELD(override, OverridingKind); - WRITE_NODE_FIELD(qual); - WRITE_NODE_FIELD(targetList); - WRITE_NODE_FIELD(updateColnos); -} - -static void -_outPublicationObjSpec(StringInfo str, const PublicationObjSpec *node) -{ - WRITE_NODE_TYPE("PUBLICATIONOBJSPEC"); - - WRITE_ENUM_FIELD(pubobjtype, PublicationObjSpecType); - WRITE_STRING_FIELD(name); - WRITE_NODE_FIELD(pubtable); - WRITE_LOCATION_FIELD(location); -} - -static void -_outPublicationTable(StringInfo str, const PublicationTable *node) -{ - WRITE_NODE_TYPE("PUBLICATIONTABLE"); - - WRITE_NODE_FIELD(relation); - WRITE_NODE_FIELD(whereClause); - WRITE_NODE_FIELD(columns); -} - -static void -_outJsonIsPredicate(StringInfo str, const JsonIsPredicate *node) -{ - WRITE_NODE_TYPE("JSONISPREDICATE"); - - WRITE_NODE_FIELD(expr); - WRITE_NODE_FIELD(format); - WRITE_ENUM_FIELD(item_type, JsonValueType); - WRITE_BOOL_FIELD(unique_keys); - WRITE_LOCATION_FIELD(location); -} - -static void -_outJsonConstructorExpr(StringInfo str, const JsonConstructorExpr *node) -{ - WRITE_NODE_TYPE("JSONCONSTRUCTOREXPR"); - - WRITE_ENUM_FIELD(type, JsonConstructorType); - WRITE_NODE_FIELD(args); - WRITE_NODE_FIELD(func); - WRITE_NODE_FIELD(coercion); - WRITE_NODE_FIELD(returning); - WRITE_BOOL_FIELD(absent_on_null); - WRITE_BOOL_FIELD(unique); - WRITE_LOCATION_FIELD(location); -} - -static void -_outJsonReturning(StringInfo str, const JsonReturning *node) -{ - WRITE_NODE_TYPE("JSONRETURNING"); - - WRITE_NODE_FIELD(format); - WRITE_OID_FIELD(typid); - WRITE_INT_FIELD(typmod); -} - -static void -_outJsonValueExpr(StringInfo str, const JsonValueExpr *node) -{ - WRITE_NODE_TYPE("JSONVALUEEXPR"); - - WRITE_NODE_FIELD(raw_expr); - WRITE_NODE_FIELD(formatted_expr); - WRITE_NODE_FIELD(format); -} - -static void -_outJsonFormat(StringInfo str, const JsonFormat *node) -{ - WRITE_NODE_TYPE("JSONFORMAT"); - - WRITE_ENUM_FIELD(format_type, JsonFormatType); - WRITE_ENUM_FIELD(encoding, JsonEncoding); - WRITE_LOCATION_FIELD(location); -} - -#include "outfuncs_common.c" -#ifndef COMPILING_BINARY_FUNCS -/* - * outNode - - * converts a Node into ascii string and append it to 'str' - */ -void -outNode(StringInfo str, const void *obj) -{ - /* Guard against stack overflow due to overly complex expressions */ - check_stack_depth(); - - if (obj == NULL) - appendStringInfoString(str, "<>"); - else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) || - IsA(obj, XidList)) - _outList(str, obj); - /* nodeRead does not want to see { } around these! */ - else if (IsA(obj, Integer)) - _outInteger(str, (Integer *) obj); - else if (IsA(obj, Float)) - _outFloat(str, (Float *) obj); - else if (IsA(obj, Boolean)) - _outBoolean(str, (Boolean *) obj); - else if (IsA(obj, String)) - _outString(str, (String *) obj); - else if (IsA(obj, BitString)) - _outBitString(str, (BitString *) obj); - else if (IsA(obj, Bitmapset)) - outBitmapset(str, (Bitmapset *) obj); - else - { - appendStringInfoChar(str, '{'); - switch (nodeTag(obj)) - { - case T_PlannedStmt: - _outPlannedStmt(str, obj); - break; - case T_QueryDispatchDesc: - _outQueryDispatchDesc(str, obj); - break; - case T_SerializedParams: - _outSerializedParams(str, obj); - break; - case T_OidAssignment: - _outOidAssignment(str, obj); - break; - case T_Plan: - _outPlan(str, obj); - break; - case T_Result: - _outResult(str, obj); - break; - case T_ProjectSet: - _outProjectSet(str, obj); - break; - case T_ModifyTable: - _outModifyTable(str, obj); - break; - case T_Append: - _outAppend(str, obj); - break; - case T_MergeAppend: - _outMergeAppend(str, obj); - break; - case T_Sequence: - _outSequence(str, obj); - break; - case T_RecursiveUnion: - _outRecursiveUnion(str, obj); - break; - case T_BitmapAnd: - _outBitmapAnd(str, obj); - break; - case T_BitmapOr: - _outBitmapOr(str, obj); - break; - case T_Gather: - _outGather(str, obj); - break; - case T_GatherMerge: - _outGatherMerge(str, obj); - break; - case T_Scan: - _outScan(str, obj); - break; - case T_SeqScan: - _outSeqScan(str, obj); - break; - case T_DynamicSeqScan: - _outDynamicSeqScan(str, obj); - break; - case T_ExternalScanInfo: - _outExternalScanInfo(str, obj); - break; - case T_SampleScan: - _outSampleScan(str, obj); - break; - case T_IndexScan: - _outIndexScan(str, obj); - break; - case T_DynamicIndexScan: - _outDynamicIndexScan(str,obj); - break; - case T_DynamicIndexOnlyScan: - _outDynamicIndexOnlyScan(str,obj); - break; - case T_IndexOnlyScan: - _outIndexOnlyScan(str, obj); - break; - case T_BitmapIndexScan: - _outBitmapIndexScan(str, obj); - break; - case T_DynamicBitmapIndexScan: - _outDynamicBitmapIndexScan(str, obj); - break; - case T_BitmapHeapScan: - _outBitmapHeapScan(str, obj); - break; - case T_DynamicBitmapHeapScan: - _outDynamicBitmapHeapScan(str, obj); - break; - case T_TidScan: - _outTidScan(str, obj); - break; - case T_TidRangeScan: - _outTidRangeScan(str, obj); - break; - case T_SubqueryScan: - _outSubqueryScan(str, obj); - break; - case T_FunctionScan: - _outFunctionScan(str, obj); - break; - case T_TableFuncScan: - _outTableFuncScan(str, obj); - break; - case T_ValuesScan: - _outValuesScan(str, obj); - break; - case T_CteScan: - _outCteScan(str, obj); - break; - case T_NamedTuplestoreScan: - _outNamedTuplestoreScan(str, obj); - break; - case T_WorkTableScan: - _outWorkTableScan(str, obj); - break; - case T_ForeignScan: - _outForeignScan(str, obj); - break; - case T_DynamicForeignScan: - _outDynamicForeignScan(str, obj); - break; - case T_CustomScan: - _outCustomScan(str, obj); - break; - case T_Join: - _outJoin(str, obj); - break; - case T_NestLoop: - _outNestLoop(str, obj); - break; - case T_MergeJoin: - _outMergeJoin(str, obj); - break; - case T_HashJoin: - _outHashJoin(str, obj); - break; - case T_Agg: - _outAgg(str, obj); - break; - case T_TupleSplit: - _outTupleSplit(str, obj); - break; - case T_DQAExpr: - _outDQAExpr(str, obj); - break; - case T_WindowAgg: - _outWindowAgg(str, obj); - break; - case T_WindowHashAgg: - _outWindowHashAgg(str, obj); - break; - case T_Group: - _outGroup(str, obj); - break; - case T_TableFunctionScan: - _outTableFunctionScan(str, obj); - break; - case T_Material: - _outMaterial(str, obj); - break; - case T_ShareInputScan: - _outShareInputScan(str, obj); - break; - case T_Memoize: - _outMemoize(str, obj); - break; - case T_Sort: - _outSort(str, obj); - break; - case T_IncrementalSort: - _outIncrementalSort(str, obj); - break; - case T_Unique: - _outUnique(str, obj); - break; - case T_Hash: - _outHash(str, obj); - break; - case T_SetOp: - _outSetOp(str, obj); - break; - case T_LockRows: - _outLockRows(str, obj); - break; - case T_RuntimeFilter: - _outRuntimeFilter(str, obj); - break; - case T_Limit: - _outLimit(str, obj); - break; - case T_NestLoopParam: - _outNestLoopParam(str, obj); - break; - case T_PlanRowMark: - _outPlanRowMark(str, obj); - break; - case T_PartitionPruneInfo: - _outPartitionPruneInfo(str, obj); - break; - case T_PartitionedRelPruneInfo: - _outPartitionedRelPruneInfo(str, obj); - break; - case T_PartitionPruneStepOp: - _outPartitionPruneStepOp(str, obj); - break; - case T_PartitionPruneStepCombine: - _outPartitionPruneStepCombine(str, obj); - break; - case T_PlanInvalItem: - _outPlanInvalItem(str, obj); - break; - case T_Motion: - _outMotion(str, obj); - break; - case T_SplitUpdate: - _outSplitUpdate(str, obj); - break; - case T_SplitMerge: - _outSplitMerge(str, obj); - break; - case T_AssertOp: - _outAssertOp(str, obj); - break; - case T_PartitionSelector: - _outPartitionSelector(str, obj); - break; - case T_Alias: - _outAlias(str, obj); - break; - case T_RangeVar: - _outRangeVar(str, obj); - break; - case T_TableFunc: - _outTableFunc(str, obj); - break; - case T_IntoClause: - _outIntoClause(str, obj); - break; - case T_CopyIntoClause: - _outCopyIntoClause(str, obj); - break; - case T_RefreshClause: - _outRefreshClause(str, obj); - break; - case T_Var: - _outVar(str, obj); - break; - case T_Const: - _outConst(str, obj); - break; - case T_Param: - _outParam(str, obj); - break; - case T_Aggref: - _outAggref(str, obj); - break; - case T_GroupingFunc: - _outGroupingFunc(str, obj); - break; - case T_GroupId: - _outGroupId(str, obj); - break; - case T_GroupingSetId: - _outGroupingSetId(str, obj); - break; - case T_WindowFunc: - _outWindowFunc(str, obj); - break; - case T_SubscriptingRef: - _outSubscriptingRef(str, obj); - break; - case T_FuncExpr: - _outFuncExpr(str, obj); - break; - case T_NamedArgExpr: - _outNamedArgExpr(str, obj); - break; - case T_OpExpr: - _outOpExpr(str, obj); - break; - case T_DistinctExpr: - _outDistinctExpr(str, obj); - break; - case T_NullIfExpr: - _outNullIfExpr(str, obj); - break; - case T_ScalarArrayOpExpr: - _outScalarArrayOpExpr(str, obj); - break; - case T_BoolExpr: - _outBoolExpr(str, obj); - break; - case T_SubLink: - _outSubLink(str, obj); - break; - case T_SubPlan: - _outSubPlan(str, obj); - break; - case T_AlternativeSubPlan: - _outAlternativeSubPlan(str, obj); - break; - case T_FieldSelect: - _outFieldSelect(str, obj); - break; - case T_FieldStore: - _outFieldStore(str, obj); - break; - case T_RelabelType: - _outRelabelType(str, obj); - break; - case T_CoerceViaIO: - _outCoerceViaIO(str, obj); - break; - case T_ArrayCoerceExpr: - _outArrayCoerceExpr(str, obj); - break; - case T_ConvertRowtypeExpr: - _outConvertRowtypeExpr(str, obj); - break; - case T_CollateExpr: - _outCollateExpr(str, obj); - break; - case T_CaseExpr: - _outCaseExpr(str, obj); - break; - case T_CaseWhen: - _outCaseWhen(str, obj); - break; - case T_CaseTestExpr: - _outCaseTestExpr(str, obj); - break; - case T_ArrayExpr: - _outArrayExpr(str, obj); - break; - case T_RowExpr: - _outRowExpr(str, obj); - break; - case T_RowCompareExpr: - _outRowCompareExpr(str, obj); - break; - case T_CoalesceExpr: - _outCoalesceExpr(str, obj); - break; - case T_MinMaxExpr: - _outMinMaxExpr(str, obj); - break; - case T_SQLValueFunction: - _outSQLValueFunction(str, obj); - break; - case T_XmlExpr: - _outXmlExpr(str, obj); - break; - case T_NullTest: - _outNullTest(str, obj); - break; - case T_BooleanTest: - _outBooleanTest(str, obj); - break; - case T_CoerceToDomain: - _outCoerceToDomain(str, obj); - break; - case T_CoerceToDomainValue: - _outCoerceToDomainValue(str, obj); - break; - case T_SetToDefault: - _outSetToDefault(str, obj); - break; - case T_CurrentOfExpr: - _outCurrentOfExpr(str, obj); - break; - case T_NextValueExpr: - _outNextValueExpr(str, obj); - break; - case T_InferenceElem: - _outInferenceElem(str, obj); - break; - case T_TargetEntry: - _outTargetEntry(str, obj); - break; - case T_RangeTblRef: - _outRangeTblRef(str, obj); - break; - case T_JoinExpr: - _outJoinExpr(str, obj); - break; - case T_FromExpr: - _outFromExpr(str, obj); - break; - case T_Flow: - _outFlow(str, obj); - break; - case T_OnConflictExpr: - _outOnConflictExpr(str, obj); - break; - case T_Path: - _outPath(str, obj); - break; - case T_IndexPath: - _outIndexPath(str, obj); - break; - case T_BitmapHeapPath: - _outBitmapHeapPath(str, obj); - break; - case T_BitmapAndPath: - _outBitmapAndPath(str, obj); - break; - case T_BitmapOrPath: - _outBitmapOrPath(str, obj); - break; - case T_TidPath: - _outTidPath(str, obj); - break; - case T_TidRangePath: - _outTidRangePath(str, obj); - break; - case T_SubqueryScanPath: - _outSubqueryScanPath(str, obj); - break; - case T_TableFunctionScanPath: - _outTableFunctionScanPath(str, obj); - break; - case T_ForeignPath: - _outForeignPath(str, obj); - break; - case T_CustomPath: - _outCustomPath(str, obj); - break; - case T_AppendPath: - _outAppendPath(str, obj); - break; - case T_MergeAppendPath: - _outMergeAppendPath(str, obj); - break; - case T_AppendOnlyPath: - _outAppendOnlyPath(str, obj); - break; - case T_AOCSPath: - _outAOCSPath(str, obj); - break; - case T_GroupResultPath: - _outGroupResultPath(str, obj); - break; - case T_MaterialPath: - _outMaterialPath(str, obj); - break; - case T_MemoizePath: - _outMemoizePath(str, obj); - break; - case T_UniquePath: - _outUniquePath(str, obj); - break; - case T_GatherPath: - _outGatherPath(str, obj); - break; - case T_ProjectionPath: - _outProjectionPath(str, obj); - break; - case T_ProjectSetPath: - _outProjectSetPath(str, obj); - break; - case T_SortPath: - _outSortPath(str, obj); - break; - case T_IncrementalSortPath: - _outIncrementalSortPath(str, obj); - break; - case T_GroupPath: - _outGroupPath(str, obj); - break; - case T_UpperUniquePath: - _outUpperUniquePath(str, obj); - break; - case T_AggPath: - _outAggPath(str, obj); - break; - case T_GroupingSetsPath: - _outGroupingSetsPath(str, obj); - break; - case T_MinMaxAggPath: - _outMinMaxAggPath(str, obj); - break; - case T_WindowAggPath: - _outWindowAggPath(str, obj); - break; - case T_SetOpPath: - _outSetOpPath(str, obj); - break; - case T_RecursiveUnionPath: - _outRecursiveUnionPath(str, obj); - break; - case T_LockRowsPath: - _outLockRowsPath(str, obj); - break; - case T_ModifyTablePath: - _outModifyTablePath(str, obj); - break; - case T_RuntimeFilterPath: - _outRuntimeFilterPath(str, obj); - break; - case T_LimitPath: - _outLimitPath(str, obj); - break; - case T_GatherMergePath: - _outGatherMergePath(str, obj); - break; - case T_NestPath: - _outNestPath(str, obj); - break; - case T_MergePath: - _outMergePath(str, obj); - break; - case T_HashPath: - _outHashPath(str, obj); - break; - case T_CdbMotionPath: - _outCdbMotionPath(str, obj); - break; - case T_PlannerGlobal: - _outPlannerGlobal(str, obj); - break; - case T_PlannerInfo: - _outPlannerInfo(str, obj); - break; - case T_RelOptInfo: - _outRelOptInfo(str, obj); - break; - case T_IndexOptInfo: - _outIndexOptInfo(str, obj); - break; - case T_ForeignKeyOptInfo: - _outForeignKeyOptInfo(str, obj); - break; - case T_EquivalenceClass: - _outEquivalenceClass(str, obj); - break; - case T_EquivalenceMember: - _outEquivalenceMember(str, obj); - break; - case T_PathKey: - _outPathKey(str, obj); - break; - case T_DistributionKey: - _outDistributionKey(str, obj); - break; - case T_PathTarget: - _outPathTarget(str, obj); - break; - case T_ParamPathInfo: - _outParamPathInfo(str, obj); - break; - case T_RelAggInfo: - _outRelAggInfo(str, obj); - break; - case T_RestrictInfo: - _outRestrictInfo(str, obj); - break; - case T_IndexClause: - _outIndexClause(str, obj); - break; - case T_PlaceHolderVar: - _outPlaceHolderVar(str, obj); - break; - case T_SpecialJoinInfo: - _outSpecialJoinInfo(str, obj); - break; - case T_AppendRelInfo: - _outAppendRelInfo(str, obj); - break; - case T_RowIdentityVarInfo: - _outRowIdentityVarInfo(str, obj); - break; - case T_PlaceHolderInfo: - _outPlaceHolderInfo(str, obj); - break; - case T_GroupedVarInfo: - _outGroupedVarInfo(str, obj); - break; - case T_MinMaxAggInfo: - _outMinMaxAggInfo(str, obj); - break; - case T_PlannerParamItem: - _outPlannerParamItem(str, obj); - break; - case T_RollupData: - _outRollupData(str, obj); - break; - case T_GroupingSetData: - _outGroupingSetData(str, obj); - break; - case T_StatisticExtInfo: - _outStatisticExtInfo(str, obj); - break; - - case T_GrantStmt: - _outGrantStmt(str, obj); - break; - case T_ObjectWithArgs: - _outObjectWithArgs(str, obj); - break; - case T_GrantRoleStmt: - _outGrantRoleStmt(str, obj); - break; - case T_LockStmt: - _outLockStmt(str, obj); - break; - case T_ExtensibleNode: - _outExtensibleNode(str, obj); - break; - case T_CreateStmt: - _outCreateStmt(str, obj); - break; - case T_CreateForeignTableStmt: - _outCreateForeignTableStmt(str, obj); - break; - case T_DistributionKeyElem: - _outDistributionKeyElem(str, obj); - break; - case T_ColumnReferenceStorageDirective: - _outColumnReferenceStorageDirective(str, obj); - break; - case T_SegfileMapNode: - _outSegfileMapNode(str, obj); - break; - case T_ExtTableTypeDesc: - _outExtTableTypeDesc(str, obj); - break; - case T_CreateExternalStmt: - _outCreateExternalStmt(str, obj); - break; - case T_DistributedBy: - _outDistributedBy(str, obj); - break; - case T_ImportForeignSchemaStmt: - _outImportForeignSchemaStmt(str, obj); - break; - case T_IndexStmt: - _outIndexStmt(str, obj); - break; - case T_ReindexStmt: - _outReindexStmt(str, obj); - break; - case T_ReindexIndexInfo: - _outReindexIndexInfo(str, obj); - break; - - case T_ConstraintsSetStmt: - _outConstraintsSetStmt(str, obj); - break; - - case T_CreateFunctionStmt: - _outCreateFunctionStmt(str, obj); - break; - case T_FunctionParameter: - _outFunctionParameter(str, obj); - break; - case T_AlterFunctionStmt: - _outAlterFunctionStmt(str, obj); - break; - - case T_DefineStmt: - _outDefineStmt(str,obj); - break; - - case T_CompositeTypeStmt: - _outCompositeTypeStmt(str,obj); - break; - case T_CreateEnumStmt: - _outCreateEnumStmt(str,obj); - break; - case T_CreateRangeStmt: - _outCreateRangeStmt(str,obj); - break; - case T_CreateCastStmt: - _outCreateCastStmt(str,obj); - break; - case T_CreateOpClassStmt: - _outCreateOpClassStmt(str,obj); - break; - case T_CreateOpClassItem: - _outCreateOpClassItem(str,obj); - break; - case T_CreateOpFamilyStmt: - _outCreateOpFamilyStmt(str,obj); - break; - case T_AlterOpFamilyStmt: - _outAlterOpFamilyStmt(str,obj); - break; - case T_CreateConversionStmt: - _outCreateConversionStmt(str,obj); - break; - case T_ViewStmt: - _outViewStmt(str, obj); - break; - case T_RuleStmt: - _outRuleStmt(str, obj); - break; - case T_DropStmt: - _outDropStmt(str, obj); - break; - case T_DropOwnedStmt: - _outDropOwnedStmt(str, obj); - break; - case T_ReassignOwnedStmt: - _outReassignOwnedStmt(str, obj); - break; - case T_TruncateStmt: - _outTruncateStmt(str, obj); - break; - - case T_ReplicaIdentityStmt: - _outReplicaIdentityStmt(str, obj); - break; - case T_AlterTableStmt: - _outAlterTableStmt(str, obj); - break; - case T_AlterTableCmd: - _outAlterTableCmd(str, obj); - break; - case T_AlteredTableInfo: - _outAlteredTableInfo(str, obj); - break; - case T_NewConstraint: - _outNewConstraint(str, obj); - break; - case T_NewColumnValue: - _outNewColumnValue(str, obj); - break; - - case T_CreateRoleStmt: - _outCreateRoleStmt(str, obj); - break; - case T_DropRoleStmt: - _outDropRoleStmt(str, obj); - break; - case T_AlterRoleStmt: - _outAlterRoleStmt(str, obj); - break; - case T_AlterRoleSetStmt: - _outAlterRoleSetStmt(str, obj); - break; - - case T_CreateProfileStmt: - _outCreateProfileStmt(str, obj); - break; - case T_AlterProfileStmt: - _outAlterProfileStmt(str, obj); - break; - case T_DropProfileStmt: - _outDropProfileStmt(str, obj); - break; - - case T_AlterSystemStmt: - _outAlterSystemStmt(str, obj); - break; - - case T_AlterObjectSchemaStmt: - _outAlterObjectSchemaStmt(str, obj); - break; - - case T_AlterOwnerStmt: - _outAlterOwnerStmt(str, obj); - break; - - case T_RenameStmt: - _outRenameStmt(str, obj); - break; - - case T_CreateSeqStmt: - _outCreateSeqStmt(str, obj); - break; - case T_AlterSeqStmt: - _outAlterSeqStmt(str, obj); - break; - case T_ClusterStmt: - _outClusterStmt(str, obj); - break; - case T_CreatedbStmt: - _outCreatedbStmt(str, obj); - break; - case T_DropdbStmt: - _outDropdbStmt(str, obj); - break; - case T_CreateDomainStmt: - _outCreateDomainStmt(str, obj); - break; - case T_AlterDomainStmt: - _outAlterDomainStmt(str, obj); - break; - case T_TransactionStmt: - _outTransactionStmt(str, obj); - break; - case T_CreateStatsStmt: - _outCreateStatsStmt(str, obj); - break; - case T_AlterStatsStmt: - _outAlterStatsStmt(str, obj); - break; - case T_NotifyStmt: - _outNotifyStmt(str, obj); - break; - case T_DeclareCursorStmt: - _outDeclareCursorStmt(str, obj); - break; - case T_SingleRowErrorDesc: - _outSingleRowErrorDesc(str, obj); - break; - case T_CopyStmt: - _outCopyStmt(str, obj); - break; - case T_SelectStmt: - _outSelectStmt(str, obj); - break; - case T_InsertStmt: - _outInsertStmt(str, obj); - break; - case T_DeleteStmt: - _outDeleteStmt(str, obj); - break; - case T_UpdateStmt: - _outUpdateStmt(str, obj); - break; - case T_Null: - _outNull(str, obj); - break; - case T_ReturnStmt: - _outReturnStmt(str, obj); - break; - case T_PLAssignStmt: - _outPLAssignStmt(str, obj); - break; - case T_ColumnDef: - _outColumnDef(str, obj); - break; - case T_TypeName: - _outTypeName(str, obj); - break; - case T_TypeCast: - _outTypeCast(str, obj); - break; - case T_CollateClause: - _outCollateClause(str, obj); - break; - case T_IndexElem: - _outIndexElem(str, obj); - break; - case T_StatsElem: - _outStatsElem(str, obj); - break; - case T_Query: - _outQuery(str, obj); - break; - case T_WithCheckOption: - _outWithCheckOption(str, obj); - break; - case T_SortGroupClause: - _outSortGroupClause(str, obj); - break; - case T_GroupingSet: - _outGroupingSet(str, obj); - break; - case T_WindowClause: - _outWindowClause(str, obj); - break; - case T_RowMarkClause: - _outRowMarkClause(str, obj); - break; - case T_WithClause: - _outWithClause(str, obj); - break; - case T_CTESearchClause: - _outCTESearchClause(str, obj); - break; - case T_CTECycleClause: - _outCTECycleClause(str, obj); - break; - case T_CommonTableExpr: - _outCommonTableExpr(str, obj); - break; - case T_SetOperationStmt: - _outSetOperationStmt(str, obj); - break; - case T_RangeTblEntry: - _outRangeTblEntry(str, obj); - break; - case T_RangeTblFunction: - _outRangeTblFunction(str, obj); - break; - case T_TableSampleClause: - _outTableSampleClause(str, obj); - break; - case T_A_Expr: - _outAExpr(str, obj); - break; - case T_ColumnRef: - _outColumnRef(str, obj); - break; - case T_ParamRef: - _outParamRef(str, obj); - break; - case T_RawStmt: - _outRawStmt(str, obj); - break; - case T_A_Const: - _outAConst(str, obj); - break; - case T_A_Star: - _outA_Star(str, obj); - break; - case T_A_Indices: - _outA_Indices(str, obj); - break; - case T_A_Indirection: - _outA_Indirection(str, obj); - break; - case T_A_ArrayExpr: - _outA_ArrayExpr(str, obj); - break; - case T_ResTarget: - _outResTarget(str, obj); - break; - case T_MultiAssignRef: - _outMultiAssignRef(str, obj); - break; - case T_SortBy: - _outSortBy(str, obj); - break; - case T_WindowDef: - _outWindowDef(str, obj); - break; - case T_RangeSubselect: - _outRangeSubselect(str, obj); - break; - case T_RangeFunction: - _outRangeFunction(str, obj); - break; - case T_RangeTableSample: - _outRangeTableSample(str, obj); - break; - case T_RangeTableFunc: - _outRangeTableFunc(str, obj); - break; - case T_RangeTableFuncCol: - _outRangeTableFuncCol(str, obj); - break; - case T_Constraint: - _outConstraint(str, obj); - break; - case T_FuncCall: - _outFuncCall(str, obj); - break; - case T_DefElem: - _outDefElem(str, obj); - break; - case T_TableLikeClause: - _outTableLikeClause(str, obj); - break; - case T_LockingClause: - _outLockingClause(str, obj); - break; - case T_XmlSerialize: - _outXmlSerialize(str, obj); - break; - case T_ForeignKeyCacheInfo: - _outForeignKeyCacheInfo(str, obj); - break; - case T_TriggerTransition: - _outTriggerTransition(str, obj); - break; - case T_PartitionElem: - _outPartitionElem(str, obj); - break; - case T_PartitionSpec: - _outPartitionSpec(str, obj); - break; - case T_PartitionBoundSpec: - _outPartitionBoundSpec(str, obj); - break; - case T_PartitionRangeDatum: - _outPartitionRangeDatum(str, obj); - break; - case T_PartitionCmd: - _outPartitionCmd(str, obj); - break; - case T_GpAlterPartitionId: - _outGpAlterPartitionId(str, obj); - break; - case T_GpAlterPartitionCmd: - _outGpAlterPartitionCmd(str, obj); - break; - case T_GpDropPartitionCmd: - _outGpDropPartitionCmd(str, obj); - break; - - case T_CreateSchemaStmt: - _outCreateSchemaStmt(str, obj); - break; - case T_AlterSchemaStmt: - _outAlterSchemaStmt(str, obj); - break; - - case T_CreateTagStmt: - _outCreateTagStmt(str, obj); - break; - case T_AlterTagStmt: - _outAlterTagStmt(str, obj); - break; - case T_DropTagStmt: - _outDropTagStmt(str, obj); - break; - case T_CreatePLangStmt: - _outCreatePLangStmt(str, obj); - break; - case T_VacuumStmt: - _outVacuumStmt(str, obj); - break; - case T_VacuumRelation: - _outVacuumRelation(str, obj); - break; - case T_CdbProcess: - _outCdbProcess(str, obj); - break; - case T_SliceTable: - _outSliceTable(str, obj); - break; - case T_CursorPosInfo: - _outCursorPosInfo(str, obj); - break; - case T_VariableSetStmt: - _outVariableSetStmt(str, obj); - break; - - case T_DMLActionExpr: - _outDMLActionExpr(str, obj); - break; - - case T_CreateTrigStmt: - _outCreateTrigStmt(str, obj); - break; - - case T_CreateTableSpaceStmt: - _outCreateTableSpaceStmt(str, obj); - break; - - case T_DropTableSpaceStmt: - _outDropTableSpaceStmt(str, obj); - break; - - case T_CreateQueueStmt: - _outCreateQueueStmt(str, obj); - break; - case T_AlterQueueStmt: - _outAlterQueueStmt(str, obj); - break; - case T_DropQueueStmt: - _outDropQueueStmt(str, obj); - break; - - case T_CreateResourceGroupStmt: - _outCreateResourceGroupStmt(str, obj); - break; - case T_DropResourceGroupStmt: - _outDropResourceGroupStmt(str, obj); - break; - case T_AlterResourceGroupStmt: - _outAlterResourceGroupStmt(str, obj); - break; - - case T_CommentStmt: - _outCommentStmt(str, obj); - break; - - case T_TableValueExpr: - _outTableValueExpr(str, obj); - break; - case T_DenyLoginInterval: - _outDenyLoginInterval(str, obj); - break; - case T_DenyLoginPoint: - _outDenyLoginPoint(str, obj); - break; - - case T_AlterTypeStmt: - _outAlterTypeStmt(str, obj); - break; - case T_AlterExtensionStmt: - _outAlterExtensionStmt(str, obj); - break; - case T_AlterExtensionContentsStmt: - _outAlterExtensionContentsStmt(str, obj); - break; - case T_TupleDescNode: - _outTupleDescNode(str, obj); - break; - - case T_AlterTSConfigurationStmt: - _outAlterTSConfigurationStmt(str, obj); - break; - case T_AlterTSDictionaryStmt: - _outAlterTSDictionaryStmt(str, obj); - break; - - case T_CreatePublicationStmt: - _outCreatePublicationStmt(str, obj); - break; - case T_AlterPublicationStmt: - _outAlterPublicationStmt(str, obj); - break; - case T_CreateSubscriptionStmt: - _outCreateSubscriptionStmt(str, obj); - break; - case T_DropSubscriptionStmt: - _outDropSubscriptionStmt(str, obj); - break; - case T_AlterSubscriptionStmt: - _outAlterSubscriptionStmt(str, obj); - break; - - case T_CreatePolicyStmt: - _outCreatePolicyStmt(str, obj); - break; - case T_AlterPolicyStmt: - _outAlterPolicyStmt(str, obj); - break; - case T_CreateTransformStmt: - _outCreateTransformStmt(str, obj); - break; - case T_GpPartitionDefinition: - _outGpPartitionDefinition(str, obj); - break; - case T_GpPartDefElem: - _outGpPartDefElem(str, obj); - break; - case T_GpPartitionRangeItem: - _outGpPartitionRangeItem(str, obj); - break; - case T_GpPartitionRangeSpec: - _outGpPartitionRangeSpec(str, obj); - break; - case T_GpPartitionListSpec: - _outGpPartitionListSpec(str, obj); - break; - case T_EphemeralNamedRelationInfo: - _outEphemeralNamedRelationInfo(str, obj); - break; - case T_AlterDatabaseStmt: - _outAlterDatabaseStmt(str, obj); - break; - case T_CreateDirectoryTableStmt: - _outCreateDirectoryTableStmt(str, obj); - break; - case T_AlterDirectoryTableStmt: - _outAlterDirectoryTableStmt(str, obj); - break; - case T_DropDirectoryTableStmt: - _outDropDirectoryTableStmt(str, obj); - break; - case T_CreateTaskStmt: - _outCreateTaskStmt(str, obj); - break; - case T_AlterTaskStmt: - _outAlterTaskStmt(str, obj); - break; - case T_DropTaskStmt: - _outDropTaskStmt(str, obj); - break; - case T_RTEPermissionInfo: - _outRTEPermissionInfo(str, obj); - break; - case T_GpPolicy: - _outGpPolicy(str, obj); - break; - case T_MergeAction: - _outMergeAction(str, obj); - break; - case T_PublicationObjSpec: - _outPublicationObjSpec(str, obj); - break; - case T_PublicationTable: - _outPublicationTable(str, obj); - break; - case T_JsonIsPredicate: - _outJsonIsPredicate(str, obj); - break; - case T_JsonConstructorExpr: - _outJsonConstructorExpr(str, obj); - break; - case T_JsonReturning: - _outJsonReturning(str, obj); - break; - case T_JsonValueExpr: - _outJsonValueExpr(str, obj); - break; - case T_JsonFormat: - _outJsonFormat(str, obj); - break; default: /* @@ -5700,4 +1399,3 @@ bmsToString(const Bitmapset *bms) outBitmapset(&str, bms); return str.data; } -#endif /* COMPILING_BINARY_FUNCS */ diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 2cd0ced930e..b3664d40037 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -548,7 +548,7 @@ nodeRead(const char *token, int tok_len) } else { - elog(ERROR, "unrecognized token: \"%.*s\"", tok_len, token); + elog(PANIC, "unrecognized token: \"%.*s\"", tok_len, token); result = NULL; /* keep compiler happy */ } break; diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c index ff3cb5eaddf..88545f9f4b9 100644 --- a/src/backend/nodes/readfast.c +++ b/src/backend/nodes/readfast.c @@ -33,6 +33,7 @@ #include +#include "nodes/extensible.h" #include "nodes/parsenodes.h" #include "nodes/plannodes.h" #include "nodes/readfuncs.h" @@ -40,6 +41,7 @@ #include "catalog/pg_class.h" #include "catalog/heap.h" #include "cdb/cdbgang.h" +#include "nodes/altertablenodes.h" /* * Macros to simplify reading of different kinds of fields. Use these @@ -230,87 +232,6 @@ static Bitmapset *_readBitmapset(void); */ static const char *read_str_ptr; -/* - * For most structs, we reuse the definitions from readfuncs.c. See comment - * in readfuncs.c. - */ -#define COMPILING_BINARY_FUNCS -#include "readfuncs.c" - -/* - * For some structs, we have to provide a read functions because it differs - * from the text version (or the text version doesn't exist at all). - */ - -/* - * _readQuery - */ -static Query * -_readQuery(void) -{ - READ_LOCALS(Query); - - READ_ENUM_FIELD(commandType, CmdType); Assert(local_node->commandType <= CMD_NOTHING); - READ_ENUM_FIELD(querySource, QuerySource); Assert(local_node->querySource <= QSRC_PLANNER); - READ_BOOL_FIELD(canSetTag); - READ_NODE_FIELD(utilityStmt); - READ_INT_FIELD(resultRelation); - READ_BOOL_FIELD(hasAggs); - READ_BOOL_FIELD(hasWindowFuncs); - READ_BOOL_FIELD(hasSubLinks); - READ_BOOL_FIELD(hasDynamicFunctions); - READ_BOOL_FIELD(hasFuncsWithExecRestrictions); - READ_BOOL_FIELD(hasDistinctOn); - READ_BOOL_FIELD(hasRecursive); - READ_BOOL_FIELD(hasModifyingCTE); - READ_BOOL_FIELD(hasForUpdate); - READ_BOOL_FIELD(hasRowSecurity); - READ_BOOL_FIELD(canOptSelectLockingClause); - READ_NODE_FIELD(cteList); - READ_NODE_FIELD(rtable); - READ_NODE_FIELD(rteperminfos); - READ_NODE_FIELD(jointree); - READ_NODE_FIELD(mergeActionList); - READ_BOOL_FIELD(mergeUseOuterJoin); - READ_NODE_FIELD(targetList); - READ_NODE_FIELD(withCheckOptions); - READ_NODE_FIELD(onConflict); - READ_NODE_FIELD(returningList); - READ_NODE_FIELD(groupClause); - READ_NODE_FIELD(groupingSets); - READ_NODE_FIELD(havingQual); - READ_NODE_FIELD(windowClause); - READ_NODE_FIELD(distinctClause); - READ_NODE_FIELD(sortClause); - READ_NODE_FIELD(scatterClause); - READ_BOOL_FIELD(isTableValueSelect); - READ_NODE_FIELD(limitOffset); - READ_NODE_FIELD(limitCount); - READ_NODE_FIELD(rowMarks); - READ_NODE_FIELD(setOperations); - READ_NODE_FIELD(constraintDeps); - READ_BOOL_FIELD(parentStmtType); - - /* policy not serialized */ - - READ_DONE(); -} - -static DMLActionExpr * -_readDMLActionExpr(void) -{ - READ_LOCALS(DMLActionExpr); - - READ_DONE(); -} - -/* - * Stuff from primnodes.h. - */ - -/* - * _readConst - */ static Const * _readConst(void) { @@ -331,291 +252,22 @@ _readConst(void) READ_DONE(); } -static ResTarget * -_readResTarget(void) -{ - READ_LOCALS(ResTarget); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(indirection); - READ_NODE_FIELD(val); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static MultiAssignRef * -_readMultiAssignRef(void) -{ - READ_LOCALS(MultiAssignRef); - - READ_NODE_FIELD(source); - READ_INT_FIELD(colno); - READ_INT_FIELD(ncolumns); - - READ_DONE(); -} - -static DropOwnedStmt * -_readDropOwnedStmt(void) -{ - READ_LOCALS(DropOwnedStmt); - - READ_NODE_FIELD(roles); - READ_ENUM_FIELD(behavior, DropBehavior); - - READ_DONE(); -} - -static ReassignOwnedStmt * -_readReassignOwnedStmt(void) -{ - READ_LOCALS(ReassignOwnedStmt); - - READ_NODE_FIELD(roles); - READ_NODE_FIELD(newrole); - - READ_DONE(); -} - -static AlterObjectDependsStmt * -_readAlterObjectDependsStmt(void) -{ - READ_LOCALS(AlterObjectDependsStmt); - - READ_ENUM_FIELD(objectType,ObjectType); - READ_NODE_FIELD(relation); - READ_NODE_FIELD(object); - READ_NODE_FIELD(extname); - - READ_DONE(); -} - -static SelectStmt * -_readSelectStmt(void) -{ - READ_LOCALS(SelectStmt); - - READ_NODE_FIELD(distinctClause); - READ_NODE_FIELD(intoClause); - READ_NODE_FIELD(targetList); - READ_NODE_FIELD(fromClause); - READ_NODE_FIELD(whereClause); - READ_NODE_FIELD(groupClause); - READ_BOOL_FIELD(groupDistinct); - READ_NODE_FIELD(havingClause); - READ_NODE_FIELD(windowClause); - READ_NODE_FIELD(valuesLists); - READ_NODE_FIELD(sortClause); - READ_NODE_FIELD(scatterClause); - READ_NODE_FIELD(limitOffset); - READ_NODE_FIELD(limitCount); - READ_ENUM_FIELD(limitOption, LimitOption); - READ_NODE_FIELD(lockingClause); - READ_NODE_FIELD(withClause); - READ_ENUM_FIELD(op, SetOperation); - READ_BOOL_FIELD(all); - READ_NODE_FIELD(larg); - READ_NODE_FIELD(rarg); - READ_BOOL_FIELD(disableLockingOptimization); - READ_DONE(); -} - -static InsertStmt * -_readInsertStmt(void) -{ - READ_LOCALS(InsertStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(cols); - READ_NODE_FIELD(selectStmt); - READ_NODE_FIELD(returningList); - READ_NODE_FIELD(withClause); - READ_DONE(); -} - -static DeleteStmt * -_readDeleteStmt(void) -{ - READ_LOCALS(DeleteStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(usingClause); - READ_NODE_FIELD(whereClause); - READ_NODE_FIELD(returningList); - READ_NODE_FIELD(withClause); - READ_DONE(); -} - -static UpdateStmt * -_readUpdateStmt(void) -{ - READ_LOCALS(UpdateStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(targetList); - READ_NODE_FIELD(whereClause); - READ_NODE_FIELD(fromClause); - READ_NODE_FIELD(returningList); - READ_NODE_FIELD(withClause); - READ_DONE(); -} - - -static Integer * -_readInteger(void) -{ - READ_LOCALS(Integer); - - memcpy(&local_node->ival, read_str_ptr, sizeof(int)); - read_str_ptr += sizeof(int); - - READ_DONE(); -} - -static Boolean * -_readBoolean(void) -{ - READ_LOCALS(Boolean); - - memcpy(&local_node->boolval, read_str_ptr, sizeof(bool)); - read_str_ptr += sizeof(bool); - - READ_DONE(); -} - -static Float * -_readFloat(void) -{ - READ_LOCALS(Float); - - int slen; - char *nn; - memcpy(&slen, read_str_ptr, sizeof(int)); - read_str_ptr += sizeof(int); - nn = palloc(slen + 1); - memcpy(nn, read_str_ptr, slen); - nn[slen] = '\0'; - local_node->fval = nn; - read_str_ptr += slen; - - READ_DONE(); -} - -static String * -_readString(void) -{ - int slen; - char *nn; - - READ_LOCALS(String); - - memcpy(&slen, read_str_ptr, sizeof(int)); - read_str_ptr += sizeof(int); - nn = palloc(slen + 1); - memcpy(nn, read_str_ptr, slen); - nn[slen] = '\0'; - local_node->sval = nn; - read_str_ptr += slen; - - READ_DONE(); -} - -static BitString * -_readBitString(void) -{ - READ_LOCALS(BitString); - - int slen; - char *nn; - memcpy(&slen, read_str_ptr, sizeof(int)); - read_str_ptr += sizeof(int); - nn = palloc(slen + 1); - memcpy(nn, read_str_ptr, slen); - nn[slen] = '\0'; - local_node->bsval = nn; - read_str_ptr += slen; - - READ_DONE(); -} - -static A_Const * -_readAConst(void) -{ - READ_LOCALS(A_Const); - - READ_BOOL_FIELD(isnull); - - if (!local_node->isnull) - { - union ValUnion *tmp = readNodeBinary(); - - switch (nodeTag(tmp)) - { - case T_Integer: - memcpy(&local_node->val, tmp, sizeof(Integer)); - break; - case T_Float: - memcpy(&local_node->val, tmp, sizeof(Float)); - break; - case T_Boolean: - memcpy(&local_node->val, tmp, sizeof(Boolean)); - break; - case T_String: - memcpy(&local_node->val, tmp, sizeof(String)); - break; - case T_BitString: - memcpy(&local_node->val, tmp, sizeof(BitString)); - break; - default: - break; - } - } - - READ_LOCATION_FIELD(location); /*CDB*/ - READ_DONE(); -} - -static A_Star * -_readA_Star(void) -{ - READ_LOCALS(A_Star); - READ_DONE(); -} - -static A_Indices * -_readA_Indices(void) -{ - READ_LOCALS(A_Indices); - READ_BOOL_FIELD(is_slice); - READ_NODE_FIELD(lidx); - READ_NODE_FIELD(uidx); - READ_DONE(); -} - -static A_Indirection * -_readA_Indirection(void) +static BoolExpr * +_readBoolExpr(void) { - READ_LOCALS(A_Indirection); - READ_NODE_FIELD(arg); - READ_NODE_FIELD(indirection); - READ_DONE(); -} + READ_LOCALS(BoolExpr); -static RoleSpec * -_readRoleSpec(void) -{ - READ_LOCALS(RoleSpec); + READ_ENUM_FIELD(boolop, BoolExprType); - READ_ENUM_FIELD(roletype, RoleSpecType); - READ_STRING_FIELD(rolename); + READ_NODE_FIELD(args); READ_LOCATION_FIELD(location); READ_DONE(); } + static A_Expr * -_readAExpr(void) +_readA_Expr(void) { READ_LOCALS(A_Expr); @@ -695,73 +347,226 @@ _readAExpr(void) READ_DONE(); } -/* - * _readOpExpr - */ -static OpExpr * -_readOpExpr(void) +static A_Const * +_readA_Const(void) { - READ_LOCALS(OpExpr); + READ_LOCALS(A_Const); - READ_OID_FIELD(opno); - READ_OID_FIELD(opfuncid); + READ_BOOL_FIELD(isnull); - /* - * The opfuncid is stored in the textual format primarily for debugging - * and documentation reasons. We want to always read it as zero to force - * it to be re-looked-up in the pg_operator entry. This ensures that - * stored rules don't have hidden dependencies on operators' functions. - * (We don't currently support an ALTER OPERATOR command, but might - * someday.) - */ -/* local_node->opfuncid = InvalidOid; */ + if (!local_node->isnull) + { + union ValUnion *tmp = readNodeBinary(); - READ_OID_FIELD(opresulttype); - READ_BOOL_FIELD(opretset); - READ_OID_FIELD(opcollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); + switch (nodeTag(tmp)) + { + case T_Integer: + memcpy(&local_node->val, tmp, sizeof(Integer)); + break; + case T_Float: + memcpy(&local_node->val, tmp, sizeof(Float)); + break; + case T_Boolean: + memcpy(&local_node->val, tmp, sizeof(Boolean)); + break; + case T_String: + memcpy(&local_node->val, tmp, sizeof(String)); + break; + case T_BitString: + memcpy(&local_node->val, tmp, sizeof(BitString)); + break; + default: + break; + } + } + READ_LOCATION_FIELD(location); /*CDB*/ READ_DONE(); } -/* - * _readBoolExpr - */ -static BoolExpr * -_readBoolExpr(void) -{ - READ_LOCALS(BoolExpr); - READ_ENUM_FIELD(boolop, BoolExprType); +static ColumnDef * +_readColumnDef(void) +{ + READ_LOCALS(ColumnDef); - READ_NODE_FIELD(args); + READ_STRING_FIELD(colname); + READ_NODE_FIELD(typeName); + READ_STRING_FIELD(compression); + READ_INT_FIELD(inhcount); + READ_BOOL_FIELD(is_local); + READ_BOOL_FIELD(is_not_null); + READ_BOOL_FIELD(is_from_type); + READ_INT_FIELD(attnum); + READ_INT_FIELD(storage); + READ_STRING_FIELD(storage_name); + READ_NODE_FIELD(raw_default); + READ_NODE_FIELD(cooked_default); + + READ_BOOL_FIELD(hasCookedMissingVal); + READ_BOOL_FIELD(missingIsNull); + if (local_node->hasCookedMissingVal && !local_node->missingIsNull) + local_node->missingVal = readDatum(false); + + READ_CHAR_FIELD(identity); + READ_NODE_FIELD(identitySequence); + READ_CHAR_FIELD(generated); + READ_NODE_FIELD(collClause); + READ_OID_FIELD(collOid); + READ_NODE_FIELD(constraints); + READ_NODE_FIELD(encoding); + READ_NODE_FIELD(fdwoptions); READ_LOCATION_FIELD(location); READ_DONE(); } -/* - * Stuff from parsenodes.h. - */ +static RangeTblEntry * +_readRangeTblEntry(void) +{ + READ_LOCALS(RangeTblEntry); + /* put alias + eref first to make dump more legible */ + READ_NODE_FIELD(alias); + READ_NODE_FIELD(eref); + READ_ENUM_FIELD(rtekind, RTEKind); + READ_BOOL_FIELD(relisivm); -/* - * _readCollateClause - */ -static CollateClause * -_readCollateClause(void) + switch (local_node->rtekind) + { + case RTE_RELATION: + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + READ_INT_FIELD(rellockmode); + READ_NODE_FIELD(tablesample); + READ_UINT_FIELD(perminfoindex); + break; + case RTE_SUBQUERY: + READ_NODE_FIELD(subquery); + READ_BOOL_FIELD(security_barrier); + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + READ_INT_FIELD(rellockmode); + READ_UINT_FIELD(perminfoindex); + break; + case RTE_JOIN: + READ_ENUM_FIELD(jointype, JoinType); + READ_INT_FIELD(joinmergedcols); + READ_NODE_FIELD(joinaliasvars); + READ_NODE_FIELD(joinleftcols); + READ_NODE_FIELD(joinrightcols); + READ_NODE_FIELD(join_using_alias); + break; + case RTE_FUNCTION: + READ_NODE_FIELD(functions); + READ_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNCTION: + READ_NODE_FIELD(subquery); + READ_NODE_FIELD(functions); + READ_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNC: + READ_NODE_FIELD(tablefunc); + /* The RTE must have a copy of the column type info, if any */ + if (local_node->tablefunc) + { + TableFunc *tf = local_node->tablefunc; + + local_node->coltypes = tf->coltypes; + local_node->coltypmods = tf->coltypmods; + local_node->colcollations = tf->colcollations; + } + break; + case RTE_VALUES: + READ_NODE_FIELD(values_lists); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + break; + case RTE_CTE: + READ_STRING_FIELD(ctename); + READ_UINT_FIELD(ctelevelsup); + READ_BOOL_FIELD(self_reference); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + break; + case RTE_NAMEDTUPLESTORE: + READ_STRING_FIELD(enrname); + READ_FLOAT_FIELD(enrtuples); + READ_OID_FIELD(relid); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + break; + case RTE_RESULT: + /* no extra fields */ + break; + case RTE_VOID: /*CDB*/ + break; + default: + elog(ERROR, "unrecognized RTE kind: %d", + (int) local_node->rtekind); + break; + } + + READ_BOOL_FIELD(lateral); + READ_BOOL_FIELD(inh); + READ_BOOL_FIELD(inFromCl); + READ_NODE_FIELD(securityQuals); + + READ_BOOL_FIELD(forceDistRandom); + + READ_DONE(); +} + +static Constraint * +_readConstraint(void) { - READ_LOCALS(CollateClause); + READ_LOCALS(Constraint); + + READ_ENUM_FIELD(contype, ConstrType); + READ_STRING_FIELD(conname); /* name, or NULL if unnamed */ + READ_BOOL_FIELD(deferrable); + READ_BOOL_FIELD(initdeferred); + READ_LOCATION_FIELD(location); + + READ_BOOL_FIELD(is_no_inherit); + READ_NODE_FIELD(raw_expr); + READ_STRING_FIELD(cooked_expr); + READ_CHAR_FIELD(generated_when); + READ_BOOL_FIELD(nulls_not_distinct); + + READ_NODE_FIELD(keys); + READ_NODE_FIELD(including); - READ_NODE_FIELD(arg); - READ_NODE_FIELD(collname); - READ_INT_FIELD(location); + READ_NODE_FIELD(exclusions); + + READ_NODE_FIELD(options); + READ_STRING_FIELD(indexname); + READ_STRING_FIELD(indexspace); + READ_BOOL_FIELD(reset_default_tblspc); + + READ_STRING_FIELD(access_method); + READ_NODE_FIELD(where_clause); + + READ_NODE_FIELD(pktable); + READ_NODE_FIELD(fk_attrs); + READ_NODE_FIELD(pk_attrs); + READ_CHAR_FIELD(fk_matchtype); + READ_CHAR_FIELD(fk_upd_action); + READ_CHAR_FIELD(fk_del_action); + READ_NODE_FIELD(old_conpfeqop); + READ_OID_FIELD(old_pktable_oid); + + READ_BOOL_FIELD(skip_validation); + READ_BOOL_FIELD(initially_valid); READ_DONE(); } + static ExtensibleNode * _readExtensibleNode(void) { @@ -803,154 +608,25 @@ _readExtensibleNode(void) READ_DONE(); } -/* - * Apache Cloudberry additions for serialization support - */ -#include "nodes/plannodes.h" - -static CreateExtensionStmt * -_readCreateExtensionStmt(void) -{ - READ_LOCALS(CreateExtensionStmt); - READ_STRING_FIELD(extname); - READ_BOOL_FIELD(if_not_exists); - READ_NODE_FIELD(options); - READ_ENUM_FIELD(create_ext_state, CreateExtensionState); - - READ_DONE(); -} - -static void -_readCreateStmt_common(CreateStmt *local_node) -{ - READ_NODE_FIELD(relation); - READ_NODE_FIELD(tableElts); - READ_NODE_FIELD(inhRelations); - READ_NODE_FIELD(partspec); - READ_NODE_FIELD(partbound); - READ_NODE_FIELD(ofTypename); - READ_NODE_FIELD(constraints); - READ_NODE_FIELD(options); - READ_ENUM_FIELD(oncommit,OnCommitAction); - READ_STRING_FIELD(tablespacename); - READ_STRING_FIELD(accessMethod); - READ_BOOL_FIELD(if_not_exists); - READ_ENUM_FIELD(origin, CreateStmtOrigin); - - READ_NODE_FIELD(distributedBy); - READ_NODE_FIELD(partitionBy); - READ_CHAR_FIELD(relKind); - READ_OID_FIELD(ownerid); - READ_BOOL_FIELD(buildAoBlkdir); - READ_NODE_FIELD(attr_encodings); - READ_BOOL_FIELD(isCtas); - READ_NODE_FIELD(intoQuery); - READ_NODE_FIELD(intoPolicy); - - READ_NODE_FIELD(part_idx_oids); - READ_NODE_FIELD(part_idx_names); - READ_NODE_FIELD(tags); - - /* - * Some extra checks to make sure we didn't get lost - * during serialization/deserialization - */ - Assert(local_node->relKind == RELKIND_RELATION || - local_node->relKind == RELKIND_PARTITIONED_TABLE || - local_node->relKind == RELKIND_INDEX || - local_node->relKind == RELKIND_SEQUENCE || - local_node->relKind == RELKIND_TOASTVALUE || - local_node->relKind == RELKIND_VIEW || - local_node->relKind == RELKIND_COMPOSITE_TYPE || - local_node->relKind == RELKIND_FOREIGN_TABLE || - local_node->relKind == RELKIND_MATVIEW || - local_node->relKind == RELKIND_DIRECTORY_TABLE || - IsAppendonlyMetadataRelkind(local_node->relKind)); - Assert(local_node->oncommit <= ONCOMMIT_DROP); -} - -static CreateStmt * -_readCreateStmt(void) -{ - READ_LOCALS(CreateStmt); - - _readCreateStmt_common(local_node); - - READ_DONE(); -} - -static CreateRangeStmt * -_readCreateRangeStmt(void) -{ - READ_LOCALS(CreateRangeStmt); - - READ_NODE_FIELD(typeName); - READ_NODE_FIELD(params); - - READ_DONE(); -} - -static CreateForeignTableStmt * -_readCreateForeignTableStmt(void) -{ - READ_LOCALS(CreateForeignTableStmt); - - _readCreateStmt_common(&local_node->base); - - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - READ_NODE_FIELD(distributedBy); - - READ_DONE(); -} - -static AlterDefaultPrivilegesStmt * -_readAlterDefaultPrivilegesStmt(void) +static Bitmapset * +_readBitmapset(void) { - READ_LOCALS(AlterDefaultPrivilegesStmt); - - READ_NODE_FIELD(options); - READ_NODE_FIELD(action); - - READ_DONE(); -} + Bitmapset *bms = NULL; + int nwords; + int i; -static CopyStmt * -_readCopyStmt(void) -{ - READ_LOCALS(CopyStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(attlist); - READ_BOOL_FIELD(is_from); - READ_BOOL_FIELD(is_program); - READ_STRING_FIELD(filename); - READ_STRING_FIELD(dirfilename); - READ_NODE_FIELD(options); - READ_NODE_FIELD(sreh); + memcpy(&nwords, read_str_ptr, sizeof(int)); read_str_ptr+=sizeof(int); + if (nwords==0) + return bms; - READ_DONE(); -} + bms = palloc(offsetof(Bitmapset, words)+nwords*sizeof(bitmapword)); + bms->nwords = nwords; + for (i = 0; i < nwords; i++) + { + memcpy(&bms->words[i], read_str_ptr, sizeof(bitmapword)); read_str_ptr+=sizeof(bitmapword); + } -static QueryDispatchDesc * -_readQueryDispatchDesc(void) -{ - READ_LOCALS(QueryDispatchDesc); - - READ_NODE_FIELD(intoCreateStmt); - READ_NODE_FIELD(paramInfo); - READ_NODE_FIELD(oidAssignments); - READ_NODE_FIELD(sliceTable); - READ_NODE_FIELD(cursorPositions); - READ_STRING_FIELD(parallelCursorName); - READ_BOOL_FIELD(useChangedAOOpts); - READ_INT_FIELD(secContext); - READ_NODE_FIELD(namedRelList); - READ_OID_FIELD(matviewOid); - READ_OID_FIELD(tableid); - READ_INT_FIELD(snaplen); - READ_STRING_FIELD(snapname); - READ_DONE(); + return bms; } static SerializedParams * @@ -991,2059 +667,432 @@ _readSerializedParams(void) READ_DONE(); } -static OidAssignment * -_readOidAssignment(void) +static SliceTable * +_readSliceTable(void) { - READ_LOCALS(OidAssignment); + READ_LOCALS(SliceTable); + + READ_INT_FIELD(localSlice); + READ_INT_FIELD(numSlices); + local_node->slices = palloc0(local_node->numSlices * sizeof(ExecSlice)); + for (int i = 0; i < local_node->numSlices; i++) + { + READ_INT_FIELD(slices[i].sliceIndex); + READ_INT_FIELD(slices[i].rootIndex); + READ_INT_FIELD(slices[i].parentIndex); + READ_INT_FIELD(slices[i].planNumSegments); + READ_NODE_FIELD(slices[i].children); /* List of int index */ + READ_ENUM_FIELD(slices[i].gangType, GangType); + READ_NODE_FIELD(slices[i].segments); /* List of int index */ + READ_BOOL_FIELD(slices[i].useMppParallelMode); + READ_INT_FIELD(slices[i].parallel_workers); + local_node->slices[i].primaryGang = NULL; + READ_NODE_FIELD(slices[i].primaryProcesses); /* List of (CDBProcess *) */ + READ_BITMAPSET_FIELD(slices[i].processesMap); + } + READ_BOOL_FIELD(hasMotions); + + READ_INT_FIELD(instrument_options); + READ_INT_FIELD(ic_instance_id); - READ_OID_FIELD(catalog); - READ_STRING_FIELD_NULL(objname); - READ_OID_FIELD(namespaceOid); - READ_OID_FIELD(keyOid1); - READ_OID_FIELD(keyOid2); - READ_OID_FIELD(oid); READ_DONE(); } -static Sequence * -_readSequence(void) + +static Integer * +_readInteger(void) { - READ_LOCALS(Sequence); - ReadCommonPlan(&local_node->plan); - READ_NODE_FIELD(subplans); + READ_LOCALS(Integer); + + memcpy(&local_node->ival, read_str_ptr, sizeof(int)); + read_str_ptr += sizeof(int); + READ_DONE(); } -static DynamicSeqScan * -_readDynamicSeqScan(void) +static Boolean * +_readBoolean(void) { - READ_LOCALS(DynamicSeqScan); + READ_LOCALS(Boolean); - ReadCommonScan(&local_node->seqscan.scan); - READ_NODE_FIELD(partOids); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); + memcpy(&local_node->boolval, read_str_ptr, sizeof(bool)); + read_str_ptr += sizeof(bool); READ_DONE(); } -/* - * _readExternalScanInfo - */ -static ExternalScanInfo * -_readExternalScanInfo(void) +static Float * +_readFloat(void) { - READ_LOCALS(ExternalScanInfo); - - READ_NODE_FIELD(uriList); - READ_CHAR_FIELD(fmtType); - READ_BOOL_FIELD(isMasterOnly); - READ_INT_FIELD(rejLimit); - READ_BOOL_FIELD(rejLimitInRows); - READ_CHAR_FIELD(logErrors); - READ_INT_FIELD(encoding); - READ_INT_FIELD(scancounter); - READ_NODE_FIELD(extOptions); + READ_LOCALS(Float); + + int slen; + char *nn; + memcpy(&slen, read_str_ptr, sizeof(int)); + read_str_ptr += sizeof(int); + nn = palloc(slen + 1); + memcpy(nn, read_str_ptr, slen); + nn[slen] = '\0'; + local_node->fval = nn; + read_str_ptr += slen; READ_DONE(); } -static CustomScan * -_readCustomScan(void) +static String * +_readString(void) { - char *custom_name; - const CustomScanMethods *methods; - - READ_LOCALS(CustomScan); + int slen; + char *nn; - ReadCommonScan(&local_node->scan); + READ_LOCALS(String); - READ_UINT_FIELD(flags); - READ_NODE_FIELD(custom_plans); - READ_NODE_FIELD(custom_exprs); - READ_NODE_FIELD(custom_private); - READ_NODE_FIELD(custom_scan_tlist); - READ_BITMAPSET_FIELD(custom_relids); - READ_STRING_VAR(custom_name); - /* find custom scan methods from hash table. */ - methods = GetCustomScanMethods(custom_name, false); - local_node->methods = methods; + memcpy(&slen, read_str_ptr, sizeof(int)); + read_str_ptr += sizeof(int); + nn = palloc(slen + 1); + memcpy(nn, read_str_ptr, slen); + nn[slen] = '\0'; + local_node->sval = nn; + read_str_ptr += slen; READ_DONE(); } -/* - * _readShareInputScan - */ -static ShareInputScan * -_readShareInputScan(void) +static BitString * +_readBitString(void) { - READ_LOCALS(ShareInputScan); - - READ_BOOL_FIELD(cross_slice); - READ_INT_FIELD(share_id); - READ_INT_FIELD(producer_slice_id); - READ_INT_FIELD(this_slice_id); - READ_INT_FIELD(nconsumers); - READ_BOOL_FIELD(discard_output); - READ_BOOL_FIELD(ref_set); + READ_LOCALS(BitString); - ReadCommonPlan(&local_node->scan.plan); + int slen; + char *nn; + memcpy(&slen, read_str_ptr, sizeof(int)); + read_str_ptr += sizeof(int); + nn = palloc(slen + 1); + memcpy(nn, read_str_ptr, slen); + nn[slen] = '\0'; + local_node->bsval = nn; + read_str_ptr += slen; READ_DONE(); } -/* - * _readMotion - */ -static Motion * -_readMotion(void) +static TupleDescNode * +_readTupleDescNode(void) { - READ_LOCALS(Motion); - - READ_INT_FIELD(motionID); - READ_ENUM_FIELD(motionType, MotionType); + READ_LOCALS(TupleDescNode); - Assert(local_node->motionType == MOTIONTYPE_GATHER || - local_node->motionType == MOTIONTYPE_GATHER_SINGLE || - local_node->motionType == MOTIONTYPE_HASH || - local_node->motionType == MOTIONTYPE_BROADCAST || - local_node->motionType == MOTIONTYPE_BROADCAST_WORKERS || - local_node->motionType == MOTIONTYPE_EXPLICIT); + READ_INT_FIELD(natts); - READ_BOOL_FIELD(sendSorted); + local_node->tuple = CreateTemplateTupleDesc(local_node->natts); - READ_NODE_FIELD(hashExprs); - READ_OID_ARRAY(hashFuncs, list_length(local_node->hashExprs)); + READ_INT_FIELD(tuple->natts); + if (local_node->tuple->natts > 0) + { + int i = 0; + for (; i < local_node->tuple->natts; i++) + { + memcpy(&local_node->tuple->attrs[i], read_str_ptr, ATTRIBUTE_FIXED_PART_SIZE); + read_str_ptr+=ATTRIBUTE_FIXED_PART_SIZE; + } + } - READ_INT_FIELD(numSortCols); - READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numSortCols); - READ_OID_ARRAY(sortOperators, local_node->numSortCols); - READ_OID_ARRAY(collations, local_node->numSortCols); - READ_BOOL_ARRAY(nullsFirst, local_node->numSortCols); + READ_OID_FIELD(tuple->tdtypeid); + READ_INT_FIELD(tuple->tdtypmod); + READ_INT_FIELD(tuple->tdrefcount); - READ_INT_FIELD(segidColIdx); - READ_INT_FIELD(numHashSegments); + // Transient type don't have constraint. + local_node->tuple->constr = NULL; - ReadCommonPlan(&local_node->plan); + Assert(local_node->tuple->tdtypeid == RECORDOID); READ_DONE(); } -/* - * _readSplitUpdate - */ -static SplitUpdate * -_readSplitUpdate(void) +static void +unwrapStringList(List *list) { - READ_LOCALS(SplitUpdate); + ListCell *lc; - READ_INT_FIELD(actionColIdx); - READ_NODE_FIELD(insertColIdx); - READ_NODE_FIELD(deleteColIdx); - - READ_INT_FIELD(numHashSegments); - READ_INT_FIELD(numHashAttrs); - READ_ATTRNUMBER_ARRAY(hashAttnos, local_node->numHashAttrs); - READ_OID_ARRAY(hashFuncs, local_node->numHashAttrs); - - ReadCommonPlan(&local_node->plan); + foreach(lc, list) + { + String *val = lfirst(lc); - READ_DONE(); + lfirst(lc) = strVal(val); + pfree(val); + } } -/* - * _readSplitUpdate - */ -static SplitMerge * -_readSplitMerge(void) +static AlteredTableInfo * +_readAlteredTableInfo(void) { - READ_LOCALS(SplitMerge); + READ_LOCALS(AlteredTableInfo); - READ_INT_FIELD(numHashSegments); - READ_INT_FIELD(numHashAttrs); - READ_ATTRNUMBER_ARRAY(hashAttnos, local_node->numHashAttrs); - READ_OID_ARRAY(hashFuncs, local_node->numHashAttrs); - - READ_NODE_FIELD(resultRelations); - READ_NODE_FIELD(mergeActionLists); - READ_BOOL_FIELD(hasSplitUpdate); - READ_UINT_FIELD(rootResultRelation); - - ReadCommonPlan(&local_node->plan); - - READ_DONE(); -} + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + /* oldDesc is omitted */ + for (int i = 0; i < AT_NUM_PASSES; i++) + { + READ_NODE_FIELD(subcmds[i]); + } -static PlaceHolderVar * -_readPlaceHolderVar(void) -{ - READ_LOCALS(PlaceHolderVar); + READ_NODE_FIELD(constraints); + READ_NODE_FIELD(newvals); + READ_NODE_FIELD(afterStmts); + READ_BOOL_FIELD(verify_new_notnull); + READ_INT_FIELD(rewrite); + READ_OID_FIELD(newAccessMethod); + READ_BOOL_FIELD(dist_opfamily_changed); + READ_OID_FIELD(new_opclass); + READ_BOOL_FIELD(chgPersistence); + READ_CHAR_FIELD(newrelpersistence); + READ_NODE_FIELD(partition_constraint); + READ_BOOL_FIELD(validate_default); + READ_NODE_FIELD(changedConstraintOids); + READ_NODE_FIELD(changedConstraintDefs); + /* The QD sends changedConstraintDefs wrapped in Values. Unwrap them. */ + unwrapStringList(local_node->changedConstraintDefs); + READ_NODE_FIELD(changedIndexOids); + READ_NODE_FIELD(changedIndexDefs); + unwrapStringList(local_node->changedIndexDefs); + READ_NODE_FIELD(beforeStmtLists); + READ_NODE_FIELD(constraintLists); + + READ_DONE(); +} + +static NewConstraint * +_readNewConstraint(void) +{ + READ_LOCALS(NewConstraint); - READ_NODE_FIELD(phexpr); - READ_BITMAPSET_FIELD(phrels); - READ_BITMAPSET_FIELD(phnullingrels); - READ_UINT_FIELD(phid); - READ_UINT_FIELD(phlevelsup); + READ_STRING_FIELD(name); + READ_ENUM_FIELD(contype, ConstrType); + READ_OID_FIELD(refrelid); + READ_OID_FIELD(refindid); + READ_OID_FIELD(conid); + READ_NODE_FIELD(qual); + /* can't serialize qualstate */ READ_DONE(); } -/* - * _readAssertOp - */ -static AssertOp * -_readAssertOp(void) +static PlannedStmt * +_readPlannedStmt(void) { - READ_LOCALS(AssertOp); - - READ_NODE_FIELD(errmessage); - READ_INT_FIELD(errcode); - - ReadCommonPlan(&local_node->plan); + READ_LOCALS(PlannedStmt); - READ_DONE(); -} - -/* - * _readPartitionSelector - */ -static PartitionSelector * -_readPartitionSelector(void) -{ - READ_LOCALS(PartitionSelector); - - READ_INT_FIELD(paramid); - READ_NODE_FIELD(part_prune_info); - - ReadCommonPlan(&local_node->plan); - - READ_DONE(); -} - -static Bitmapset * -_readBitmapset(void) -{ - Bitmapset *bms = NULL; - int nwords; - int i; + READ_ENUM_FIELD(commandType, CmdType); + READ_ENUM_FIELD(planGen, PlanGenerator); + READ_UINT64_FIELD(queryId); + READ_BOOL_FIELD(hasReturning); + READ_BOOL_FIELD(hasModifyingCTE); + READ_BOOL_FIELD(canSetTag); + READ_BOOL_FIELD(transientPlan); + READ_BOOL_FIELD(oneoffPlan); + READ_OID_FIELD(simplyUpdatableRel); + READ_BOOL_FIELD(dependsOnRole); + READ_BOOL_FIELD(parallelModeNeeded); + READ_INT_FIELD(jitFlags); + READ_NODE_FIELD(planTree); + READ_NODE_FIELD(rtable); + READ_NODE_FIELD(permInfos); + READ_NODE_FIELD(resultRelations); + READ_NODE_FIELD(appendRelations); + READ_NODE_FIELD(subplans); + READ_BITMAPSET_FIELD(rewindPlanIDs); + READ_NODE_FIELD(rowMarks); + READ_NODE_FIELD(relationOids); + READ_NODE_FIELD(paramExecTypes); + READ_NODE_FIELD(utilityStmt); + READ_LOCATION_FIELD(stmt_location); + READ_INT_FIELD(stmt_len); - memcpy(&nwords, read_str_ptr, sizeof(int)); read_str_ptr+=sizeof(int); - if (nwords==0) - return bms; + READ_INT_ARRAY(subplan_sliceIds, list_length(local_node->subplans)); - bms = palloc(offsetof(Bitmapset, words)+nwords*sizeof(bitmapword)); - bms->nwords = nwords; - for (i = 0; i < nwords; i++) + READ_INT_FIELD(numSlices); + local_node->slices = palloc(local_node->numSlices * sizeof(PlanSlice)); + for (int i = 0; i < local_node->numSlices; i++) { - memcpy(&bms->words[i], read_str_ptr, sizeof(bitmapword)); read_str_ptr+=sizeof(bitmapword); + READ_INT_FIELD(slices[i].sliceIndex); + READ_INT_FIELD(slices[i].parentIndex); + READ_INT_FIELD(slices[i].gangType); + READ_INT_FIELD(slices[i].numsegments); + READ_INT_FIELD(slices[i].parallel_workers); + READ_INT_FIELD(slices[i].segindex); + READ_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); + READ_NODE_FIELD(slices[i].directDispatch.contentIds); } - return bms; -} - -static CreateTrigStmt * -_readCreateTrigStmt(void) -{ - READ_LOCALS(CreateTrigStmt); - - READ_BOOL_FIELD(replace); - READ_STRING_FIELD(trigname); - READ_NODE_FIELD(relation); - READ_NODE_FIELD(funcname); - READ_NODE_FIELD(args); - READ_BOOL_FIELD(row); - READ_INT_FIELD(timing); - READ_INT_FIELD(events); - READ_NODE_FIELD(columns); - READ_NODE_FIELD(whenClause); - READ_BOOL_FIELD(isconstraint); - READ_NODE_FIELD(transitionRels); - READ_BOOL_FIELD(deferrable); - READ_BOOL_FIELD(initdeferred); - READ_NODE_FIELD(constrrel); - READ_OID_FIELD(matviewId); - - READ_DONE(); -} - -static TriggerTransition * -_readTriggerTransition() -{ - READ_LOCALS(TriggerTransition); - - READ_STRING_FIELD(name); - READ_BOOL_FIELD(isNew); - READ_BOOL_FIELD(isTable); - - READ_DONE(); -} - -static CreateTableSpaceStmt * -_readCreateTableSpaceStmt(void) -{ - READ_LOCALS(CreateTableSpaceStmt); - - READ_STRING_FIELD(tablespacename); - READ_NODE_FIELD(owner); - READ_STRING_FIELD(location); - READ_NODE_FIELD(options); - READ_STRING_FIELD(filehandler); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static CreateAmStmt * -_readCreateAmStmt() -{ - READ_LOCALS(CreateAmStmt); - - READ_STRING_FIELD(amname); - READ_NODE_FIELD(handler_name); - READ_INT_FIELD(amtype); - - READ_DONE(); -} - -static AlterTableMoveAllStmt * -_readAlterTableMoveAllStmt(void) -{ - READ_LOCALS(AlterTableMoveAllStmt); - - READ_STRING_FIELD(orig_tablespacename); - READ_ENUM_FIELD(objtype, ObjectType); - READ_NODE_FIELD(roles); - READ_STRING_FIELD(new_tablespacename); - READ_BOOL_FIELD(nowait); - - READ_DONE(); -} - -static AlterTableSpaceOptionsStmt * -_readAlterTableSpaceOptionsStmt(void) -{ - READ_LOCALS(AlterTableSpaceOptionsStmt); - - READ_STRING_FIELD(tablespacename); - READ_NODE_FIELD(options); - READ_BOOL_FIELD(isReset); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); + READ_BITMAPSET_FIELD(rewindPlanIDs); - READ_DONE(); -} + READ_NODE_FIELD(intoPolicy); -static DropTableSpaceStmt * -_readDropTableSpaceStmt(void) -{ - READ_LOCALS(DropTableSpaceStmt); + READ_UINT64_FIELD(query_mem); - READ_STRING_FIELD(tablespacename); - READ_BOOL_FIELD(missing_ok); + READ_NODE_FIELD(intoClause); + READ_NODE_FIELD(copyIntoClause); + READ_NODE_FIELD(refreshClause); + READ_INT_FIELD(metricsQueryType); + READ_NODE_FIELD(extensionContext); READ_DONE(); } - -static CreateQueueStmt * -_readCreateQueueStmt(void) -{ - READ_LOCALS(CreateQueueStmt); - - READ_STRING_FIELD(queue); - READ_NODE_FIELD(options); - - READ_DONE(); -} -static AlterQueueStmt * -_readAlterQueueStmt(void) +static Motion * +_readMotion(void) { - READ_LOCALS(AlterQueueStmt); - - READ_STRING_FIELD(queue); - READ_NODE_FIELD(options); + READ_LOCALS(Motion); - READ_DONE(); -} -static DropQueueStmt * -_readDropQueueStmt(void) -{ - READ_LOCALS(DropQueueStmt); + READ_FLOAT_FIELD(plan.startup_cost); + READ_FLOAT_FIELD(plan.total_cost); + READ_FLOAT_FIELD(plan.plan_rows); + READ_INT_FIELD(plan.plan_width); + READ_BOOL_FIELD(plan.parallel_aware); + READ_BOOL_FIELD(plan.parallel_safe); + READ_BOOL_FIELD(plan.async_capable); + READ_INT_FIELD(plan.plan_node_id); + READ_NODE_FIELD(plan.targetlist); + READ_NODE_FIELD(plan.qual); + READ_NODE_FIELD(plan.lefttree); + READ_NODE_FIELD(plan.righttree); + READ_NODE_FIELD(plan.initPlan); + READ_BITMAPSET_FIELD(plan.extParam); + READ_BITMAPSET_FIELD(plan.allParam); + READ_NODE_FIELD(plan.flow); + READ_UINT_FIELD(plan.locustype); + READ_INT_FIELD(plan.parallel); + READ_UINT64_FIELD(plan.operatorMemKB); + + READ_INT_FIELD(motionID); + READ_ENUM_FIELD(motionType, MotionType); - READ_STRING_FIELD(queue); + Assert(local_node->motionType == MOTIONTYPE_GATHER || + local_node->motionType == MOTIONTYPE_GATHER_SINGLE || + local_node->motionType == MOTIONTYPE_HASH || + local_node->motionType == MOTIONTYPE_BROADCAST || + local_node->motionType == MOTIONTYPE_BROADCAST_WORKERS || + local_node->motionType == MOTIONTYPE_EXPLICIT); - READ_DONE(); -} + READ_BOOL_FIELD(sendSorted); -static CreateResourceGroupStmt * -_readCreateResourceGroupStmt(void) -{ - READ_LOCALS(CreateResourceGroupStmt); + READ_NODE_FIELD(hashExprs); + READ_OID_ARRAY(hashFuncs, list_length(local_node->hashExprs)); - READ_STRING_FIELD(name); - READ_NODE_FIELD(options); + READ_INT_FIELD(numSortCols); + READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numSortCols); + READ_OID_ARRAY(sortOperators, local_node->numSortCols); + READ_OID_ARRAY(collations, local_node->numSortCols); + READ_BOOL_ARRAY(nullsFirst, local_node->numSortCols); + READ_INT_FIELD(segidColIdx); + READ_INT_FIELD(numHashSegments); + READ_DONE(); } -static DropResourceGroupStmt * -_readDropResourceGroupStmt(void) +static OidAssignment * +_readOidAssignment(void) { - READ_LOCALS(DropResourceGroupStmt); - - READ_STRING_FIELD(name); + READ_LOCALS(OidAssignment); + READ_OID_FIELD(catalog); + READ_STRING_FIELD_NULL(objname); + READ_OID_FIELD(namespaceOid); + READ_OID_FIELD(keyOid1); + READ_OID_FIELD(keyOid2); + READ_OID_FIELD(oid); READ_DONE(); } -static AlterResourceGroupStmt * -_readAlterResourceGroupStmt(void) -{ - READ_LOCALS(AlterResourceGroupStmt); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(options); +#include "readfast.funcs.c" - READ_DONE(); -} +/* + * For some structs, we have to provide a read functions because it differs + * from the text version (or the text version doesn't exist at all). + */ -static CommentStmt * -_readCommentStmt(void) +static void * +readNodeBinary(void) { - READ_LOCALS(CommentStmt); - - READ_ENUM_FIELD(objtype, ObjectType); - READ_NODE_FIELD(object); - READ_STRING_FIELD(comment); + void *return_value; + NodeTag nt; + int16 ntt; - READ_DONE(); -} + memcpy(&ntt, read_str_ptr,sizeof(int16)); + read_str_ptr+=sizeof(int16); + nt = (NodeTag) ntt; -static TupleDescNode * -_readTupleDescNode(void) -{ - READ_LOCALS(TupleDescNode); + if (nt==0) + return NULL; - READ_INT_FIELD(natts); + if (nt == T_List || nt == T_IntList || nt == T_OidList) + { + List *l = NIL; + int listsize = 0; + int i; - local_node->tuple = CreateTemplateTupleDesc(local_node->natts); + memcpy(&listsize,read_str_ptr,sizeof(int)); + read_str_ptr+=sizeof(int); - READ_INT_FIELD(tuple->natts); - if (local_node->tuple->natts > 0) - { - int i = 0; - for (; i < local_node->tuple->natts; i++) + if (nt == T_IntList) { - memcpy(&local_node->tuple->attrs[i], read_str_ptr, ATTRIBUTE_FIXED_PART_SIZE); - read_str_ptr+=ATTRIBUTE_FIXED_PART_SIZE; + int val; + for (i = 0; i < listsize; i++) + { + memcpy(&val,read_str_ptr,sizeof(int)); + read_str_ptr+=sizeof(int); + l = lappend_int(l, val); + } } - } - - READ_OID_FIELD(tuple->tdtypeid); - READ_INT_FIELD(tuple->tdtypmod); - READ_INT_FIELD(tuple->tdrefcount); - - // Transient type don't have constraint. - local_node->tuple->constr = NULL; - - Assert(local_node->tuple->tdtypeid == RECORDOID); - - READ_DONE(); -} - -static AlterExtensionStmt * -_readAlterExtensionStmt(void) -{ - READ_LOCALS(AlterExtensionStmt); - READ_STRING_FIELD(extname); - READ_NODE_FIELD(options); - READ_ENUM_FIELD(update_ext_state, UpdateExtensionState); - READ_DONE(); -} - -static AlterExtensionContentsStmt * -_readAlterExtensionContentsStmt(void) -{ - READ_LOCALS(AlterExtensionContentsStmt); - - READ_STRING_FIELD(extname); - READ_INT_FIELD(action); - READ_ENUM_FIELD(objtype, ObjectType); - READ_NODE_FIELD(object); - - READ_DONE(); -} - -static AlterTSConfigurationStmt * -_readAlterTSConfigurationStmt(void) -{ - READ_LOCALS(AlterTSConfigurationStmt); - - READ_NODE_FIELD(cfgname); - READ_NODE_FIELD(tokentype); - READ_NODE_FIELD(dicts); - READ_BOOL_FIELD(override); - READ_BOOL_FIELD(replace); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static AlterTSDictionaryStmt * -_readAlterTSDictionaryStmt(void) -{ - READ_LOCALS(AlterTSDictionaryStmt); - - READ_NODE_FIELD(dictname); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static CookedConstraint * -_readCookedConstraint(void) -{ - READ_LOCALS(CookedConstraint); - - READ_ENUM_FIELD(contype,ConstrType); - READ_STRING_FIELD(name); - READ_INT_FIELD(attnum); - READ_NODE_FIELD(expr); - READ_BOOL_FIELD(is_local); - READ_INT_FIELD(inhcount); - READ_BOOL_FIELD(is_no_inherit); + else if (nt == T_OidList) + { + Oid val; + for (i = 0; i < listsize; i++) + { + memcpy(&val,read_str_ptr,sizeof(Oid)); + read_str_ptr+=sizeof(Oid); + l = lappend_oid(l, val); + } + } + else + { - READ_DONE(); -} + for (i = 0; i < listsize; i++) + { + l = lappend(l, readNodeBinary()); + } + } + Assert(l->length==listsize); -static AlterEnumStmt * -_readAlterEnumStmt(void) -{ - READ_LOCALS(AlterEnumStmt); + return l; + } - READ_NODE_FIELD(typeName); - READ_STRING_FIELD(oldVal); - READ_STRING_FIELD(newVal); - READ_STRING_FIELD(newValNeighbor); - READ_BOOL_FIELD(newValIsAfter); - READ_BOOL_FIELD(skipIfNewValExists); + switch(nt) + { + case T_Integer: + return_value = _readInteger(); + break; + case T_Boolean: + return_value = _readBoolean(); + break; + case T_Float: + return_value = _readFloat(); + break; + case T_String: + return_value = _readString(); + break; + case T_BitString: + return_value = _readBitString(); + break; + +#include "readfast.switch.c" - READ_DONE(); -} - -static CreateFdwStmt * -_readCreateFdwStmt(void) -{ - READ_LOCALS(CreateFdwStmt); - - READ_STRING_FIELD(fdwname); - READ_NODE_FIELD(func_options); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static DistributedBy* -_readDistributedBy(void) -{ - READ_LOCALS(DistributedBy); - - READ_ENUM_FIELD(ptype, GpPolicyType); - READ_INT_FIELD(numsegments); - READ_NODE_FIELD(keyCols); - - READ_DONE(); -} - -static ImportForeignSchemaStmt* -_readImportForeignSchemaStmt(void) -{ - READ_LOCALS(ImportForeignSchemaStmt); - - READ_STRING_FIELD(server_name); - READ_STRING_FIELD(remote_schema); - READ_STRING_FIELD(local_schema); - READ_ENUM_FIELD(list_type, ImportForeignSchemaType); - READ_NODE_FIELD(table_list); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterFdwStmt * -_readAlterFdwStmt(void) -{ - READ_LOCALS(AlterFdwStmt); - - READ_STRING_FIELD(fdwname); - READ_NODE_FIELD(func_options); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static CreateForeignServerStmt * -_readCreateForeignServerStmt(void) -{ - READ_LOCALS(CreateForeignServerStmt); - - READ_STRING_FIELD(servername); - READ_STRING_FIELD(servertype); - READ_STRING_FIELD(version); - READ_STRING_FIELD(fdwname); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AddForeignSegStmt * -_readAddForeignSegStmt(void) -{ - READ_LOCALS(AddForeignSegStmt); - - READ_STRING_FIELD(servername); - READ_STRING_FIELD(tablename); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterForeignServerStmt * -_readAlterForeignServerStmt(void) -{ - READ_LOCALS(AlterForeignServerStmt); - - READ_STRING_FIELD(servername); - READ_STRING_FIELD(version); - READ_NODE_FIELD(options); - READ_BOOL_FIELD(has_version); - - READ_DONE(); -} - -static CreateStorageServerStmt * -_readCreateStorageServerStmt(void) -{ - READ_LOCALS(CreateStorageServerStmt); - - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterStorageServerStmt * -_readAlterStorageServerStmt(void) -{ - READ_LOCALS(AlterStorageServerStmt); - - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static DropStorageServerStmt * -_readDropStorageServerStmt(void) -{ - READ_LOCALS(DropStorageServerStmt); - - READ_STRING_FIELD(servername); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static CreateUserMappingStmt * -_readCreateUserMappingStmt(void) -{ - READ_LOCALS(CreateUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterUserMappingStmt * -_readAlterUserMappingStmt(void) -{ - READ_LOCALS(AlterUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static DropUserMappingStmt * -_readDropUserMappingStmt(void) -{ - READ_LOCALS(DropUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static CreateStorageUserMappingStmt * -_readCreateStorageUserMappingStmt(void) -{ - READ_LOCALS(CreateStorageUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterStorageUserMappingStmt * -_readAlterStorageUserMappingStmt(void) -{ - READ_LOCALS(AlterStorageUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static DropStorageUserMappingStmt * -_readDropStorageUserMappingStmt(void) -{ - READ_LOCALS(DropStorageUserMappingStmt); - - READ_NODE_FIELD(user); - READ_STRING_FIELD(servername); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static AccessPriv * -_readAccessPriv(void) -{ - READ_LOCALS(AccessPriv); - - READ_STRING_FIELD(priv_name); - READ_NODE_FIELD(cols); - - READ_DONE(); -} - -static LockingClause * -_readLockingClause(void) -{ - READ_LOCALS(LockingClause); - - READ_NODE_FIELD(lockedRels); - READ_ENUM_FIELD(strength, LockClauseStrength); - - READ_DONE(); -} - -static AggExprId * -_readAggExprId(void) -{ - READ_LOCALS(AggExprId); - READ_DONE(); -} - -static RowIdExpr * -_readRowIdExpr(void) -{ - READ_LOCALS(RowIdExpr); - READ_INT_FIELD(rowidexpr_id); - READ_DONE(); -} - -static GpDropPartitionCmd * -_readGpDropPartitionCmd(void) -{ - READ_LOCALS(GpDropPartitionCmd); - READ_NODE_FIELD(partid); - READ_ENUM_FIELD(behavior, DropBehavior); - READ_BOOL_FIELD(missing_ok); - READ_DONE(); -} - -static GpSplitPartitionCmd * -_readGpSplitPartitionCmd(void) -{ - READ_LOCALS(GpSplitPartitionCmd); - - READ_NODE_FIELD(partid); - READ_NODE_FIELD(start); - READ_NODE_FIELD(end); - READ_NODE_FIELD(at); - READ_NODE_FIELD(arg2); - - READ_DONE(); -} - -static StatsElem * -_readStatsElem(void) -{ - READ_LOCALS(StatsElem); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(expr); - - READ_DONE(); -} - -static CreateStatsStmt * -_readCreateStatsStmt(void) -{ - READ_LOCALS(CreateStatsStmt); - READ_NODE_FIELD(defnames); - READ_NODE_FIELD(stat_types); - READ_NODE_FIELD(exprs); - READ_NODE_FIELD(relations); - READ_STRING_FIELD(stxcomment); - READ_BOOL_FIELD(transformed); - READ_BOOL_FIELD(if_not_exists); - - READ_DONE(); -} - -static CreateTaskStmt * -_readCreateTaskStmt(void) -{ - READ_LOCALS(CreateTaskStmt); - - READ_STRING_FIELD(taskname); - READ_STRING_FIELD(schedule); - READ_STRING_FIELD(sql); - READ_NODE_FIELD(options); - READ_BOOL_FIELD(if_not_exists); - - READ_DONE(); -} - -static AlterTaskStmt * -_readAlterTaskStmt(void) -{ - READ_LOCALS(AlterTaskStmt); - - READ_STRING_FIELD(taskname); - READ_NODE_FIELD(options); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static DropTaskStmt * -_readDropTaskStmt(void) -{ - READ_LOCALS(DropTaskStmt); - - READ_STRING_FIELD(taskname); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static EphemeralNamedRelationInfo * -_readEphemeralNamedRelationInfo(void) -{ - READ_LOCALS(EphemeralNamedRelationInfo); - - READ_STRING_FIELD(name); - READ_OID_FIELD(reliddesc); - READ_INT_FIELD(natts); - - local_node->tuple = CreateTemplateTupleDesc(local_node->natts); - - READ_INT_FIELD(tuple->natts); - if (local_node->tuple->natts > 0) - { - int i = 0; - for (; i < local_node->tuple->natts; i++) - { - memcpy(&local_node->tuple->attrs[i], read_str_ptr, ATTRIBUTE_FIXED_PART_SIZE); - read_str_ptr+=ATTRIBUTE_FIXED_PART_SIZE; - } - } - - READ_OID_FIELD(tuple->tdtypeid); - READ_INT_FIELD(tuple->tdtypmod); - READ_INT_FIELD(tuple->tdrefcount); - - READ_ENUM_FIELD(enrtype, EphemeralNameRelationType); - READ_FLOAT_FIELD(enrtuples); - - READ_DONE(); -} - -static void * -_readAlterDatabaseStmt(void) -{ - READ_LOCALS(AlterDatabaseStmt); - - READ_STRING_FIELD(dbname); - READ_NODE_FIELD(options); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); - - READ_DONE(); -} - -static CreateDirectoryTableStmt * -_readCreateDirectoryTableStmt(void) -{ - READ_LOCALS(CreateDirectoryTableStmt); - - _readCreateStmt_common(&local_node->base); - - READ_STRING_FIELD(tablespacename); - READ_STRING_FIELD(location); - - READ_DONE(); -} - -static AlterDirectoryTableStmt * -_readAlterDirectoryTableStmt(void) -{ - READ_LOCALS(AlterDirectoryTableStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); - - READ_DONE(); -} - -static void * -readNodeBinary(void) -{ - void *return_value; - NodeTag nt; - int16 ntt; - - memcpy(&ntt, read_str_ptr,sizeof(int16)); - read_str_ptr+=sizeof(int16); - nt = (NodeTag) ntt; - - if (nt==0) - return NULL; - - if (nt == T_List || nt == T_IntList || nt == T_OidList) - { - List *l = NIL; - int listsize = 0; - int i; - - memcpy(&listsize,read_str_ptr,sizeof(int)); - read_str_ptr+=sizeof(int); - - if (nt == T_IntList) - { - int val; - for (i = 0; i < listsize; i++) - { - memcpy(&val,read_str_ptr,sizeof(int)); - read_str_ptr+=sizeof(int); - l = lappend_int(l, val); - } - } - else if (nt == T_OidList) - { - Oid val; - for (i = 0; i < listsize; i++) - { - memcpy(&val,read_str_ptr,sizeof(Oid)); - read_str_ptr+=sizeof(Oid); - l = lappend_oid(l, val); - } - } - else - { - - for (i = 0; i < listsize; i++) - { - l = lappend(l, readNodeBinary()); - } - } - Assert(l->length==listsize); - - return l; - } - - switch(nt) - { - case T_PlannedStmt: - return_value = _readPlannedStmt(); - break; - case T_QueryDispatchDesc: - return_value = _readQueryDispatchDesc(); - break; - case T_OidAssignment: - return_value = _readOidAssignment(); - break; - case T_Plan: - return_value = _readPlan(); - break; - case T_Result: - return_value = _readResult(); - break; - case T_ProjectSet: - return_value = _readProjectSet(); - break; - case T_Append: - return_value = _readAppend(); - break; - case T_MergeAppend: - return_value = _readMergeAppend(); - break; - case T_Sequence: - return_value = _readSequence(); - break; - case T_RecursiveUnion: - return_value = _readRecursiveUnion(); - break; - case T_BitmapAnd: - return_value = _readBitmapAnd(); - break; - case T_BitmapOr: - return_value = _readBitmapOr(); - break; - case T_Gather: - return_value = _readGather(); - break; - case T_GatherMerge: - return_value = _readGatherMerge(); - break; - case T_Scan: - return_value = _readScan(); - break; - case T_SeqScan: - return_value = _readSeqScan(); - break; - case T_DynamicSeqScan: - return_value = _readDynamicSeqScan(); - break; - case T_ExternalScanInfo: - return_value = _readExternalScanInfo(); - break; - case T_IndexScan: - return_value = _readIndexScan(); - break; - case T_IndexOnlyScan: - return_value = _readIndexOnlyScan(); - break; - case T_DynamicIndexScan: - return_value = _readDynamicIndexScan(); - break; - case T_DynamicIndexOnlyScan: - return_value = _readDynamicIndexOnlyScan(); - break; - case T_BitmapIndexScan: - return_value = _readBitmapIndexScan(); - break; - case T_DynamicBitmapIndexScan: - return_value = _readDynamicBitmapIndexScan(); - break; - case T_BitmapHeapScan: - return_value = _readBitmapHeapScan(); - break; - case T_DynamicBitmapHeapScan: - return_value = _readDynamicBitmapHeapScan(); - break; - case T_CteScan: - return_value = _readCteScan(); - break; - case T_NamedTuplestoreScan: - return_value = _readNamedTuplestoreScan(); - break; - case T_WorkTableScan: - return_value = _readWorkTableScan(); - break; - case T_TidScan: - return_value = _readTidScan(); - break; - case T_TidRangeScan: - return_value = _readTidRangeScan(); - break; - case T_SubqueryScan: - return_value = _readSubqueryScan(); - break; - case T_FunctionScan: - return_value = _readFunctionScan(); - break; - case T_TableFuncScan: - return_value = _readTableFuncScan(); - break; - case T_ValuesScan: - return_value = _readValuesScan(); - break; - case T_ForeignScan: - return_value = _readForeignScan(); - break; - case T_DynamicForeignScan: - return_value = _readDynamicForeignScan(); - break; - case T_CustomScan: - return_value = _readCustomScan(); - break; - case T_SampleScan: - return_value = _readSampleScan(); - break; - case T_Join: - return_value = _readJoin(); - break; - case T_NestLoop: - return_value = _readNestLoop(); - break; - case T_MergeJoin: - return_value = _readMergeJoin(); - break; - case T_HashJoin: - return_value = _readHashJoin(); - break; - case T_Agg: - return_value = _readAgg(); - break; - case T_TupleSplit: - return_value = _readTupleSplit(); - break; - case T_DQAExpr: - return_value = _readDQAExpr(); - break; - case T_WindowAgg: - return_value = _readWindowAgg(); - break; - case T_WindowHashAgg: - return_value = _readWindowHashAgg(); - break; - case T_TableFunctionScan: - return_value = _readTableFunctionScan(); - break; - case T_Material: - return_value = _readMaterial(); - break; - case T_Memoize: - return_value = _readMemoize(); - break; - case T_ShareInputScan: - return_value = _readShareInputScan(); - break; - case T_Sort: - return_value = _readSort(); - break; - case T_IncrementalSort: - return_value = _readIncrementalSort(); - break; - case T_Unique: - return_value = _readUnique(); - break; - case T_SetOp: - return_value = _readSetOp(); - break; - case T_RuntimeFilter: - return_value = _readRuntimeFilter(); - break; - case T_Limit: - return_value = _readLimit(); - break; - case T_NestLoopParam: - return_value = _readNestLoopParam(); - break; - case T_PlanRowMark: - return_value = _readPlanRowMark(); - break; - case T_PartitionPruneInfo: - return_value = _readPartitionPruneInfo(); - break; - case T_PartitionedRelPruneInfo: - return_value = _readPartitionedRelPruneInfo(); - break; - case T_PartitionPruneStepOp: - return_value = _readPartitionPruneStepOp(); - break; - case T_PartitionPruneStepCombine: - return_value = _readPartitionPruneStepCombine(); - break; - case T_PlanInvalItem: - return_value = _readPlanInvalItem(); - break; - case T_Hash: - return_value = _readHash(); - break; - case T_Motion: - return_value = _readMotion(); - break; - case T_SplitUpdate: - return_value = _readSplitUpdate(); - break; - case T_SplitMerge: - return_value = _readSplitMerge(); - break; - case T_AssertOp: - return_value = _readAssertOp(); - break; - case T_PartitionSelector: - return_value = _readPartitionSelector(); - break; - case T_GpPartDefElem: - return_value = _readGpPartDefElem(); - break; - case T_Alias: - return_value = _readAlias(); - break; - case T_RangeVar: - return_value = _readRangeVar(); - break; - case T_TableFunc: - return_value = _readTableFunc(); - break; - case T_IntoClause: - return_value = _readIntoClause(); - break; - case T_CopyIntoClause: - return_value = _readCopyIntoClause(); - break; - case T_RefreshClause: - return_value = _readRefreshClause(); - break; - case T_Var: - return_value = _readVar(); - break; - case T_Const: - return_value = _readConst(); - break; - case T_Param: - return_value = _readParam(); - break; - case T_Aggref: - return_value = _readAggref(); - break; - case T_GroupingFunc: - return_value = _readGroupingFunc(); - break; - case T_GroupId: - return_value = _readGroupId(); - break; - case T_GroupingSetId: - return_value = _readGroupingSetId(); - break; - case T_WindowFunc: - return_value = _readWindowFunc(); - break; - case T_SubscriptingRef: - return_value = _readSubscriptingRef(); - break; - case T_FuncExpr: - return_value = _readFuncExpr(); - break; - case T_NamedArgExpr: - return_value = _readNamedArgExpr(); - break; - case T_OpExpr: - return_value = _readOpExpr(); - break; - case T_DistinctExpr: - return_value = _readDistinctExpr(); - break; - case T_ScalarArrayOpExpr: - return_value = _readScalarArrayOpExpr(); - break; - case T_BoolExpr: - return_value = _readBoolExpr(); - break; - case T_SubLink: - return_value = _readSubLink(); - break; - case T_SubPlan: - return_value = _readSubPlan(); - break; - case T_AlternativeSubPlan: - return_value = _readAlternativeSubPlan(); - break; - case T_FieldSelect: - return_value = _readFieldSelect(); - break; - case T_FieldStore: - return_value = _readFieldStore(); - break; - case T_RelabelType: - return_value = _readRelabelType(); - break; - case T_CoerceViaIO: - return_value = _readCoerceViaIO(); - break; - case T_ArrayCoerceExpr: - return_value = _readArrayCoerceExpr(); - break; - case T_ConvertRowtypeExpr: - return_value = _readConvertRowtypeExpr(); - break; - case T_CollateExpr: - return_value = _readCollateExpr(); - break; - case T_CaseExpr: - return_value = _readCaseExpr(); - break; - case T_CaseWhen: - return_value = _readCaseWhen(); - break; - case T_CaseTestExpr: - return_value = _readCaseTestExpr(); - break; - case T_ArrayExpr: - return_value = _readArrayExpr(); - break; - case T_A_ArrayExpr: - return_value = _readA_ArrayExpr(); - break; - case T_RowExpr: - return_value = _readRowExpr(); - break; - case T_RowCompareExpr: - return_value = _readRowCompareExpr(); - break; - case T_CoalesceExpr: - return_value = _readCoalesceExpr(); - break; - case T_MinMaxExpr: - return_value = _readMinMaxExpr(); - break; - case T_NullIfExpr: - return_value = _readNullIfExpr(); - break; - case T_NullTest: - return_value = _readNullTest(); - break; - case T_BooleanTest: - return_value = _readBooleanTest(); - break; - case T_SQLValueFunction: - return_value = _readSQLValueFunction(); - break; - case T_XmlExpr: - return_value = _readXmlExpr(); - break; - case T_CoerceToDomain: - return_value = _readCoerceToDomain(); - break; - case T_CoerceToDomainValue: - return_value = _readCoerceToDomainValue(); - break; - case T_SetToDefault: - return_value = _readSetToDefault(); - break; - case T_CurrentOfExpr: - return_value = _readCurrentOfExpr(); - break; - case T_NextValueExpr: - return_value = _readNextValueExpr(); - break; - case T_InferenceElem: - return_value = _readInferenceElem(); - break; - case T_TargetEntry: - return_value = _readTargetEntry(); - break; - case T_RangeTblRef: - return_value = _readRangeTblRef(); - break; - case T_RangeTblFunction: - return_value = _readRangeTblFunction(); - break; - case T_TableSampleClause: - return_value = _readTableSampleClause(); - break; - case T_JoinExpr: - return_value = _readJoinExpr(); - break; - case T_FromExpr: - return_value = _readFromExpr(); - break; - case T_OnConflictExpr: - return_value = _readOnConflictExpr(); - break; - case T_AppendRelInfo: - return_value = _readAppendRelInfo(); - break; - case T_GrantStmt: - return_value = _readGrantStmt(); - break; - case T_AccessPriv: - return_value = _readAccessPriv(); - break; - case T_ObjectWithArgs: - return_value = _readObjectWithArgs(); - break; - case T_GrantRoleStmt: - return_value = _readGrantRoleStmt(); - break; - case T_LockStmt: - return_value = _readLockStmt(); - break; - - case T_PartitionSpec: - return_value = _readPartitionSpec(); - break; - case T_PartitionElem: - return_value = _readPartitionElem(); - break; - case T_PartitionRangeDatum: - return_value = _readPartitionRangeDatum(); - break; - case T_PartitionCmd: - return_value = _readPartitionCmd(); - break; - case T_GpAlterPartitionId: - return_value = _readGpAlterPartitionId(); - break; - case T_DistributionKeyElem: - return_value = _readDistributionKeyElem(); - break; - case T_PartitionBoundSpec: - return_value = _readPartitionBoundSpec(); - break; - case T_RestrictInfo: - return_value = _readRestrictInfo(); - break; - case T_ExtensibleNode: - return_value = _readExtensibleNode(); - break; - case T_CreateStmt: - return_value = _readCreateStmt(); - break; - case T_CreateForeignTableStmt: - return_value = _readCreateForeignTableStmt(); - break; - case T_ColumnReferenceStorageDirective: - return_value = _readColumnReferenceStorageDirective(); - break; - case T_SegfileMapNode: - return_value = _readSegfileMapNode(); - break; - case T_ExtTableTypeDesc: - return_value = _readExtTableTypeDesc(); - break; - case T_CreateExternalStmt: - return_value = _readCreateExternalStmt(); - break; - case T_CreateExtensionStmt: - return_value = _readCreateExtensionStmt(); - break; - case T_IndexStmt: - return_value = _readIndexStmt(); - break; - case T_ReindexStmt: - return_value = _readReindexStmt(); - break; - case T_ReindexIndexInfo: - return_value = _readReindexIndexInfo(); - break; - - case T_ConstraintsSetStmt: - return_value = _readConstraintsSetStmt(); - break; - - case T_CreateFunctionStmt: - return_value = _readCreateFunctionStmt(); - break; - case T_FunctionParameter: - return_value = _readFunctionParameter(); - break; - case T_AlterFunctionStmt: - return_value = _readAlterFunctionStmt(); - break; - - case T_DefineStmt: - return_value = _readDefineStmt(); - break; - - case T_CompositeTypeStmt: - return_value = _readCompositeTypeStmt(); - break; - case T_CreateEnumStmt: - return_value = _readCreateEnumStmt(); - break; - case T_CreateRangeStmt: - return_value = _readCreateRangeStmt(); - break; - case T_AlterEnumStmt: - return_value = _readAlterEnumStmt(); - break; - case T_CreateCastStmt: - return_value = _readCreateCastStmt(); - break; - case T_CreateOpClassStmt: - return_value = _readCreateOpClassStmt(); - break; - case T_CreateOpClassItem: - return_value = _readCreateOpClassItem(); - break; - case T_CreateOpFamilyStmt: - return_value = _readCreateOpFamilyStmt(); - break; - case T_CreateStatsStmt: - return_value = _readCreateStatsStmt(); - break; - case T_AlterOpFamilyStmt: - return_value = _readAlterOpFamilyStmt(); - break; - case T_CreateConversionStmt: - return_value = _readCreateConversionStmt(); - break; - case T_ViewStmt: - return_value = _readViewStmt(); - break; - case T_RuleStmt: - return_value = _readRuleStmt(); - break; - case T_DropStmt: - return_value = _readDropStmt(); - break; - - case T_DropOwnedStmt: - return_value = _readDropOwnedStmt(); - break; - case T_ReassignOwnedStmt: - return_value = _readReassignOwnedStmt(); - break; - - case T_TruncateStmt: - return_value = _readTruncateStmt(); - break; - - case T_ReplicaIdentityStmt: - return_value = _readReplicaIdentityStmt(); - break; - case T_AlterTableStmt: - return_value = _readAlterTableStmt(); - break; - case T_AlterTableCmd: - return_value = _readAlterTableCmd(); - break; - case T_AlteredTableInfo: - return_value = _readAlteredTableInfo(); - break; - case T_NewConstraint: - return_value = _readNewConstraint(); - break; - case T_NewColumnValue: - return_value = _readNewColumnValue(); - break; - - case T_CreateRoleStmt: - return_value = _readCreateRoleStmt(); - break; - case T_DropRoleStmt: - return_value = _readDropRoleStmt(); - break; - case T_AlterRoleStmt: - return_value = _readAlterRoleStmt(); - break; - case T_AlterRoleSetStmt: - return_value = _readAlterRoleSetStmt(); - break; - - case T_CreateProfileStmt: - return_value = _readCreateProfileStmt(); - break; - case T_AlterProfileStmt: - return_value = _readAlterProfileStmt(); - break; - case T_DropProfileStmt: - return_value = _readDropProfileStmt(); - break; - - case T_AlterObjectDependsStmt: - return_value = _readAlterObjectDependsStmt(); - break; - - case T_AlterSystemStmt: - return_value = _readAlterSystemStmt(); - break; - - case T_AlterObjectSchemaStmt: - return_value = _readAlterObjectSchemaStmt(); - break; - - case T_AlterOwnerStmt: - return_value = _readAlterOwnerStmt(); - break; - - case T_RenameStmt: - return_value = _readRenameStmt(); - break; - - case T_CreateSeqStmt: - return_value = _readCreateSeqStmt(); - break; - case T_AlterSeqStmt: - return_value = _readAlterSeqStmt(); - break; - case T_ClusterStmt: - return_value = _readClusterStmt(); - break; - case T_CreatedbStmt: - return_value = _readCreatedbStmt(); - break; - case T_DropdbStmt: - return_value = _readDropdbStmt(); - break; - case T_CreateDomainStmt: - return_value = _readCreateDomainStmt(); - break; - case T_AlterDomainStmt: - return_value = _readAlterDomainStmt(); - break; - case T_AlterDefaultPrivilegesStmt: - return_value = _readAlterDefaultPrivilegesStmt(); - break; - - case T_NotifyStmt: - return_value = _readNotifyStmt(); - break; - case T_DeclareCursorStmt: - return_value = _readDeclareCursorStmt(); - break; - - case T_SingleRowErrorDesc: - return_value = _readSingleRowErrorDesc(); - break; - case T_CopyStmt: - return_value = _readCopyStmt(); - break; - case T_SelectStmt: - return_value = _readSelectStmt(); - break; - case T_InsertStmt: - return_value = _readInsertStmt(); - break; - case T_DeleteStmt: - return_value = _readDeleteStmt(); - break; - case T_UpdateStmt: - return_value = _readUpdateStmt(); - break; - case T_ColumnDef: - return_value = _readColumnDef(); - break; - case T_TypeName: - return_value = _readTypeName(); - break; - case T_SortBy: - return_value = _readSortBy(); - break; - case T_TypeCast: - return_value = _readTypeCast(); - break; - case T_CollateClause: - return_value = _readCollateClause(); - break; - case T_IndexElem: - return_value = _readIndexElem(); - break; - case T_Query: - return_value = _readQuery(); - break; - case T_WithCheckOption: - return_value = _readWithCheckOption(); - break; - case T_SortGroupClause: - return_value = _readSortGroupClause(); - break; - case T_DMLActionExpr: - return_value = _readDMLActionExpr(); - break; - case T_GroupingSet: - return_value = _readGroupingSet(); - break; - case T_WindowClause: - return_value = _readWindowClause(); - break; - case T_RowMarkClause: - return_value = _readRowMarkClause(); - break; - case T_CTESearchClause: - return_value = _readCTESearchClause(); - break; - case T_CTECycleClause: - return_value = _readCTECycleClause(); - break; - case T_WithClause: - return_value = _readWithClause(); - break; - case T_CommonTableExpr: - return_value = _readCommonTableExpr(); - break; - case T_RoleSpec: - return_value = _readRoleSpec(); - break; - case T_SetOperationStmt: - return_value = _readSetOperationStmt(); - break; - case T_RangeTblEntry: - return_value = _readRangeTblEntry(); - break; - case T_A_Expr: - return_value = _readAExpr(); - break; - case T_ColumnRef: - return_value = _readColumnRef(); - break; - case T_ParamRef: - return_value = _readParamRef(); - break; - case T_Integer: - return_value = _readInteger(); - break; - case T_Boolean: - return_value = _readBoolean(); - break; - case T_Float: - return_value = _readFloat(); - break; - case T_String: - return_value = _readString(); - break; - case T_BitString: - return_value = _readBitString(); - break; - case T_A_Const: - return_value = _readAConst(); - break; - case T_A_Star: - return_value = _readA_Star(); - break; - case T_A_Indices: - return_value = _readA_Indices(); - break; - case T_A_Indirection: - return_value = _readA_Indirection(); - break; - case T_ResTarget: - return_value = _readResTarget(); - break; - case T_MultiAssignRef: - return_value = _readMultiAssignRef(); - break; - case T_Constraint: - return_value = _readConstraint(); - break; - case T_FuncCall: - return_value = _readFuncCall(); - break; - case T_DefElem: - return_value = _readDefElem(); - break; - case T_CreateSchemaStmt: - return_value = _readCreateSchemaStmt(); - break; - case T_AlterSchemaStmt: - return_value = _readAlterSchemaStmt(); - break; - case T_CreateTagStmt: - return_value = _readCreateTagStmt(); - break; - case T_AlterTagStmt: - return_value = _readAlterTagStmt(); - break; - case T_DropTagStmt: - return_value = _readDropTagStmt(); - break; - case T_CreatePLangStmt: - return_value = _readCreatePLangStmt(); - break; - case T_VacuumStmt: - return_value = _readVacuumStmt(); - break; - case T_VacuumRelation: - return_value = _readVacuumRelation(); - break; - case T_CdbProcess: - return_value = _readCdbProcess(); - break; - case T_SliceTable: - return_value = _readSliceTable(); - break; - case T_CursorPosInfo: - return_value = _readCursorPosInfo(); - break; - case T_VariableSetStmt: - return_value = _readVariableSetStmt(); - break; - case T_CreateTrigStmt: - return_value = _readCreateTrigStmt(); - break; - case T_TriggerTransition: - return_value = _readTriggerTransition(); - break; - - case T_CreateTableSpaceStmt: - return_value = _readCreateTableSpaceStmt(); - break; - case T_AlterTableSpaceOptionsStmt: - return_value = _readAlterTableSpaceOptionsStmt(); - break; - case T_DropTableSpaceStmt: - return_value = _readDropTableSpaceStmt(); - break; - - case T_CreateQueueStmt: - return_value = _readCreateQueueStmt(); - break; - case T_AlterQueueStmt: - return_value = _readAlterQueueStmt(); - break; - case T_DropQueueStmt: - return_value = _readDropQueueStmt(); - break; - - case T_CreateResourceGroupStmt: - return_value = _readCreateResourceGroupStmt(); - break; - case T_DropResourceGroupStmt: - return_value = _readDropResourceGroupStmt(); - break; - case T_AlterResourceGroupStmt: - return_value = _readAlterResourceGroupStmt(); - break; - - case T_CommentStmt: - return_value = _readCommentStmt(); - break; - case T_DenyLoginInterval: - return_value = _readDenyLoginInterval(); - break; - case T_DenyLoginPoint: - return_value = _readDenyLoginPoint(); - break; - - case T_TableValueExpr: - return_value = _readTableValueExpr(); - break; - - case T_AlterTypeStmt: - return_value = _readAlterTypeStmt(); - break; - case T_AlterExtensionStmt: - return_value = _readAlterExtensionStmt(); - break; - case T_AlterExtensionContentsStmt: - return_value = _readAlterExtensionContentsStmt(); - break; - - case T_TupleDescNode: - return_value = _readTupleDescNode(); - break; - case T_SerializedParams: - return_value = _readSerializedParams(); - break; - - case T_AlterTSConfigurationStmt: - return_value = _readAlterTSConfigurationStmt(); - break; - case T_AlterTSDictionaryStmt: - return_value = _readAlterTSDictionaryStmt(); - break; - - case T_CookedConstraint: - return_value = _readCookedConstraint(); - break; - - case T_DropUserMappingStmt: - return_value = _readDropUserMappingStmt(); - break; - case T_AlterUserMappingStmt: - return_value = _readAlterUserMappingStmt(); - break; - case T_CreateUserMappingStmt: - return_value = _readCreateUserMappingStmt(); - break; - case T_CreateStorageUserMappingStmt: - return_value = _readCreateStorageUserMappingStmt(); - break; - case T_AlterStorageUserMappingStmt: - return_value = _readAlterStorageUserMappingStmt(); - break; - case T_DropStorageUserMappingStmt: - return_value = _readDropStorageUserMappingStmt(); - break; - case T_AlterForeignServerStmt: - return_value = _readAlterForeignServerStmt(); - break; - case T_CreateForeignServerStmt: - return_value = _readCreateForeignServerStmt(); - break; - case T_AddForeignSegStmt: - return_value = _readAddForeignSegStmt(); - break; - case T_AlterFdwStmt: - return_value = _readAlterFdwStmt(); - break; - case T_CreateStorageServerStmt: - return_value = _readCreateStorageServerStmt(); - break; - case T_AlterStorageServerStmt: - return_value = _readAlterStorageServerStmt(); - break; - case T_DropStorageServerStmt: - return_value = _readDropStorageServerStmt(); - break; - case T_CreateFdwStmt: - return_value = _readCreateFdwStmt(); - break; - case T_ModifyTable: - return_value = _readModifyTable(); - break; - case T_LockRows: - return_value = _readLockRows(); - break; - case T_GpPolicy: - return_value = _readGpPolicy(); - break; - case T_DistributedBy: - return_value = _readDistributedBy(); - break; - case T_ImportForeignSchemaStmt: - return_value = _readImportForeignSchemaStmt(); - break; - case T_AlterTableMoveAllStmt: - return_value = _readAlterTableMoveAllStmt(); - break; - - case T_CreatePublicationStmt: - return_value = _readCreatePublicationStmt(); - break; - case T_AlterPublicationStmt: - return_value = _readAlterPublicationStmt(); - break; - case T_CreateSubscriptionStmt: - return_value = _readCreateSubscriptionStmt(); - break; - case T_DropSubscriptionStmt: - return_value = _readDropSubscriptionStmt(); - break; - case T_AlterSubscriptionStmt: - return_value = _readAlterSubscriptionStmt(); - break; - - case T_CreatePolicyStmt: - return_value = _readCreatePolicyStmt(); - break; - case T_AlterPolicyStmt: - return_value = _readAlterPolicyStmt(); - break; - case T_CreateTransformStmt: - return_value = _readCreateTransformStmt(); - break; - case T_CreateAmStmt: - return_value = _readCreateAmStmt(); - break; - case T_LockingClause: - return_value = _readLockingClause(); - break; - case T_AggExprId: - return_value = _readAggExprId(); - break; - case T_RowIdExpr: - return_value = _readRowIdExpr(); - break; - case T_GpDropPartitionCmd: - return_value = _readGpDropPartitionCmd(); - break; - case T_GpPartitionRangeSpec: - return_value = _readGpPartitionRangeSpec(); - break; - case T_GpPartitionRangeItem: - return_value = _readGpPartitionRangeItem(); - break; - case T_GpPartitionListSpec: - return_value = _readGpPartitionListSpec(); - break; - case T_GpAlterPartitionCmd: - return_value = _readGpAlterPartitionCmd(); - break; - case T_GpPartitionDefinition: - return_value = _readGpPartitionDefinition(); - break; - case T_GpSplitPartitionCmd: - return_value = _readGpSplitPartitionCmd(); - break; - case T_ReturnStmt: - return_value = _readReturnStmt(); - break; - case T_StatsElem: - return_value = _readStatsElem(); - break; - case T_EphemeralNamedRelationInfo: - return_value = _readEphemeralNamedRelationInfo(); - break; - case T_AlterDatabaseStmt: - return_value = _readAlterDatabaseStmt(); - break; - case T_CreateDirectoryTableStmt: - return_value = _readCreateDirectoryTableStmt(); - break; - case T_AlterDirectoryTableStmt: - return_value = _readAlterDirectoryTableStmt(); - break; - case T_DropDirectoryTableStmt: - return_value = _readDropDirectoryTableStmt(); - break; - case T_CreateTaskStmt: - return_value = _readCreateTaskStmt(); - break; - case T_AlterTaskStmt: - return_value = _readAlterTaskStmt(); - break; - case T_DropTaskStmt: - return_value = _readDropTaskStmt(); - break; - case T_RTEPermissionInfo: - return_value = _readRTEPermissionInfo(); - break; - case T_MergeAction: - return_value = _readMergeAction(); - break; - case T_PublicationObjSpec: - return_value = _readPublicationObjSpec(); - break; - case T_PublicationTable: - return_value = _readPublicationTable(); - break; - case T_WindowDef: - return_value = _readWindowDef(); - break; - case T_JsonConstructorExpr: - return_value = _readJsonConstructorExpr(); - break; - case T_JsonIsPredicate: - return_value = _readJsonIsPredicate(); - break; - case T_JsonReturning: - return_value = _readJsonReturning(); - break; - case T_JsonValueExpr: - return_value = _readJsonValueExpr(); - break; - case T_JsonFormat: - return_value = _readJsonFormat(); - break; - case T_PlaceHolderVar: - return_value = _readPlaceHolderVar(); - break; - default: - return_value = NULL; /* keep the compiler silent */ - elog(ERROR, "could not deserialize unrecognized node type: %d", - (int) nt); - break; + default: + return_value = NULL; /* keep the compiler silent */ + elog(ERROR, "could not deserialize unrecognized node type: %d", + (int) nt); + break; } return (Node *)return_value; diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 59612527a32..7f93c8e8e76 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -13,25 +13,12 @@ * src/backend/nodes/readfuncs.c * * NOTES - * Path nodes do not have any readfuncs support, because we never - * have occasion to read them in. (There was once code here that - * claimed to read them, but it was broken as well as unused.) We - * never read executor state trees, either. - * - * But due to the use of this routine in older version of CDB/MPP/GPDB, - * there are routines that do read those types of nodes (unlike PostgreSQL) - * Those routines never actually get called. - * - * We could go back and remove them, but they don't hurt anything. - * - * The purpose of these routines is to read serialized trees that were stored - * in the catalog, and reconstruct the trees. - * * Parse location fields are written out by outfuncs.c, but only for * debugging use. When reading a location field, we normally discard * the stored value and set the location field to -1 (ie, "unknown"). * This is because nodes coming from a stored rule should not be thought * to have a known location in the current query's text. + * * However, if restore_location_fields is true, we do restore location * fields from the string. This is currently intended only for use by the * WRITE_READ_PARSE_PLAN_TREES test code, which doesn't want to cause @@ -43,24 +30,12 @@ #include -#include "fmgr.h" #include "miscadmin.h" -#include "nodes/extensible.h" -#include "nodes/parsenodes.h" -#include "nodes/plannodes.h" -#include "nodes/readfuncs.h" -#include "utils/builtins.h" - -#include "cdb/cdbgang.h" +#include "executor/execdesc.h" #include "nodes/altertablenodes.h" +#include "nodes/bitmapset.h" +#include "nodes/readfuncs.h" -/* - * readfuncs.c is compiled normally into readfuncs.o, but it's also - * #included from readfast.c. When #included, readfuncs.c defines - * COMPILING_BINARY_FUNCS, and provides replacements READ_* macros. See - * comments at top of readfast.c. - */ -#ifndef COMPILING_BINARY_FUNCS /* * Macros to simplify reading of different kinds of fields. Use these @@ -211,13 +186,20 @@ #define strtobool(x) ((*(x) == 't') ? true : false) -#define nullable_string(token,length) \ - ((length) == 0 ? NULL : debackslash(token, length)) - +static char * +nullable_string(const char *token, int length) +{ + /* outToken emits <> for NULL, and pg_strtok makes that an empty string */ + if (length == 0) + return NULL; + /* outToken emits "" for empty string */ + if (length == 2 && token[0] == '"' && token[1] == '"') + return pstrdup(""); + /* otherwise, we must remove protective backslashes added by outToken */ + return debackslash(token, length); +} -#endif /* COMPILING_BINARY_FUNCS */ -#ifndef COMPILING_BINARY_FUNCS /* * _readBitmapset */ @@ -260,7 +242,8 @@ _readBitmapset(void) } /* - * for use by extensions which define extensible nodes + * We export this function for use by extensions that define extensible nodes. + * That's somewhat historical, though, because calling nodeRead() will work. */ Bitmapset * readBitmapset(void) @@ -268,341 +251,14 @@ readBitmapset(void) return _readBitmapset(); } -/* - * _readQuery - */ -static Query * -_readQuery(void) -{ - READ_LOCALS(Query); - - READ_ENUM_FIELD(commandType, CmdType); - READ_ENUM_FIELD(querySource, QuerySource); - local_node->queryId = UINT64CONST(0); /* not saved in output format */ - READ_BOOL_FIELD(canSetTag); - READ_NODE_FIELD(utilityStmt); - READ_INT_FIELD(resultRelation); - READ_BOOL_FIELD(hasAggs); - READ_BOOL_FIELD(hasWindowFuncs); - READ_BOOL_FIELD(hasTargetSRFs); - READ_BOOL_FIELD(hasSubLinks); - READ_BOOL_FIELD(hasDynamicFunctions); - READ_BOOL_FIELD(hasFuncsWithExecRestrictions); - READ_BOOL_FIELD(hasDistinctOn); - READ_BOOL_FIELD(hasRecursive); - READ_BOOL_FIELD(hasModifyingCTE); - READ_BOOL_FIELD(hasForUpdate); - READ_BOOL_FIELD(hasRowSecurity); - READ_BOOL_FIELD(canOptSelectLockingClause); - READ_BOOL_FIELD(isReturn); - READ_NODE_FIELD(cteList); - READ_NODE_FIELD(rtable); - READ_NODE_FIELD(rteperminfos); - READ_NODE_FIELD(jointree); - READ_NODE_FIELD(mergeActionList); - READ_BOOL_FIELD(mergeUseOuterJoin); - READ_NODE_FIELD(targetList); - READ_ENUM_FIELD(override, OverridingKind); - READ_NODE_FIELD(onConflict); - READ_NODE_FIELD(returningList); - READ_NODE_FIELD(groupClause); - READ_BOOL_FIELD(groupDistinct); - READ_NODE_FIELD(groupingSets); - READ_NODE_FIELD(havingQual); - READ_NODE_FIELD(windowClause); - READ_NODE_FIELD(distinctClause); - READ_NODE_FIELD(sortClause); - READ_NODE_FIELD(scatterClause); - READ_BOOL_FIELD(isTableValueSelect); - READ_NODE_FIELD(limitOffset); - READ_NODE_FIELD(limitCount); - READ_ENUM_FIELD(limitOption, LimitOption); - READ_NODE_FIELD(rowMarks); - READ_NODE_FIELD(setOperations); - READ_NODE_FIELD(constraintDeps); - READ_NODE_FIELD(withCheckOptions); - local_node->intoPolicy = NULL; - READ_BOOL_FIELD(parentStmtType); - READ_LOCATION_FIELD(stmt_location); - READ_INT_FIELD(stmt_len); - - READ_DONE(); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/* - * _readNotifyStmt - */ -static NotifyStmt * -_readNotifyStmt(void) -{ - READ_LOCALS(NotifyStmt); - - READ_STRING_FIELD(conditionname); - READ_STRING_FIELD(payload); - - READ_DONE(); -} - -/* - * _readDeclareCursorStmt - */ -static DeclareCursorStmt * -_readDeclareCursorStmt(void) -{ - READ_LOCALS(DeclareCursorStmt); - - READ_STRING_FIELD(portalname); - READ_INT_FIELD(options); - READ_NODE_FIELD(query); - - READ_DONE(); -} - -/* - * _readWithCheckOption - */ -static WithCheckOption * -_readWithCheckOption(void) -{ - READ_LOCALS(WithCheckOption); - - READ_ENUM_FIELD(kind, WCOKind); - READ_STRING_FIELD(relname); - READ_STRING_FIELD(polname); - READ_NODE_FIELD(qual); - READ_BOOL_FIELD(cascaded); - - READ_DONE(); -} - -/* - * _readSortGroupClause - */ -static SortGroupClause * -_readSortGroupClause(void) -{ - READ_LOCALS(SortGroupClause); - - READ_UINT_FIELD(tleSortGroupRef); - READ_OID_FIELD(eqop); - READ_OID_FIELD(sortop); - READ_BOOL_FIELD(nulls_first); - READ_BOOL_FIELD(hashable); - - READ_DONE(); -} - -/* - * _readGroupingSet - */ -static GroupingSet * -_readGroupingSet(void) -{ - READ_LOCALS(GroupingSet); - - READ_ENUM_FIELD(kind, GroupingSetKind); - READ_NODE_FIELD(content); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readWindowClause - */ -static WindowClause * -_readWindowClause(void) -{ - READ_LOCALS(WindowClause); - - READ_STRING_FIELD(name); - READ_STRING_FIELD(refname); - READ_NODE_FIELD(partitionClause); - READ_NODE_FIELD(orderClause); - READ_INT_FIELD(frameOptions); - READ_NODE_FIELD(startOffset); - READ_NODE_FIELD(endOffset); - READ_OID_FIELD(startInRangeFunc); - READ_OID_FIELD(endInRangeFunc); - READ_OID_FIELD(inRangeColl); - READ_BOOL_FIELD(inRangeAsc); - READ_BOOL_FIELD(inRangeNullsFirst); - READ_UINT_FIELD(winref); - READ_BOOL_FIELD(copiedOrder); - - READ_DONE(); -} - -/* - * _readRowMarkClause - */ -static RowMarkClause * -_readRowMarkClause(void) -{ - READ_LOCALS(RowMarkClause); - - READ_UINT_FIELD(rti); - READ_ENUM_FIELD(strength, LockClauseStrength); - READ_ENUM_FIELD(waitPolicy, LockWaitPolicy); - READ_BOOL_FIELD(pushedDown); - - READ_DONE(); -} - -/* - * _readCommonTableExpr - */ -static CommonTableExpr * -_readCommonTableExpr(void) -{ - READ_LOCALS(CommonTableExpr); - - READ_STRING_FIELD(ctename); - READ_NODE_FIELD(aliascolnames); - READ_ENUM_FIELD(ctematerialized, CTEMaterialize); - READ_NODE_FIELD(ctequery); - READ_NODE_FIELD(search_clause); - READ_NODE_FIELD(cycle_clause); - READ_LOCATION_FIELD(location); - READ_BOOL_FIELD(cterecursive); - READ_INT_FIELD(cterefcount); - READ_NODE_FIELD(ctecolnames); - READ_NODE_FIELD(ctecoltypes); - READ_NODE_FIELD(ctecoltypmods); - READ_NODE_FIELD(ctecolcollations); - - READ_DONE(); -} - -/* - * _readSetOperationStmt - */ -static SetOperationStmt * -_readSetOperationStmt(void) -{ - READ_LOCALS(SetOperationStmt); - - READ_ENUM_FIELD(op, SetOperation); - READ_BOOL_FIELD(all); - READ_NODE_FIELD(larg); - READ_NODE_FIELD(rarg); - READ_NODE_FIELD(colTypes); - READ_NODE_FIELD(colTypmods); - READ_NODE_FIELD(colCollations); - READ_NODE_FIELD(groupClauses); - - READ_DONE(); -} - - -/* - * Stuff from primnodes.h. - */ - -static Alias * -_readAlias(void) -{ - READ_LOCALS(Alias); - - READ_STRING_FIELD(aliasname); - READ_NODE_FIELD(colnames); - - READ_DONE(); -} - -static RangeVar * -_readRangeVar(void) -{ - READ_LOCALS(RangeVar); - - local_node->catalogname = NULL; /* not currently saved in output format */ - - READ_STRING_FIELD(catalogname); - READ_STRING_FIELD(schemaname); - READ_STRING_FIELD(relname); - READ_BOOL_FIELD(inh); - READ_CHAR_FIELD(relpersistence); - READ_NODE_FIELD(alias); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readTableFunc - */ -static TableFunc * -_readTableFunc(void) -{ - READ_LOCALS(TableFunc); - - READ_NODE_FIELD(ns_uris); - READ_NODE_FIELD(ns_names); - READ_NODE_FIELD(docexpr); - READ_NODE_FIELD(rowexpr); - READ_NODE_FIELD(colnames); - READ_NODE_FIELD(coltypes); - READ_NODE_FIELD(coltypmods); - READ_NODE_FIELD(colcollations); - READ_NODE_FIELD(colexprs); - READ_NODE_FIELD(coldefexprs); - READ_BITMAPSET_FIELD(notnulls); - READ_INT_FIELD(ordinalitycol); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static IntoClause * -_readIntoClause(void) -{ - READ_LOCALS(IntoClause); - - READ_NODE_FIELD(rel); - READ_NODE_FIELD(colNames); - READ_STRING_FIELD(accessMethod); - READ_NODE_FIELD(options); - READ_ENUM_FIELD(onCommit, OnCommitAction); - READ_STRING_FIELD(tableSpaceName); - READ_NODE_FIELD(viewQuery); - READ_BOOL_FIELD(skipData); - READ_NODE_FIELD(distributedBy); - READ_BOOL_FIELD(ivm); - READ_OID_FIELD(matviewOid); - READ_STRING_FIELD(enrname); - READ_BOOL_FIELD(dynamicTbl); - READ_STRING_FIELD(schedule); +#include "readfuncs.funcs.c" - READ_DONE(); -} /* - * _readVar + * Support functions for nodes with custom_read_write attribute or + * special_read_write attribute */ -static Var * -_readVar(void) -{ - READ_LOCALS(Var); - - READ_UINT_FIELD(varno); - READ_INT_FIELD(varattno); - READ_OID_FIELD(vartype); - READ_INT_FIELD(vartypmod); - READ_OID_FIELD(varcollid); - READ_BITMAPSET_FIELD(varnullingrels); - READ_UINT_FIELD(varlevelsup); - READ_UINT_FIELD(varnosyn); - READ_INT_FIELD(varattnosyn); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} -#ifndef COMPILING_BINARY_FUNCS -/* - * _readConst - */ static Const * _readConst(void) { @@ -624,2253 +280,396 @@ _readConst(void) READ_DONE(); } -#endif /* COMPILING_BINARY_FUNCS */ -/* - * _readParam - */ -static Param * -_readParam(void) +static BoolExpr * +_readBoolExpr(void) { - READ_LOCALS(Param); - - READ_ENUM_FIELD(paramkind, ParamKind); - READ_INT_FIELD(paramid); - READ_OID_FIELD(paramtype); - READ_INT_FIELD(paramtypmod); - READ_OID_FIELD(paramcollid); - READ_LOCATION_FIELD(location); + READ_LOCALS(BoolExpr); - READ_DONE(); -} + /* do-it-yourself enum representation */ + token = pg_strtok(&length); /* skip :boolop */ + token = pg_strtok(&length); /* get field value */ + if (length == 3 && strncmp(token, "and", 3) == 0) + local_node->boolop = AND_EXPR; + else if (length == 2 && strncmp(token, "or", 2) == 0) + local_node->boolop = OR_EXPR; + else if (length == 3 && strncmp(token, "not", 3) == 0) + local_node->boolop = NOT_EXPR; + else + elog(ERROR, "unrecognized boolop \"%.*s\"", length, token); -/* - * _readAggref - */ -static Aggref * -_readAggref(void) -{ - READ_LOCALS(Aggref); - - READ_OID_FIELD(aggfnoid); - READ_OID_FIELD(aggtype); - READ_OID_FIELD(aggcollid); - READ_OID_FIELD(inputcollid); - READ_OID_FIELD(aggtranstype); - READ_NODE_FIELD(aggargtypes); - READ_NODE_FIELD(aggdirectargs); READ_NODE_FIELD(args); - READ_NODE_FIELD(aggorder); - READ_NODE_FIELD(aggdistinct); - READ_NODE_FIELD(aggfilter); - READ_BOOL_FIELD(aggstar); - READ_BOOL_FIELD(aggvariadic); - READ_CHAR_FIELD(aggkind); - READ_UINT_FIELD(agglevelsup); - READ_ENUM_FIELD(aggsplit, AggSplit); - READ_INT_FIELD(aggno); - READ_INT_FIELD(aggtransno); READ_LOCATION_FIELD(location); - READ_INT_FIELD(agg_expr_id); READ_DONE(); } -/* - * _readGroupingFunc - */ -static GroupingFunc * -_readGroupingFunc(void) +static A_Const * +_readA_Const(void) { - READ_LOCALS(GroupingFunc); - - READ_NODE_FIELD(args); - READ_NODE_FIELD(refs); - READ_NODE_FIELD(cols); - READ_UINT_FIELD(agglevelsup); - READ_LOCATION_FIELD(location); + READ_LOCALS(A_Const); - READ_DONE(); -} + /* We expect either NULL or :val here */ + token = pg_strtok(&length); + if (length == 4 && strncmp(token, "NULL", 4) == 0) + local_node->isnull = true; + else + { + union ValUnion *tmp = nodeRead(NULL, 0); -/* - * _readWindowFunc - */ -static WindowFunc * -_readWindowFunc(void) -{ - READ_LOCALS(WindowFunc); + /* To forestall valgrind complaints, copy only the valid data */ + switch (nodeTag(tmp)) + { + case T_Integer: + memcpy(&local_node->val, tmp, sizeof(Integer)); + break; + case T_Float: + memcpy(&local_node->val, tmp, sizeof(Float)); + break; + case T_Boolean: + memcpy(&local_node->val, tmp, sizeof(Boolean)); + break; + case T_String: + memcpy(&local_node->val, tmp, sizeof(String)); + break; + case T_BitString: + memcpy(&local_node->val, tmp, sizeof(BitString)); + break; + default: + elog(ERROR, "unrecognized node type: %d", + (int) nodeTag(tmp)); + break; + } + } - READ_OID_FIELD(winfnoid); - READ_OID_FIELD(wintype); - READ_OID_FIELD(wincollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_NODE_FIELD(aggfilter); - READ_UINT_FIELD(winref); - READ_BOOL_FIELD(winstar); - READ_BOOL_FIELD(winagg); - READ_BOOL_FIELD(windistinct); READ_LOCATION_FIELD(location); READ_DONE(); } /* - * _readSubscriptingRef + * _readConstraint */ -static SubscriptingRef * -_readSubscriptingRef(void) +static Constraint * +_readConstraint(void) { - READ_LOCALS(SubscriptingRef); - - READ_OID_FIELD(refcontainertype); - READ_OID_FIELD(refelemtype); - READ_OID_FIELD(refrestype); - READ_INT_FIELD(reftypmod); - READ_OID_FIELD(refcollid); - READ_NODE_FIELD(refupperindexpr); - READ_NODE_FIELD(reflowerindexpr); - READ_NODE_FIELD(refexpr); - READ_NODE_FIELD(refassgnexpr); + READ_LOCALS(Constraint); - READ_DONE(); -} - -/* - * _readFuncExpr - */ -static FuncExpr * -_readFuncExpr(void) -{ - READ_LOCALS(FuncExpr); - - READ_OID_FIELD(funcid); - READ_OID_FIELD(funcresulttype); - READ_BOOL_FIELD(funcretset); - READ_BOOL_FIELD(funcvariadic); - READ_ENUM_FIELD(funcformat, CoercionForm); - READ_OID_FIELD(funccollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); + READ_STRING_FIELD(conname); + READ_BOOL_FIELD(deferrable); + READ_BOOL_FIELD(initdeferred); READ_LOCATION_FIELD(location); - READ_BOOL_FIELD(is_tablefunc); /* GPDB */ - READ_DONE(); -} -/* - * _readNamedArgExpr - */ -static NamedArgExpr * -_readNamedArgExpr(void) -{ - READ_LOCALS(NamedArgExpr); + token = pg_strtok(&length); /* skip :contype */ + token = pg_strtok(&length); /* get field value */ + if (length == 4 && strncmp(token, "NULL", 4) == 0) + local_node->contype = CONSTR_NULL; + else if (length == 8 && strncmp(token, "NOT_NULL", 8) == 0) + local_node->contype = CONSTR_NOTNULL; + else if (length == 7 && strncmp(token, "DEFAULT", 7) == 0) + local_node->contype = CONSTR_DEFAULT; + else if (length == 8 && strncmp(token, "IDENTITY", 8) == 0) + local_node->contype = CONSTR_IDENTITY; + else if (length == 9 && strncmp(token, "GENERATED", 9) == 0) + local_node->contype = CONSTR_GENERATED; + else if (length == 5 && strncmp(token, "CHECK", 5) == 0) + local_node->contype = CONSTR_CHECK; + else if (length == 11 && strncmp(token, "PRIMARY_KEY", 11) == 0) + local_node->contype = CONSTR_PRIMARY; + else if (length == 6 && strncmp(token, "UNIQUE", 6) == 0) + local_node->contype = CONSTR_UNIQUE; + else if (length == 9 && strncmp(token, "EXCLUSION", 9) == 0) + local_node->contype = CONSTR_EXCLUSION; + else if (length == 11 && strncmp(token, "FOREIGN_KEY", 11) == 0) + local_node->contype = CONSTR_FOREIGN; + else if (length == 15 && strncmp(token, "ATTR_DEFERRABLE", 15) == 0) + local_node->contype = CONSTR_ATTR_DEFERRABLE; + else if (length == 19 && strncmp(token, "ATTR_NOT_DEFERRABLE", 19) == 0) + local_node->contype = CONSTR_ATTR_NOT_DEFERRABLE; + else if (length == 13 && strncmp(token, "ATTR_DEFERRED", 13) == 0) + local_node->contype = CONSTR_ATTR_DEFERRED; + else if (length == 14 && strncmp(token, "ATTR_IMMEDIATE", 14) == 0) + local_node->contype = CONSTR_ATTR_IMMEDIATE; + + switch (local_node->contype) + { + case CONSTR_NULL: + case CONSTR_NOTNULL: + /* no extra fields */ + break; - READ_NODE_FIELD(arg); - READ_STRING_FIELD(name); - READ_INT_FIELD(argnumber); - READ_LOCATION_FIELD(location); + case CONSTR_DEFAULT: + READ_NODE_FIELD(raw_expr); + READ_STRING_FIELD(cooked_expr); + break; - READ_DONE(); -} + case CONSTR_IDENTITY: + READ_NODE_FIELD(options); + READ_CHAR_FIELD(generated_when); + break; -#ifndef COMPILING_BINARY_FUNCS -/* - * _readOpExpr - */ -static OpExpr * -_readOpExpr(void) -{ - READ_LOCALS(OpExpr); - - READ_OID_FIELD(opno); - READ_OID_FIELD(opfuncid); - READ_OID_FIELD(opresulttype); - READ_BOOL_FIELD(opretset); - READ_OID_FIELD(opcollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); + case CONSTR_GENERATED: + READ_NODE_FIELD(raw_expr); + READ_STRING_FIELD(cooked_expr); + READ_CHAR_FIELD(generated_when); + break; - READ_DONE(); -} -#endif /* COMPILING_BINARY_FUNCS */ + case CONSTR_CHECK: + READ_BOOL_FIELD(is_no_inherit); + READ_NODE_FIELD(raw_expr); + READ_STRING_FIELD(cooked_expr); + READ_BOOL_FIELD(skip_validation); + READ_BOOL_FIELD(initially_valid); + break; -/* - * _readDistinctExpr - */ -static DistinctExpr * -_readDistinctExpr(void) -{ - READ_LOCALS(DistinctExpr); - - READ_OID_FIELD(opno); - READ_OID_FIELD(opfuncid); - READ_OID_FIELD(opresulttype); - READ_BOOL_FIELD(opretset); - READ_OID_FIELD(opcollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); + case CONSTR_PRIMARY: + READ_NODE_FIELD(keys); + READ_NODE_FIELD(including); + READ_NODE_FIELD(options); + READ_STRING_FIELD(indexname); + READ_STRING_FIELD(indexspace); + READ_BOOL_FIELD(reset_default_tblspc); + /* access_method and where_clause not currently used */ + break; - READ_DONE(); -} + case CONSTR_UNIQUE: + READ_BOOL_FIELD(nulls_not_distinct); + READ_NODE_FIELD(keys); + READ_NODE_FIELD(including); + READ_NODE_FIELD(options); + READ_STRING_FIELD(indexname); + READ_STRING_FIELD(indexspace); + READ_BOOL_FIELD(reset_default_tblspc); + /* access_method and where_clause not currently used */ + break; -/* - * _readNullIfExpr - */ -static NullIfExpr * -_readNullIfExpr(void) -{ - READ_LOCALS(NullIfExpr); - - READ_OID_FIELD(opno); - READ_OID_FIELD(opfuncid); - READ_OID_FIELD(opresulttype); - READ_BOOL_FIELD(opretset); - READ_OID_FIELD(opcollid); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); + case CONSTR_EXCLUSION: + READ_NODE_FIELD(exclusions); + READ_NODE_FIELD(including); + READ_NODE_FIELD(options); + READ_STRING_FIELD(indexname); + READ_STRING_FIELD(indexspace); + READ_BOOL_FIELD(reset_default_tblspc); + READ_STRING_FIELD(access_method); + READ_NODE_FIELD(where_clause); + break; - READ_DONE(); -} + case CONSTR_FOREIGN: + READ_NODE_FIELD(pktable); + READ_NODE_FIELD(fk_attrs); + READ_NODE_FIELD(pk_attrs); + READ_CHAR_FIELD(fk_matchtype); + READ_CHAR_FIELD(fk_upd_action); + READ_CHAR_FIELD(fk_del_action); + READ_NODE_FIELD(fk_del_set_cols); + READ_NODE_FIELD(old_conpfeqop); + READ_OID_FIELD(old_pktable_oid); + READ_BOOL_FIELD(skip_validation); + READ_BOOL_FIELD(initially_valid); + break; -/* - * _readScalarArrayOpExpr - */ -static ScalarArrayOpExpr * -_readScalarArrayOpExpr(void) -{ - READ_LOCALS(ScalarArrayOpExpr); + case CONSTR_ATTR_DEFERRABLE: + case CONSTR_ATTR_NOT_DEFERRABLE: + case CONSTR_ATTR_DEFERRED: + case CONSTR_ATTR_IMMEDIATE: + /* no extra fields */ + break; - READ_OID_FIELD(opno); - READ_OID_FIELD(opfuncid); - READ_OID_FIELD(hashfuncid); - READ_BOOL_FIELD(useOr); - READ_OID_FIELD(inputcollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); + default: + elog(ERROR, "unrecognized ConstrType: %d", (int) local_node->contype); + break; + } READ_DONE(); } -#ifndef COMPILING_BINARY_FUNCS -/* - * _readBoolExpr - */ -static BoolExpr * -_readBoolExpr(void) +static RangeTblEntry * +_readRangeTblEntry(void) { - READ_LOCALS(BoolExpr); - - /* do-it-yourself enum representation */ - token = pg_strtok(&length); /* skip :boolop */ - token = pg_strtok(&length); /* get field value */ - if (strncmp(token, "and", 3) == 0) - local_node->boolop = AND_EXPR; - else if (strncmp(token, "or", 2) == 0) - local_node->boolop = OR_EXPR; - else if (strncmp(token, "not", 3) == 0) - local_node->boolop = NOT_EXPR; - else - elog(ERROR, "unrecognized boolop \"%.*s\"", length, token); + READ_LOCALS(RangeTblEntry); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/* - * _readSubLink - */ -static SubLink * -_readSubLink(void) -{ - READ_LOCALS(SubLink); - - READ_ENUM_FIELD(subLinkType, SubLinkType); - READ_INT_FIELD(subLinkId); - READ_NODE_FIELD(testexpr); - READ_NODE_FIELD(operName); - READ_NODE_FIELD(subselect); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readFieldSelect - */ -static FieldSelect * -_readFieldSelect(void) -{ - READ_LOCALS(FieldSelect); - - READ_NODE_FIELD(arg); - READ_INT_FIELD(fieldnum); - READ_OID_FIELD(resulttype); - READ_INT_FIELD(resulttypmod); - READ_OID_FIELD(resultcollid); - - READ_DONE(); -} - -/* - * _readFieldStore - */ -static FieldStore * -_readFieldStore(void) -{ - READ_LOCALS(FieldStore); - - READ_NODE_FIELD(arg); - READ_NODE_FIELD(newvals); - READ_NODE_FIELD(fieldnums); - READ_OID_FIELD(resulttype); - - READ_DONE(); -} - -/* - * _readRelabelType - */ -static RelabelType * -_readRelabelType(void) -{ - READ_LOCALS(RelabelType); - - READ_NODE_FIELD(arg); - READ_OID_FIELD(resulttype); - READ_INT_FIELD(resulttypmod); - READ_OID_FIELD(resultcollid); - READ_ENUM_FIELD(relabelformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCoerceViaIO - */ -static CoerceViaIO * -_readCoerceViaIO(void) -{ - READ_LOCALS(CoerceViaIO); - - READ_NODE_FIELD(arg); - READ_OID_FIELD(resulttype); - READ_OID_FIELD(resultcollid); - READ_ENUM_FIELD(coerceformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readArrayCoerceExpr - */ -static ArrayCoerceExpr * -_readArrayCoerceExpr(void) -{ - READ_LOCALS(ArrayCoerceExpr); - - READ_NODE_FIELD(arg); - READ_NODE_FIELD(elemexpr); - READ_OID_FIELD(resulttype); - READ_INT_FIELD(resulttypmod); - READ_OID_FIELD(resultcollid); - READ_ENUM_FIELD(coerceformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readConvertRowtypeExpr - */ -static ConvertRowtypeExpr * -_readConvertRowtypeExpr(void) -{ - READ_LOCALS(ConvertRowtypeExpr); - - READ_NODE_FIELD(arg); - READ_OID_FIELD(resulttype); - READ_ENUM_FIELD(convertformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCollateExpr - */ -static CollateExpr * -_readCollateExpr(void) -{ - READ_LOCALS(CollateExpr); - - READ_NODE_FIELD(arg); - READ_OID_FIELD(collOid); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCaseExpr - */ -static CaseExpr * -_readCaseExpr(void) -{ - READ_LOCALS(CaseExpr); - - READ_OID_FIELD(casetype); - READ_OID_FIELD(casecollid); - READ_NODE_FIELD(arg); - READ_NODE_FIELD(args); - READ_NODE_FIELD(defresult); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCaseWhen - */ -static CaseWhen * -_readCaseWhen(void) -{ - READ_LOCALS(CaseWhen); - - READ_NODE_FIELD(expr); - READ_NODE_FIELD(result); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCaseTestExpr - */ -static CaseTestExpr * -_readCaseTestExpr(void) -{ - READ_LOCALS(CaseTestExpr); - - READ_OID_FIELD(typeId); - READ_INT_FIELD(typeMod); - READ_OID_FIELD(collation); - - READ_DONE(); -} - -/* - * _readArrayExpr - */ -static ArrayExpr * -_readArrayExpr(void) -{ - READ_LOCALS(ArrayExpr); - - READ_OID_FIELD(array_typeid); - READ_OID_FIELD(array_collid); - READ_OID_FIELD(element_typeid); - READ_NODE_FIELD(elements); - READ_BOOL_FIELD(multidims); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readRowExpr - */ -static RowExpr * -_readRowExpr(void) -{ - READ_LOCALS(RowExpr); - - READ_NODE_FIELD(args); - READ_OID_FIELD(row_typeid); - READ_ENUM_FIELD(row_format, CoercionForm); - READ_NODE_FIELD(colnames); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readRowCompareExpr - */ -static RowCompareExpr * -_readRowCompareExpr(void) -{ - READ_LOCALS(RowCompareExpr); - - READ_ENUM_FIELD(rctype, RowCompareType); - READ_NODE_FIELD(opnos); - READ_NODE_FIELD(opfamilies); - READ_NODE_FIELD(inputcollids); - READ_NODE_FIELD(largs); - READ_NODE_FIELD(rargs); - - READ_DONE(); -} - -/* - * _readCoalesceExpr - */ -static CoalesceExpr * -_readCoalesceExpr(void) -{ - READ_LOCALS(CoalesceExpr); - - READ_OID_FIELD(coalescetype); - READ_OID_FIELD(coalescecollid); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readMinMaxExpr - */ -static MinMaxExpr * -_readMinMaxExpr(void) -{ - READ_LOCALS(MinMaxExpr); - - READ_OID_FIELD(minmaxtype); - READ_OID_FIELD(minmaxcollid); - READ_OID_FIELD(inputcollid); - READ_ENUM_FIELD(op, MinMaxOp); - READ_NODE_FIELD(args); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readSQLValueFunction - */ -static SQLValueFunction * -_readSQLValueFunction(void) -{ - READ_LOCALS(SQLValueFunction); - - READ_ENUM_FIELD(op, SQLValueFunctionOp); - READ_OID_FIELD(type); - READ_INT_FIELD(typmod); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readXmlExpr - */ -static XmlExpr * -_readXmlExpr(void) -{ - READ_LOCALS(XmlExpr); - - READ_ENUM_FIELD(op, XmlExprOp); - READ_STRING_FIELD(name); - READ_NODE_FIELD(named_args); - READ_NODE_FIELD(arg_names); - READ_NODE_FIELD(args); - READ_ENUM_FIELD(xmloption, XmlOptionType); - READ_OID_FIELD(type); - READ_INT_FIELD(typmod); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readNullTest - */ -static NullTest * -_readNullTest(void) -{ - READ_LOCALS(NullTest); - - READ_NODE_FIELD(arg); - READ_ENUM_FIELD(nulltesttype, NullTestType); - READ_BOOL_FIELD(argisrow); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readBooleanTest - */ -static BooleanTest * -_readBooleanTest(void) -{ - READ_LOCALS(BooleanTest); - - READ_NODE_FIELD(arg); - READ_ENUM_FIELD(booltesttype, BoolTestType); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCoerceToDomain - */ -static CoerceToDomain * -_readCoerceToDomain(void) -{ - READ_LOCALS(CoerceToDomain); - - READ_NODE_FIELD(arg); - READ_OID_FIELD(resulttype); - READ_INT_FIELD(resulttypmod); - READ_OID_FIELD(resultcollid); - READ_ENUM_FIELD(coercionformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCoerceToDomainValue - */ -static CoerceToDomainValue * -_readCoerceToDomainValue(void) -{ - READ_LOCALS(CoerceToDomainValue); - - READ_OID_FIELD(typeId); - READ_INT_FIELD(typeMod); - READ_OID_FIELD(collation); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readSetToDefault - */ -static SetToDefault * -_readSetToDefault(void) -{ - READ_LOCALS(SetToDefault); - - READ_OID_FIELD(typeId); - READ_INT_FIELD(typeMod); - READ_OID_FIELD(collation); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCurrentOfExpr - */ -static CurrentOfExpr * -_readCurrentOfExpr(void) -{ - READ_LOCALS(CurrentOfExpr); - - READ_UINT_FIELD(cvarno); - READ_STRING_FIELD(cursor_name); - READ_INT_FIELD(cursor_param); - READ_OID_FIELD(target_relid); - - READ_DONE(); -} - -/* - * _readNextValueExpr - */ -static NextValueExpr * -_readNextValueExpr(void) -{ - READ_LOCALS(NextValueExpr); - - READ_OID_FIELD(seqid); - READ_OID_FIELD(typeId); - - READ_DONE(); -} - -/* - * _readInferenceElem - */ -static InferenceElem * -_readInferenceElem(void) -{ - READ_LOCALS(InferenceElem); - - READ_NODE_FIELD(expr); - READ_OID_FIELD(infercollid); - READ_OID_FIELD(inferopclass); - - READ_DONE(); -} - -/* - * _readTargetEntry - */ -static TargetEntry * -_readTargetEntry(void) -{ - READ_LOCALS(TargetEntry); - - READ_NODE_FIELD(expr); - READ_INT_FIELD(resno); - READ_STRING_FIELD(resname); - READ_UINT_FIELD(ressortgroupref); - READ_OID_FIELD(resorigtbl); - READ_INT_FIELD(resorigcol); - READ_BOOL_FIELD(resjunk); - - READ_DONE(); -} - -/* - * _readRangeTblRef - */ -static RangeTblRef * -_readRangeTblRef(void) -{ - READ_LOCALS(RangeTblRef); - - READ_INT_FIELD(rtindex); - - READ_DONE(); -} - -/* - * _readJoinExpr - */ -static JoinExpr * -_readJoinExpr(void) -{ - READ_LOCALS(JoinExpr); - - READ_ENUM_FIELD(jointype, JoinType); - READ_BOOL_FIELD(isNatural); - READ_NODE_FIELD(larg); - READ_NODE_FIELD(rarg); - READ_NODE_FIELD(usingClause); - READ_NODE_FIELD(join_using_alias); - READ_NODE_FIELD(quals); - READ_NODE_FIELD(alias); - READ_INT_FIELD(rtindex); - - READ_DONE(); -} - -/* - * _readFromExpr - */ -static FromExpr * -_readFromExpr(void) -{ - READ_LOCALS(FromExpr); - - READ_NODE_FIELD(fromlist); - READ_NODE_FIELD(quals); - - READ_DONE(); -} - -/* - * _readOnConflictExpr - */ -static OnConflictExpr * -_readOnConflictExpr(void) -{ - READ_LOCALS(OnConflictExpr); - - READ_ENUM_FIELD(action, OnConflictAction); - READ_NODE_FIELD(arbiterElems); - READ_NODE_FIELD(arbiterWhere); - READ_OID_FIELD(constraint); - READ_NODE_FIELD(onConflictSet); - READ_NODE_FIELD(onConflictWhere); - READ_INT_FIELD(exclRelIndex); - READ_NODE_FIELD(exclRelTlist); - - READ_DONE(); -} - -/* - * Stuff from pathnodes.h. - * - * Mostly we don't need to read planner nodes back in again, but some - * of these also end up in plan trees. - */ - -/* - * _readAppendRelInfo - */ -static AppendRelInfo * -_readAppendRelInfo(void) -{ - READ_LOCALS(AppendRelInfo); - - READ_UINT_FIELD(parent_relid); - READ_UINT_FIELD(child_relid); - READ_OID_FIELD(parent_reltype); - READ_OID_FIELD(child_reltype); - READ_NODE_FIELD(translated_vars); - READ_INT_FIELD(num_child_cols); - READ_ATTRNUMBER_ARRAY(parent_colnos, local_node->num_child_cols); - READ_OID_FIELD(parent_reloid); - - READ_DONE(); -} - -/* - * Stuff from parsenodes.h. - */ - -/* - * _readRangeTblEntry - */ -static RangeTblEntry * -_readRangeTblEntry(void) -{ - READ_LOCALS(RangeTblEntry); - - /* put alias + eref first to make dump more legible */ - READ_NODE_FIELD(alias); - READ_NODE_FIELD(eref); - READ_ENUM_FIELD(rtekind, RTEKind); - READ_BOOL_FIELD(relisivm); - - switch (local_node->rtekind) - { - case RTE_RELATION: - READ_OID_FIELD(relid); - READ_CHAR_FIELD(relkind); - READ_INT_FIELD(rellockmode); - READ_NODE_FIELD(tablesample); - READ_UINT_FIELD(perminfoindex); - break; - case RTE_SUBQUERY: - READ_NODE_FIELD(subquery); - READ_BOOL_FIELD(security_barrier); - READ_OID_FIELD(relid); - READ_CHAR_FIELD(relkind); - READ_INT_FIELD(rellockmode); - READ_UINT_FIELD(perminfoindex); - break; - case RTE_JOIN: - READ_ENUM_FIELD(jointype, JoinType); - READ_INT_FIELD(joinmergedcols); - READ_NODE_FIELD(joinaliasvars); - READ_NODE_FIELD(joinleftcols); - READ_NODE_FIELD(joinrightcols); - READ_NODE_FIELD(join_using_alias); - break; - case RTE_FUNCTION: - READ_NODE_FIELD(functions); - READ_BOOL_FIELD(funcordinality); - break; - case RTE_TABLEFUNCTION: - READ_NODE_FIELD(subquery); - READ_NODE_FIELD(functions); - READ_BOOL_FIELD(funcordinality); - break; - case RTE_TABLEFUNC: - READ_NODE_FIELD(tablefunc); - /* The RTE must have a copy of the column type info, if any */ - if (local_node->tablefunc) - { - TableFunc *tf = local_node->tablefunc; - - local_node->coltypes = tf->coltypes; - local_node->coltypmods = tf->coltypmods; - local_node->colcollations = tf->colcollations; - } - break; - case RTE_VALUES: - READ_NODE_FIELD(values_lists); - READ_NODE_FIELD(coltypes); - READ_NODE_FIELD(coltypmods); - READ_NODE_FIELD(colcollations); - break; - case RTE_CTE: - READ_STRING_FIELD(ctename); - READ_UINT_FIELD(ctelevelsup); - READ_BOOL_FIELD(self_reference); - READ_NODE_FIELD(coltypes); - READ_NODE_FIELD(coltypmods); - READ_NODE_FIELD(colcollations); - break; - case RTE_NAMEDTUPLESTORE: - READ_STRING_FIELD(enrname); - READ_FLOAT_FIELD(enrtuples); - READ_OID_FIELD(relid); - READ_NODE_FIELD(coltypes); - READ_NODE_FIELD(coltypmods); - READ_NODE_FIELD(colcollations); - break; - case RTE_RESULT: - /* no extra fields */ - break; - case RTE_VOID: /*CDB*/ - break; - default: - elog(ERROR, "unrecognized RTE kind: %d", - (int) local_node->rtekind); - break; - } - - READ_BOOL_FIELD(lateral); - READ_BOOL_FIELD(inh); - READ_BOOL_FIELD(inFromCl); - READ_NODE_FIELD(securityQuals); - - READ_BOOL_FIELD(forceDistRandom); - - READ_DONE(); -} - -/* - * _readRangeTblFunction - */ -static RangeTblFunction * -_readRangeTblFunction(void) -{ - READ_LOCALS(RangeTblFunction); - - READ_NODE_FIELD(funcexpr); - READ_INT_FIELD(funccolcount); - READ_NODE_FIELD(funccolnames); - READ_NODE_FIELD(funccoltypes); - READ_NODE_FIELD(funccoltypmods); - READ_NODE_FIELD(funccolcollations); - /* funcuserdata is only serialized in binary out/read functions */ -#ifdef COMPILING_BINARY_FUNCS - READ_BYTEA_FIELD(funcuserdata); -#endif - READ_BITMAPSET_FIELD(funcparams); - - READ_DONE(); -} - -/* - * Apache Cloudberry additions for serialization support - * These are currently not used (see outfastc ad readfast.c) - */ -#include "nodes/plannodes.h" - -/* - * _readTableSampleClause - */ -static TableSampleClause * -_readTableSampleClause(void) -{ - READ_LOCALS(TableSampleClause); - - READ_OID_FIELD(tsmhandler); - READ_NODE_FIELD(args); - READ_NODE_FIELD(repeatable); - - READ_DONE(); -} - -/* - * _readDefElem - */ -static DefElem * -_readDefElem(void) -{ - READ_LOCALS(DefElem); - - READ_STRING_FIELD(defnamespace); - READ_STRING_FIELD(defname); - READ_NODE_FIELD(arg); - READ_ENUM_FIELD(defaction, DefElemAction); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * Stuff from plannodes.h. - */ - -/* - * _readPlannedStmt - */ -static PlannedStmt * -_readPlannedStmt(void) -{ - READ_LOCALS(PlannedStmt); - - READ_ENUM_FIELD(commandType, CmdType); - READ_ENUM_FIELD(planGen, PlanGenerator); - READ_UINT64_FIELD(queryId); - READ_BOOL_FIELD(hasReturning); - READ_BOOL_FIELD(hasModifyingCTE); - READ_BOOL_FIELD(canSetTag); - READ_BOOL_FIELD(transientPlan); - READ_BOOL_FIELD(oneoffPlan); - READ_OID_FIELD(simplyUpdatableRel); - READ_BOOL_FIELD(dependsOnRole); - READ_BOOL_FIELD(parallelModeNeeded); - READ_INT_FIELD(jitFlags); - READ_NODE_FIELD(planTree); - READ_NODE_FIELD(rtable); - READ_NODE_FIELD(permInfos); - READ_NODE_FIELD(resultRelations); - READ_NODE_FIELD(appendRelations); - READ_NODE_FIELD(subplans); - READ_BITMAPSET_FIELD(rewindPlanIDs); - READ_NODE_FIELD(rowMarks); - READ_NODE_FIELD(relationOids); - /* invalItems not serialized in binary mode */ -#ifndef COMPILING_BINARY_FUNCS - READ_NODE_FIELD(invalItems); -#endif /* COMPILING_BINARY_FUNCS */ - READ_NODE_FIELD(paramExecTypes); - READ_NODE_FIELD(utilityStmt); - READ_LOCATION_FIELD(stmt_location); - READ_INT_FIELD(stmt_len); - - READ_INT_ARRAY(subplan_sliceIds, list_length(local_node->subplans)); - - READ_INT_FIELD(numSlices); - local_node->slices = palloc(local_node->numSlices * sizeof(PlanSlice)); - for (int i = 0; i < local_node->numSlices; i++) - { - READ_INT_FIELD(slices[i].sliceIndex); - READ_INT_FIELD(slices[i].parentIndex); - READ_INT_FIELD(slices[i].gangType); - READ_INT_FIELD(slices[i].numsegments); - READ_INT_FIELD(slices[i].parallel_workers); - READ_INT_FIELD(slices[i].segindex); - READ_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); - READ_NODE_FIELD(slices[i].directDispatch.contentIds); - } - - READ_BITMAPSET_FIELD(rewindPlanIDs); - - READ_NODE_FIELD(intoPolicy); - - READ_UINT64_FIELD(query_mem); - - READ_NODE_FIELD(intoClause); - READ_NODE_FIELD(copyIntoClause); - READ_NODE_FIELD(refreshClause); - READ_INT_FIELD(metricsQueryType); - READ_NODE_FIELD(extensionContext); - - READ_DONE(); -} - -/* - * ReadCommonPlan - * Assign the basic stuff of all nodes that inherit from Plan - */ -static void -ReadCommonPlan(Plan *local_node) -{ - READ_TEMP_LOCALS(); - - READ_FLOAT_FIELD(startup_cost); - READ_FLOAT_FIELD(total_cost); - READ_FLOAT_FIELD(plan_rows); - READ_INT_FIELD(plan_width); - READ_BOOL_FIELD(parallel_aware); - READ_BOOL_FIELD(parallel_safe); - READ_BOOL_FIELD(async_capable); - READ_INT_FIELD(plan_node_id); - READ_NODE_FIELD(targetlist); - READ_NODE_FIELD(qual); - READ_NODE_FIELD(lefttree); - READ_NODE_FIELD(righttree); - READ_NODE_FIELD(initPlan); - READ_BITMAPSET_FIELD(extParam); - READ_BITMAPSET_FIELD(allParam); - -#ifndef COMPILING_BINARY_FUNCS - READ_NODE_FIELD(flow); -#endif /* COMPILING_BINARY_FUNCS */ - - READ_UINT64_FIELD(operatorMemKB); -} - -/* - * _readPlan - */ -static Plan * -_readPlan(void) -{ - READ_LOCALS_NO_FIELDS(Plan); - - ReadCommonPlan(local_node); - - READ_DONE(); -} - -/* - * _readResult - */ -static Result * -_readResult(void) -{ - READ_LOCALS(Result); - - ReadCommonPlan(&local_node->plan); - - READ_NODE_FIELD(resconstantqual); - - READ_INT_FIELD(numHashFilterCols); - READ_ATTRNUMBER_ARRAY(hashFilterColIdx, local_node->numHashFilterCols); - READ_OID_ARRAY(hashFilterFuncs, local_node->numHashFilterCols); - - READ_DONE(); -} - -/* - * _readProjectSet - */ -static ProjectSet * -_readProjectSet(void) -{ - READ_LOCALS_NO_FIELDS(ProjectSet); - - ReadCommonPlan(&local_node->plan); - - READ_DONE(); -} - -/* - * _readModifyTable - */ -static ModifyTable * -_readModifyTable(void) -{ - READ_LOCALS(ModifyTable); - - ReadCommonPlan(&local_node->plan); - - READ_ENUM_FIELD(operation, CmdType); - READ_BOOL_FIELD(canSetTag); - READ_UINT_FIELD(nominalRelation); - READ_UINT_FIELD(rootRelation); - READ_BOOL_FIELD(partColsUpdated); - READ_BOOL_FIELD(splitUpdate); - READ_NODE_FIELD(resultRelations); - READ_NODE_FIELD(updateColnosLists); - READ_NODE_FIELD(withCheckOptionLists); - READ_NODE_FIELD(returningLists); - READ_NODE_FIELD(fdwPrivLists); - READ_BITMAPSET_FIELD(fdwDirectModifyPlans); - READ_NODE_FIELD(rowMarks); - READ_INT_FIELD(epqParam); - READ_ENUM_FIELD(onConflictAction, OnConflictAction); - READ_NODE_FIELD(arbiterIndexes); - READ_NODE_FIELD(onConflictSet); - READ_NODE_FIELD(onConflictCols); - READ_NODE_FIELD(onConflictWhere); - READ_UINT_FIELD(exclRelRTI); - READ_NODE_FIELD(exclRelTlist); - READ_BOOL_FIELD(forceTupleRouting); - READ_NODE_FIELD(mergeActionLists); - - READ_DONE(); -} - -/* - * _readAppend - */ -static Append * -_readAppend(void) -{ - READ_LOCALS(Append); - - ReadCommonPlan(&local_node->plan); - - READ_BITMAPSET_FIELD(apprelids); - READ_NODE_FIELD(appendplans); - READ_INT_FIELD(nasyncplans); - READ_INT_FIELD(first_partial_plan); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - - READ_DONE(); -} - -/* - * _readMergeAppend - */ -static MergeAppend * -_readMergeAppend(void) -{ - READ_LOCALS(MergeAppend); - - ReadCommonPlan(&local_node->plan); - - READ_BITMAPSET_FIELD(apprelids); - READ_NODE_FIELD(mergeplans); - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols); - READ_OID_ARRAY(sortOperators, local_node->numCols); - READ_OID_ARRAY(collations, local_node->numCols); - READ_BOOL_ARRAY(nullsFirst, local_node->numCols); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - - READ_DONE(); -} - -/* - * _readRecursiveUnion - */ -static RecursiveUnion * -_readRecursiveUnion(void) -{ - READ_LOCALS(RecursiveUnion); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(wtParam); - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols); - READ_OID_ARRAY(dupOperators, local_node->numCols); - READ_OID_ARRAY(dupCollations, local_node->numCols); - READ_LONG_FIELD(numGroups); - - READ_DONE(); -} - -/* - * _readBitmapAnd - */ -static BitmapAnd * -_readBitmapAnd(void) -{ - READ_LOCALS(BitmapAnd); - - ReadCommonPlan(&local_node->plan); - - READ_NODE_FIELD(bitmapplans); - - READ_DONE(); -} - -/* - * _readBitmapOr - */ -static BitmapOr * -_readBitmapOr(void) -{ - READ_LOCALS(BitmapOr); - - ReadCommonPlan(&local_node->plan); - - READ_BOOL_FIELD(isshared); - READ_NODE_FIELD(bitmapplans); - - READ_DONE(); -} - -/* - * ReadCommonScan - * Assign the basic stuff of all nodes that inherit from Scan - */ -static void -ReadCommonScan(Scan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonPlan(&local_node->plan); - - READ_UINT_FIELD(scanrelid); -} - -/* - * _readScan - */ -static Scan * -_readScan(void) -{ - READ_LOCALS_NO_FIELDS(Scan); - - ReadCommonScan(local_node); - - READ_DONE(); -} - -/* - * _readSeqScan - */ -static SeqScan * -_readSeqScan(void) -{ - READ_LOCALS_NO_FIELDS(SeqScan); - - ReadCommonScan(&local_node->scan); - - READ_DONE(); -} - -/* - * _readSampleScan - */ -static SampleScan * -_readSampleScan(void) -{ - READ_LOCALS(SampleScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(tablesample); - - READ_DONE(); -} - -/* - * _readIndexScan - */ - -static void readIndexScanFields(IndexScan *local_node); - -static IndexScan * -_readIndexScan(void) -{ - READ_LOCALS_NO_FIELDS(IndexScan); - - readIndexScanFields(local_node); - - READ_DONE(); -} - -static DynamicIndexScan * -_readDynamicIndexScan(void) -{ - READ_LOCALS(DynamicIndexScan); - /* DynamicIndexScan has some content from IndexScan. */ - readIndexScanFields(&local_node->indexscan); - READ_NODE_FIELD(partOids); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - READ_DONE(); -} -static void -readIndexScanFields(IndexScan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonScan(&local_node->scan); - - READ_OID_FIELD(indexid); - READ_NODE_FIELD(indexqual); - READ_NODE_FIELD(indexqualorig); - READ_NODE_FIELD(indexorderby); - READ_NODE_FIELD(indexorderbyorig); - READ_NODE_FIELD(indexorderbyops); - READ_ENUM_FIELD(indexorderdir, ScanDirection); -} - -/* - * _readIndexOnlyScan - */ -static void readIndexOnlyScanFields(IndexOnlyScan *local_node); - -static IndexOnlyScan * -_readIndexOnlyScan(void) -{ - READ_LOCALS_NO_FIELDS(IndexOnlyScan); - readIndexOnlyScanFields(local_node); - READ_DONE(); -} - -static void -readIndexOnlyScanFields(IndexOnlyScan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonScan(&local_node->scan); - - READ_OID_FIELD(indexid); - READ_NODE_FIELD(indexqual); - READ_NODE_FIELD(recheckqual); - READ_NODE_FIELD(indexorderby); - READ_NODE_FIELD(indextlist); - READ_ENUM_FIELD(indexorderdir, ScanDirection); -} - -static DynamicIndexOnlyScan * -_readDynamicIndexOnlyScan(void) -{ - READ_LOCALS(DynamicIndexOnlyScan); - - /* DynamicIndexScan has some content from IndexScan. */ - readIndexOnlyScanFields(&local_node->indexscan); - READ_NODE_FIELD(partOids); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - READ_DONE(); -} - -static void -readBitmapIndexScanFields(BitmapIndexScan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonScan(&local_node->scan); - - READ_OID_FIELD(indexid); - READ_BOOL_FIELD(isshared); - READ_NODE_FIELD(indexqual); - READ_NODE_FIELD(indexqualorig); -} - -/* - * _readBitmapIndexScan - */ -static BitmapIndexScan * -_readBitmapIndexScan(void) -{ - READ_LOCALS_NO_FIELDS(BitmapIndexScan); - - readBitmapIndexScanFields(local_node); - - READ_DONE(); -} - -static DynamicBitmapIndexScan * -_readDynamicBitmapIndexScan(void) -{ - READ_LOCALS_NO_FIELDS(DynamicBitmapIndexScan); - - /* DynamicBitmapIndexScan has some content from BitmapIndexScan. */ - readBitmapIndexScanFields(&local_node->biscan); - - READ_DONE(); -} - -static void -readBitmapHeapScanFields(BitmapHeapScan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(bitmapqualorig); -} - -/* - * _readBitmapHeapScan - */ -static BitmapHeapScan * -_readBitmapHeapScan(void) -{ - READ_LOCALS_NO_FIELDS(BitmapHeapScan); - - readBitmapHeapScanFields(local_node); - - READ_DONE(); -} - - -static DynamicBitmapHeapScan * -_readDynamicBitmapHeapScan(void) -{ - READ_LOCALS(DynamicBitmapHeapScan); - - /* DynamicBitmapHeapScan has some content from BitmapHeapScan. */ - readBitmapHeapScanFields(&local_node->bitmapheapscan); - - READ_NODE_FIELD(partOids); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - - READ_DONE(); -} - -/* - * _readTidScan - */ -static TidScan * -_readTidScan(void) -{ - READ_LOCALS(TidScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(tidquals); - - READ_DONE(); -} - -/* - * _readSubqueryScan - */ -static SubqueryScan * -_readSubqueryScan(void) -{ - READ_LOCALS(SubqueryScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(subplan); - - READ_DONE(); -} - -/* - * _readFunctionScan - */ -static FunctionScan * -_readFunctionScan(void) -{ - READ_LOCALS(FunctionScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(functions); - READ_BOOL_FIELD(funcordinality); - READ_NODE_FIELD(param); - READ_BOOL_FIELD(resultInTupleStore); - READ_INT_FIELD(initplanId); - - READ_DONE(); -} - -/* - * _readValuesScan - */ -static ValuesScan * -_readValuesScan(void) -{ - READ_LOCALS(ValuesScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(values_lists); - - READ_DONE(); -} - -/* - * _readTableFuncScan - */ -static TableFuncScan * -_readTableFuncScan(void) -{ - READ_LOCALS(TableFuncScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(tablefunc); - - READ_DONE(); -} - -/* - * _readCteScan - */ -static CteScan * -_readCteScan(void) -{ - READ_LOCALS(CteScan); - - ReadCommonScan(&local_node->scan); - - READ_INT_FIELD(ctePlanId); - READ_INT_FIELD(cteParam); - - READ_DONE(); -} - -/* - * _readNamedTuplestoreScan - */ -static NamedTuplestoreScan * -_readNamedTuplestoreScan(void) -{ - READ_LOCALS(NamedTuplestoreScan); - - ReadCommonScan(&local_node->scan); - - READ_STRING_FIELD(enrname); - - READ_DONE(); -} - -/* - * _readWorkTableScan - */ -static WorkTableScan * -_readWorkTableScan(void) -{ - READ_LOCALS(WorkTableScan); - - ReadCommonScan(&local_node->scan); - - READ_INT_FIELD(wtParam); - - READ_DONE(); -} - - -static void readForeignScanFields(ForeignScan *local_node); - -/* - * _readForeignScan - */ -static ForeignScan * -_readForeignScan(void) -{ - READ_LOCALS_NO_FIELDS(ForeignScan); - readForeignScanFields(local_node); - READ_DONE(); -} - -static DynamicForeignScan * -_readDynamicForeignScan(void) -{ - READ_LOCALS(DynamicForeignScan); - /* DynamicForeignScan has some content from ForeignScan. */ - readForeignScanFields(&local_node->foreignscan); - READ_NODE_FIELD(partOids); - READ_NODE_FIELD(part_prune_info); - READ_NODE_FIELD(join_prune_paramids); - READ_NODE_FIELD(fdw_private_list); - READ_DONE(); -} - -static void -readForeignScanFields(ForeignScan *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonScan(&local_node->scan); - - READ_ENUM_FIELD(operation, CmdType); - READ_UINT_FIELD(resultRelation); - READ_OID_FIELD(fs_server); - READ_NODE_FIELD(fdw_exprs); - READ_NODE_FIELD(fdw_private); - READ_NODE_FIELD(fdw_scan_tlist); - READ_NODE_FIELD(fdw_recheck_quals); - READ_BITMAPSET_FIELD(fs_relids); - READ_BOOL_FIELD(fsSystemCol); -} - - -#ifndef COMPILING_BINARY_FUNCS -/* - * _readCustomScan - */ -static CustomScan * -_readCustomScan(void) -{ - READ_LOCALS(CustomScan); - char *custom_name; - const CustomScanMethods *methods; - - ReadCommonScan(&local_node->scan); - - READ_UINT_FIELD(flags); - READ_NODE_FIELD(custom_plans); - READ_NODE_FIELD(custom_exprs); - READ_NODE_FIELD(custom_private); - READ_NODE_FIELD(custom_scan_tlist); - READ_BITMAPSET_FIELD(custom_relids); - - /* Lookup CustomScanMethods by CustomName */ - token = pg_strtok(&length); /* skip methods: */ - token = pg_strtok(&length); /* CustomName */ - custom_name = nullable_string(token, length); - methods = GetCustomScanMethods(custom_name, false); - local_node->methods = methods; - - READ_DONE(); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/* - * ReadCommonJoin - * Assign the basic stuff of all nodes that inherit from Join - */ -static void -ReadCommonJoin(Join *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonPlan(&local_node->plan); - - READ_BOOL_FIELD(prefetch_inner); - READ_BOOL_FIELD(prefetch_joinqual); - READ_BOOL_FIELD(prefetch_qual); - - READ_ENUM_FIELD(jointype, JoinType); - READ_BOOL_FIELD(inner_unique); - READ_NODE_FIELD(joinqual); -} - -/* - * _readJoin - */ -static Join * -_readJoin(void) -{ - READ_LOCALS_NO_FIELDS(Join); - - ReadCommonJoin(local_node); - - READ_DONE(); -} - -/* - * _readNestLoop - */ -static NestLoop * -_readNestLoop(void) -{ - READ_LOCALS(NestLoop); - - ReadCommonJoin(&local_node->join); - - READ_NODE_FIELD(nestParams); - - READ_BOOL_FIELD(shared_outer); - READ_BOOL_FIELD(singleton_outer); /*CDB-OLAP*/ - - READ_DONE(); -} - -/* - * _readMergeJoin - */ -static MergeJoin * -_readMergeJoin(void) -{ - int numCols; - - READ_LOCALS(MergeJoin); - - ReadCommonJoin(&local_node->join); - - READ_BOOL_FIELD(skip_mark_restore); - READ_NODE_FIELD(mergeclauses); - - numCols = list_length(local_node->mergeclauses); - - READ_OID_ARRAY(mergeFamilies, numCols); - READ_OID_ARRAY(mergeCollations, numCols); - READ_INT_ARRAY(mergeStrategies, numCols); - READ_BOOL_ARRAY(mergeNullsFirst, numCols); - READ_BOOL_FIELD(unique_outer); - - READ_DONE(); -} - -/* - * _readHashJoin - */ -static HashJoin * -_readHashJoin(void) -{ - READ_LOCALS(HashJoin); - - ReadCommonJoin(&local_node->join); - - READ_NODE_FIELD(hashclauses); - READ_NODE_FIELD(hashoperators); - READ_NODE_FIELD(hashcollations); - READ_NODE_FIELD(hashkeys); - READ_NODE_FIELD(hashqualclauses); - READ_BOOL_FIELD(batch0_barrier); - READ_BOOL_FIELD(outer_motionhazard); - - READ_DONE(); -} - -/* - * _readMaterial - */ -static Material * -_readMaterial(void) -{ - READ_LOCALS(Material); - - ReadCommonPlan(&local_node->plan); - - READ_BOOL_FIELD(cdb_strict); - READ_BOOL_FIELD(cdb_shield_child_from_rescans); - - READ_DONE(); -} - -/* - * ReadCommonSort - * Assign the basic stuff of all nodes that inherit from Sort - */ -static void -ReadCommonSort(Sort *local_node) -{ - READ_TEMP_LOCALS(); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols); - READ_OID_ARRAY(sortOperators, local_node->numCols); - READ_OID_ARRAY(collations, local_node->numCols); - READ_BOOL_ARRAY(nullsFirst, local_node->numCols); -} - -/* - * _readSort - */ -static Sort * -_readSort(void) -{ - READ_LOCALS_NO_FIELDS(Sort); - - ReadCommonSort(local_node); - - READ_DONE(); -} - -/* - * _readIncrementalSort - */ -static IncrementalSort * -_readIncrementalSort(void) -{ - READ_LOCALS(IncrementalSort); - - ReadCommonSort(&local_node->sort); - - READ_INT_FIELD(nPresortedCols); - - READ_DONE(); -} - -#ifndef COMPILING_BINARY_FUNCS -/* - * _readGroup - */ -static Group * -_readGroup(void) -{ - READ_LOCALS(Group); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols); - READ_OID_ARRAY(grpOperators, local_node->numCols); - READ_OID_ARRAY(grpCollations, local_node->numCols); - - READ_DONE(); -} -#endif /* COMPILING_BINARY_FUNCS */ - -/* - * _readAgg - */ -static Agg * -_readAgg(void) -{ - READ_LOCALS(Agg); - - ReadCommonPlan(&local_node->plan); - - READ_ENUM_FIELD(aggstrategy, AggStrategy); - READ_ENUM_FIELD(aggsplit, AggSplit); - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols); - READ_OID_ARRAY(grpOperators, local_node->numCols); - READ_OID_ARRAY(grpCollations, local_node->numCols); - READ_LONG_FIELD(numGroups); - READ_UINT64_FIELD(transitionSpace); - READ_BITMAPSET_FIELD(aggParams); - READ_NODE_FIELD(groupingSets); - READ_NODE_FIELD(chain); - READ_BOOL_FIELD(streaming); - READ_UINT_FIELD(agg_expr_id); - - READ_DONE(); -} - -/* - * _readWindowAgg - */ -static WindowAgg * -_readWindowAgg(void) -{ - READ_LOCALS(WindowAgg); - - ReadCommonPlan(&local_node->plan); - - READ_UINT_FIELD(winref); - READ_INT_FIELD(partNumCols); - READ_ATTRNUMBER_ARRAY(partColIdx, local_node->partNumCols); - READ_OID_ARRAY(partOperators, local_node->partNumCols); - READ_OID_ARRAY(partCollations, local_node->partNumCols); - READ_INT_FIELD(ordNumCols); - READ_ATTRNUMBER_ARRAY(ordColIdx, local_node->ordNumCols); - READ_OID_ARRAY(ordOperators, local_node->ordNumCols); - READ_OID_ARRAY(ordCollations, local_node->ordNumCols); - READ_INT_FIELD(firstOrderCol); - READ_OID_FIELD(firstOrderCmpOperator); - READ_BOOL_FIELD(firstOrderNullsFirst); - READ_INT_FIELD(frameOptions); - READ_NODE_FIELD(startOffset); - READ_NODE_FIELD(endOffset); - READ_NODE_FIELD(runCondition); - READ_NODE_FIELD(runConditionOrig); - READ_OID_FIELD(startInRangeFunc); - READ_OID_FIELD(endInRangeFunc); - READ_OID_FIELD(inRangeColl); - READ_BOOL_FIELD(inRangeAsc); - READ_BOOL_FIELD(inRangeNullsFirst); - READ_BOOL_FIELD(topWindow); - - READ_DONE(); -} - -static WindowHashAgg * -_readWindowHashAgg(void) -{ - READ_LOCALS(WindowHashAgg); - - ReadCommonPlan(&local_node->plan); - - READ_UINT_FIELD(winref); - READ_INT_FIELD(partNumCols); - READ_ATTRNUMBER_ARRAY(partColIdx, local_node->partNumCols); - READ_OID_ARRAY(partOperators, local_node->partNumCols); - READ_OID_ARRAY(partCollations, local_node->partNumCols); - READ_INT_FIELD(ordNumCols); - READ_ATTRNUMBER_ARRAY(ordColIdx, local_node->ordNumCols); - READ_OID_ARRAY(ordOperators, local_node->ordNumCols); - READ_OID_ARRAY(ordCollations, local_node->ordNumCols); - READ_BOOL_ARRAY(ordNullsFirst, local_node->ordNumCols); - READ_INT_FIELD(frameOptions); - READ_NODE_FIELD(startOffset); - READ_NODE_FIELD(endOffset); - READ_OID_FIELD(startInRangeFunc); - READ_OID_FIELD(endInRangeFunc); - READ_OID_FIELD(inRangeColl); - READ_BOOL_FIELD(inRangeAsc); - READ_BOOL_FIELD(inRangeNullsFirst); - - READ_DONE(); -} - -/* - * _readUnique - */ -static Unique * -_readUnique(void) -{ - READ_LOCALS(Unique); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(uniqColIdx, local_node->numCols); - READ_OID_ARRAY(uniqOperators, local_node->numCols); - READ_OID_ARRAY(uniqCollations, local_node->numCols); - - READ_DONE(); -} - -/* - * _readGather - */ -static Gather * -_readGather(void) -{ - READ_LOCALS(Gather); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(num_workers); - READ_INT_FIELD(rescan_param); - READ_BOOL_FIELD(single_copy); - READ_BOOL_FIELD(invisible); - READ_BITMAPSET_FIELD(initParam); - - READ_DONE(); -} - -/* - * _readGatherMerge - */ -static GatherMerge * -_readGatherMerge(void) -{ - READ_LOCALS(GatherMerge); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(num_workers); - READ_INT_FIELD(rescan_param); - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numCols); - READ_OID_ARRAY(sortOperators, local_node->numCols); - READ_OID_ARRAY(collations, local_node->numCols); - READ_BOOL_ARRAY(nullsFirst, local_node->numCols); - READ_BITMAPSET_FIELD(initParam); - - READ_DONE(); -} - -/* - * _readHash - */ -static Hash * -_readHash(void) -{ - READ_LOCALS(Hash); - - ReadCommonPlan(&local_node->plan); - - READ_NODE_FIELD(hashkeys); - READ_OID_FIELD(skewTable); - READ_INT_FIELD(skewColumn); - READ_BOOL_FIELD(skewInherit); - READ_FLOAT_FIELD(rows_total); - READ_BOOL_FIELD(rescannable); /*CDB*/ - READ_BOOL_FIELD(sync_barrier); - - READ_DONE(); -} - -/* - * _readSetOp - */ -static SetOp * -_readSetOp(void) -{ - READ_LOCALS(SetOp); - - ReadCommonPlan(&local_node->plan); - - READ_ENUM_FIELD(cmd, SetOpCmd); - READ_ENUM_FIELD(strategy, SetOpStrategy); - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(dupColIdx, local_node->numCols); - READ_OID_ARRAY(dupOperators, local_node->numCols); - READ_OID_ARRAY(dupCollations, local_node->numCols); - READ_INT_FIELD(flagColIdx); - READ_INT_FIELD(firstFlag); - READ_LONG_FIELD(numGroups); - - READ_DONE(); -} - -/* - * _readLockRows - */ -static LockRows * -_readLockRows(void) -{ - READ_LOCALS(LockRows); - - ReadCommonPlan(&local_node->plan); - - READ_NODE_FIELD(rowMarks); - READ_INT_FIELD(epqParam); - - READ_DONE(); -} - -static RuntimeFilter * -_readRuntimeFilter(void) -{ - READ_LOCALS_NO_FIELDS(RuntimeFilter); - - ReadCommonPlan(&local_node->plan); - - READ_DONE(); -} - -/* - * _readLimit - */ -static Limit * -_readLimit(void) -{ - READ_LOCALS(Limit); - - ReadCommonPlan(&local_node->plan); - - READ_NODE_FIELD(limitOffset); - READ_NODE_FIELD(limitCount); - READ_ENUM_FIELD(limitOption, LimitOption); - READ_INT_FIELD(uniqNumCols); - READ_ATTRNUMBER_ARRAY(uniqColIdx, local_node->uniqNumCols); - READ_OID_ARRAY(uniqOperators, local_node->uniqNumCols); - READ_OID_ARRAY(uniqCollations, local_node->uniqNumCols); - - READ_DONE(); -} - -/* - * _readNestLoopParam - */ -static NestLoopParam * -_readNestLoopParam(void) -{ - READ_LOCALS(NestLoopParam); - - READ_INT_FIELD(paramno); - READ_NODE_FIELD(paramval); - - READ_DONE(); -} - -/* - * _readPlanRowMark - */ -static PlanRowMark * -_readPlanRowMark(void) -{ - READ_LOCALS(PlanRowMark); - - READ_UINT_FIELD(rti); - READ_UINT_FIELD(prti); - READ_UINT_FIELD(rowmarkId); - READ_ENUM_FIELD(markType, RowMarkType); - READ_INT_FIELD(allMarkTypes); - READ_ENUM_FIELD(strength, LockClauseStrength); - READ_ENUM_FIELD(waitPolicy, LockWaitPolicy); - READ_BOOL_FIELD(isParent); - - READ_DONE(); -} - -static PartitionPruneInfo * -_readPartitionPruneInfo(void) -{ - READ_LOCALS(PartitionPruneInfo); - - READ_NODE_FIELD(prune_infos); - READ_BITMAPSET_FIELD(other_subplans); - - READ_DONE(); -} - -static PartitionedRelPruneInfo * -_readPartitionedRelPruneInfo(void) -{ - READ_LOCALS(PartitionedRelPruneInfo); - - READ_UINT_FIELD(rtindex); - READ_BITMAPSET_FIELD(present_parts); - READ_INT_FIELD(nparts); - READ_INT_ARRAY(subplan_map, local_node->nparts); - READ_INT_ARRAY(subpart_map, local_node->nparts); - READ_OID_ARRAY(relid_map, local_node->nparts); - READ_NODE_FIELD(initial_pruning_steps); - READ_NODE_FIELD(exec_pruning_steps); - READ_BITMAPSET_FIELD(execparamids); - - READ_DONE(); -} - -static PartitionPruneStepOp * -_readPartitionPruneStepOp(void) -{ - READ_LOCALS(PartitionPruneStepOp); - - READ_INT_FIELD(step.step_id); - READ_INT_FIELD(opstrategy); - READ_NODE_FIELD(exprs); - READ_NODE_FIELD(cmpfns); - READ_BITMAPSET_FIELD(nullkeys); - - READ_DONE(); -} - -static PartitionPruneStepCombine * -_readPartitionPruneStepCombine(void) -{ - READ_LOCALS(PartitionPruneStepCombine); - - READ_INT_FIELD(step.step_id); - READ_ENUM_FIELD(combineOp, PartitionPruneCombineOp); - READ_NODE_FIELD(source_stepids); + /* put alias + eref first to make dump more legible */ + READ_NODE_FIELD(alias); + READ_NODE_FIELD(eref); + READ_ENUM_FIELD(rtekind, RTEKind); + READ_BOOL_FIELD(relisivm); - READ_DONE(); -} + switch (local_node->rtekind) + { + case RTE_RELATION: + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + READ_INT_FIELD(rellockmode); + READ_NODE_FIELD(tablesample); + READ_UINT_FIELD(perminfoindex); + break; + case RTE_SUBQUERY: + READ_NODE_FIELD(subquery); + READ_BOOL_FIELD(security_barrier); + /* we re-use these RELATION fields, too: */ + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + READ_INT_FIELD(rellockmode); + READ_UINT_FIELD(perminfoindex); + break; + case RTE_JOIN: + READ_ENUM_FIELD(jointype, JoinType); + READ_INT_FIELD(joinmergedcols); + READ_NODE_FIELD(joinaliasvars); + READ_NODE_FIELD(joinleftcols); + READ_NODE_FIELD(joinrightcols); + READ_NODE_FIELD(join_using_alias); + break; + case RTE_FUNCTION: + READ_NODE_FIELD(functions); + READ_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNCTION: + READ_NODE_FIELD(subquery); + READ_NODE_FIELD(functions); + READ_BOOL_FIELD(funcordinality); + break; + case RTE_TABLEFUNC: + READ_NODE_FIELD(tablefunc); + /* The RTE must have a copy of the column type info, if any */ + if (local_node->tablefunc) + { + TableFunc *tf = local_node->tablefunc; -/* - * _readPlanInvalItem - */ -static PlanInvalItem * -_readPlanInvalItem(void) -{ - READ_LOCALS(PlanInvalItem); + local_node->coltypes = tf->coltypes; + local_node->coltypmods = tf->coltypmods; + local_node->colcollations = tf->colcollations; + } + break; + case RTE_VALUES: + READ_NODE_FIELD(values_lists); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + break; + case RTE_CTE: + READ_STRING_FIELD(ctename); + READ_UINT_FIELD(ctelevelsup); + READ_BOOL_FIELD(self_reference); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + break; + case RTE_NAMEDTUPLESTORE: + READ_STRING_FIELD(enrname); + READ_FLOAT_FIELD(enrtuples); + READ_NODE_FIELD(coltypes); + READ_NODE_FIELD(coltypmods); + READ_NODE_FIELD(colcollations); + /* we re-use these RELATION fields, too: */ + READ_OID_FIELD(relid); + break; + case RTE_RESULT: + /* no extra fields */ + break; + default: + elog(ERROR, "unrecognized RTE kind: %d", + (int) local_node->rtekind); + break; + } - READ_INT_FIELD(cacheId); - READ_UINT_FIELD(hashValue); + READ_BOOL_FIELD(lateral); + READ_BOOL_FIELD(inh); + READ_BOOL_FIELD(inFromCl); + READ_NODE_FIELD(securityQuals); + + READ_BOOL_FIELD(forceDistRandom); READ_DONE(); } -/* - * _readSubPlan - */ -static SubPlan * -_readSubPlan(void) +static A_Expr * +_readA_Expr(void) { - READ_LOCALS(SubPlan); - - READ_ENUM_FIELD(subLinkType, SubLinkType); - READ_NODE_FIELD(testexpr); - READ_NODE_FIELD(paramIds); - READ_INT_FIELD(plan_id); - READ_STRING_FIELD(plan_name); - READ_OID_FIELD(firstColType); - READ_INT_FIELD(firstColTypmod); - READ_OID_FIELD(firstColCollation); - READ_BOOL_FIELD(useHashTable); - READ_BOOL_FIELD(unknownEqFalse); - READ_BOOL_FIELD(parallel_safe); - READ_BOOL_FIELD(is_initplan); /*CDB*/ - READ_BOOL_FIELD(is_multirow); /*CDB*/ - READ_NODE_FIELD(setParam); - READ_NODE_FIELD(parParam); - READ_NODE_FIELD(args); - READ_NODE_FIELD(extParam); - READ_FLOAT_FIELD(startup_cost); - READ_FLOAT_FIELD(per_call_cost); + READ_LOCALS(A_Expr); - READ_DONE(); -} + token = pg_strtok(&length); -/* - * _readAlternativeSubPlan - */ -static AlternativeSubPlan * -_readAlternativeSubPlan(void) -{ - READ_LOCALS(AlternativeSubPlan); + if (length == 3 && strncmp(token, "ANY", 3) == 0) + { + local_node->kind = AEXPR_OP_ANY; + READ_NODE_FIELD(name); + } + else if (length == 3 && strncmp(token, "ALL", 3) == 0) + { + local_node->kind = AEXPR_OP_ALL; + READ_NODE_FIELD(name); + } + else if (length == 8 && strncmp(token, "DISTINCT", 8) == 0) + { + local_node->kind = AEXPR_DISTINCT; + READ_NODE_FIELD(name); + } + else if (length == 12 && strncmp(token, "NOT_DISTINCT", 12) == 0) + { + local_node->kind = AEXPR_NOT_DISTINCT; + READ_NODE_FIELD(name); + } + else if (length == 6 && strncmp(token, "NULLIF", 6) == 0) + { + local_node->kind = AEXPR_NULLIF; + READ_NODE_FIELD(name); + } + else if (length == 2 && strncmp(token, "IN", 2) == 0) + { + local_node->kind = AEXPR_IN; + READ_NODE_FIELD(name); + } + else if (length == 4 && strncmp(token, "LIKE", 4) == 0) + { + local_node->kind = AEXPR_LIKE; + READ_NODE_FIELD(name); + } + else if (length == 5 && strncmp(token, "ILIKE", 5) == 0) + { + local_node->kind = AEXPR_ILIKE; + READ_NODE_FIELD(name); + } + else if (length == 7 && strncmp(token, "SIMILAR", 7) == 0) + { + local_node->kind = AEXPR_SIMILAR; + READ_NODE_FIELD(name); + } + else if (length == 7 && strncmp(token, "BETWEEN", 7) == 0) + { + local_node->kind = AEXPR_BETWEEN; + READ_NODE_FIELD(name); + } + else if (length == 11 && strncmp(token, "NOT_BETWEEN", 11) == 0) + { + local_node->kind = AEXPR_NOT_BETWEEN; + READ_NODE_FIELD(name); + } + else if (length == 11 && strncmp(token, "BETWEEN_SYM", 11) == 0) + { + local_node->kind = AEXPR_BETWEEN_SYM; + READ_NODE_FIELD(name); + } + else if (length == 15 && strncmp(token, "NOT_BETWEEN_SYM", 15) == 0) + { + local_node->kind = AEXPR_NOT_BETWEEN_SYM; + READ_NODE_FIELD(name); + } + else if (length == 5 && strncmp(token, ":name", 5) == 0) + { + local_node->kind = AEXPR_OP; + local_node->name = nodeRead(NULL, 0); + } + else + elog(ERROR, "unrecognized A_Expr kind: \"%.*s\"", length, token); - READ_NODE_FIELD(subplans); + READ_NODE_FIELD(lexpr); + READ_NODE_FIELD(rexpr); + READ_LOCATION_FIELD(location); READ_DONE(); } -#ifndef COMPILING_BINARY_FUNCS -/* - * _readExtensibleNode - */ static ExtensibleNode * _readExtensibleNode(void) { @@ -2897,204 +696,332 @@ _readExtensibleNode(void) READ_DONE(); } -#endif /* COMPILING_BINARY_FUNCS */ -/* - * _readPartitionBoundSpec - */ -static PartitionBoundSpec * -_readPartitionBoundSpec(void) +static ColumnDef * +_readColumnDef(void) { - READ_LOCALS(PartitionBoundSpec); - - READ_CHAR_FIELD(strategy); - READ_BOOL_FIELD(is_default); - READ_INT_FIELD(modulus); - READ_INT_FIELD(remainder); - READ_NODE_FIELD(listdatums); - READ_NODE_FIELD(lowerdatums); - READ_NODE_FIELD(upperdatums); + READ_LOCALS(ColumnDef); + + READ_STRING_FIELD(colname); + READ_NODE_FIELD(typeName); + READ_STRING_FIELD(compression); + READ_INT_FIELD(inhcount); + READ_BOOL_FIELD(is_local); + READ_BOOL_FIELD(is_not_null); + READ_BOOL_FIELD(is_from_type); + READ_INT_FIELD(attnum); + READ_INT_FIELD(storage); + READ_STRING_FIELD(storage_name); + READ_NODE_FIELD(raw_default); + READ_NODE_FIELD(cooked_default); + + READ_BOOL_FIELD(hasCookedMissingVal); + READ_BOOL_FIELD(missingIsNull); + if (local_node->hasCookedMissingVal && !local_node->missingIsNull) + local_node->missingVal = readDatum(false); + + READ_CHAR_FIELD(identity); + READ_NODE_FIELD(identitySequence); + READ_CHAR_FIELD(generated); + READ_NODE_FIELD(collClause); + READ_OID_FIELD(collOid); + READ_NODE_FIELD(constraints); + READ_NODE_FIELD(encoding); + READ_NODE_FIELD(fdwoptions); READ_LOCATION_FIELD(location); READ_DONE(); } -/* - * _readPartitionRangeDatum - */ -static PartitionRangeDatum * -_readPartitionRangeDatum(void) +static SerializedParams * +_readSerializedParams(void) { - READ_LOCALS(PartitionRangeDatum); + READ_LOCALS(SerializedParams); - READ_ENUM_FIELD(kind, PartitionRangeDatumKind); - READ_NODE_FIELD(value); - READ_LOCATION_FIELD(location); + READ_INT_FIELD(nExternParams); + local_node->externParams = palloc0(local_node->nExternParams * sizeof(SerializedParamExternData)); + for (int i = 0; i < local_node->nExternParams; i++) + { + READ_BOOL_FIELD(externParams[i].isnull); + READ_INT_FIELD(externParams[i].pflags); + READ_OID_FIELD(externParams[i].ptype); + READ_INT_FIELD(externParams[i].plen); + READ_BOOL_FIELD(externParams[i].pbyval); + + if (!local_node->externParams[i].isnull) + local_node->externParams[i].value = readDatum(local_node->externParams[i].pbyval); + } + + READ_INT_FIELD(nExecParams); + local_node->execParams = palloc0(local_node->nExecParams * sizeof(SerializedParamExecData)); + for (int i = 0; i < local_node->nExecParams; i++) + { + READ_BOOL_FIELD(execParams[i].isnull); + READ_BOOL_FIELD(execParams[i].isvalid); + READ_INT_FIELD(execParams[i].plen); + READ_BOOL_FIELD(execParams[i].pbyval); + + if (local_node->execParams[i].isvalid && !local_node->execParams[i].isnull) + local_node->execParams[i].value = readDatum(local_node->execParams[i].pbyval); + READ_BOOL_FIELD(execParams[i].pbyval); + } READ_DONE(); } -static RTEPermissionInfo * -_readRTEPermissionInfo(void) +static SliceTable * +_readSliceTable(void) { - READ_LOCALS(RTEPermissionInfo); + READ_LOCALS(SliceTable); - READ_OID_FIELD(relid); - READ_BOOL_FIELD(inh); - READ_UINT64_FIELD(requiredPerms); - READ_OID_FIELD(checkAsUser); - READ_BITMAPSET_FIELD(selectedCols); - READ_BITMAPSET_FIELD(insertedCols); - READ_BITMAPSET_FIELD(updatedCols); + READ_INT_FIELD(localSlice); + READ_INT_FIELD(numSlices); + local_node->slices = palloc0(local_node->numSlices * sizeof(ExecSlice)); + for (int i = 0; i < local_node->numSlices; i++) + { + READ_INT_FIELD(slices[i].sliceIndex); + READ_INT_FIELD(slices[i].rootIndex); + READ_INT_FIELD(slices[i].parentIndex); + READ_INT_FIELD(slices[i].planNumSegments); + READ_NODE_FIELD(slices[i].children); /* List of int index */ + READ_ENUM_FIELD(slices[i].gangType, GangType); + READ_NODE_FIELD(slices[i].segments); /* List of int index */ + READ_BOOL_FIELD(slices[i].useMppParallelMode); + READ_INT_FIELD(slices[i].parallel_workers); + local_node->slices[i].primaryGang = NULL; + READ_NODE_FIELD(slices[i].primaryProcesses); /* List of (CDBProcess *) */ + READ_BITMAPSET_FIELD(slices[i].processesMap); + } + READ_BOOL_FIELD(hasMotions); + + READ_INT_FIELD(instrument_options); + READ_INT_FIELD(ic_instance_id); READ_DONE(); } -/* - * _readGpPolicy - */ -static GpPolicy * -_readGpPolicy(void) + +static TupleDescNode * +_readTupleDescNode(void) { - READ_LOCALS(GpPolicy); + READ_LOCALS(TupleDescNode); - READ_ENUM_FIELD(ptype, GpPolicyType); + READ_INT_FIELD(natts); - READ_INT_FIELD(numsegments); + local_node->tuple = CreateTemplateTupleDesc(local_node->natts); - READ_INT_FIELD(nattrs); - READ_ATTRNUMBER_ARRAY(attrs, local_node->nattrs); - READ_OID_ARRAY(opclasses, local_node->nattrs); + READ_INT_FIELD(tuple->natts); - READ_DONE(); -} + READ_OID_FIELD(tuple->tdtypeid); + READ_INT_FIELD(tuple->tdtypmod); + READ_INT_FIELD(tuple->tdrefcount); -static MergeAction * -_readMergeAction(void) -{ - READ_LOCALS(MergeAction); + // Transient type don't have constraint. + local_node->tuple->constr = NULL; - READ_BOOL_FIELD(matched); - READ_ENUM_FIELD(commandType, CmdType); - READ_ENUM_FIELD(override, OverridingKind); - READ_NODE_FIELD(qual); - READ_NODE_FIELD(targetList); - READ_NODE_FIELD(updateColnos); + Assert(local_node->tuple->tdtypeid == RECORDOID); READ_DONE(); } -static PublicationObjSpec * -_readPublicationObjSpec(void) +static void +unwrapStringList(List *list) { - READ_LOCALS(PublicationObjSpec); + ListCell *lc; - READ_ENUM_FIELD(pubobjtype, PublicationObjSpecType); - READ_STRING_FIELD(name); - READ_NODE_FIELD(pubtable); - READ_LOCATION_FIELD(location); + foreach(lc, list) + { + String *val = lfirst(lc); - READ_DONE(); + lfirst(lc) = strVal(val); + pfree(val); + } } -static PublicationTable * -_readPublicationTable(void) +static AlteredTableInfo * +_readAlteredTableInfo(void) { - READ_LOCALS(PublicationTable); + READ_LOCALS(AlteredTableInfo); - READ_NODE_FIELD(relation); - READ_NODE_FIELD(whereClause); - READ_NODE_FIELD(columns); + READ_OID_FIELD(relid); + READ_CHAR_FIELD(relkind); + /* oldDesc is omitted */ - READ_DONE(); -} + for (int i = 0; i < AT_NUM_PASSES; i++) + { + READ_NODE_FIELD(subcmds[i]); + } -static WindowDef * -_readWindowDef(void) -{ - READ_LOCALS(WindowDef); + READ_NODE_FIELD(constraints); + READ_NODE_FIELD(newvals); + READ_NODE_FIELD(afterStmts); + READ_BOOL_FIELD(verify_new_notnull); + READ_INT_FIELD(rewrite); + READ_OID_FIELD(newAccessMethod); + READ_BOOL_FIELD(dist_opfamily_changed); + READ_OID_FIELD(new_opclass); + READ_BOOL_FIELD(chgPersistence); + READ_CHAR_FIELD(newrelpersistence); + READ_NODE_FIELD(partition_constraint); + READ_BOOL_FIELD(validate_default); + READ_NODE_FIELD(changedConstraintOids); + READ_NODE_FIELD(changedConstraintDefs); + /* The QD sends changedConstraintDefs wrapped in Values. Unwrap them. */ + unwrapStringList(local_node->changedConstraintDefs); + READ_NODE_FIELD(changedIndexOids); + READ_NODE_FIELD(changedIndexDefs); + unwrapStringList(local_node->changedIndexDefs); + READ_NODE_FIELD(beforeStmtLists); + READ_NODE_FIELD(constraintLists); + + READ_DONE(); +} + +static NewConstraint * +_readNewConstraint(void) +{ + READ_LOCALS(NewConstraint); READ_STRING_FIELD(name); - READ_STRING_FIELD(refname); - READ_NODE_FIELD(partitionClause); - READ_NODE_FIELD(orderClause); - READ_INT_FIELD(frameOptions); - READ_NODE_FIELD(startOffset); - READ_NODE_FIELD(endOffset); - READ_LOCATION_FIELD(location); + READ_ENUM_FIELD(contype, ConstrType); + READ_OID_FIELD(refrelid); + READ_OID_FIELD(refindid); + READ_OID_FIELD(conid); + READ_NODE_FIELD(qual); + /* can't serialize qualstate */ READ_DONE(); } -static JsonConstructorExpr * -_readJsonConstructorExpr(void) +static PlannedStmt * +_readPlannedStmt(void) { - READ_LOCALS(JsonConstructorExpr); + READ_LOCALS(PlannedStmt); - READ_ENUM_FIELD(type, JsonConstructorType); - READ_NODE_FIELD(args); - READ_NODE_FIELD(func); - READ_NODE_FIELD(coercion); - READ_NODE_FIELD(returning); - READ_BOOL_FIELD(absent_on_null); - READ_BOOL_FIELD(unique); - READ_LOCATION_FIELD(location); + READ_ENUM_FIELD(commandType, CmdType); + READ_ENUM_FIELD(planGen, PlanGenerator); + READ_UINT64_FIELD(queryId); + READ_BOOL_FIELD(hasReturning); + READ_BOOL_FIELD(hasModifyingCTE); + READ_BOOL_FIELD(canSetTag); + READ_BOOL_FIELD(transientPlan); + READ_BOOL_FIELD(oneoffPlan); + READ_OID_FIELD(simplyUpdatableRel); + READ_BOOL_FIELD(dependsOnRole); + READ_BOOL_FIELD(parallelModeNeeded); + READ_INT_FIELD(jitFlags); + READ_NODE_FIELD(planTree); + READ_NODE_FIELD(rtable); + READ_NODE_FIELD(permInfos); + READ_NODE_FIELD(resultRelations); + READ_NODE_FIELD(appendRelations); + READ_NODE_FIELD(subplans); + READ_BITMAPSET_FIELD(rewindPlanIDs); + READ_NODE_FIELD(rowMarks); + READ_NODE_FIELD(relationOids); + READ_NODE_FIELD(invalItems); + READ_NODE_FIELD(paramExecTypes); + READ_NODE_FIELD(utilityStmt); + READ_LOCATION_FIELD(stmt_location); + READ_INT_FIELD(stmt_len); - READ_DONE(); -} + READ_INT_ARRAY(subplan_sliceIds, list_length(local_node->subplans)); -static JsonIsPredicate * -_readJsonIsPredicate(void) -{ - READ_LOCALS(JsonIsPredicate); + READ_INT_FIELD(numSlices); + local_node->slices = palloc(local_node->numSlices * sizeof(PlanSlice)); + for (int i = 0; i < local_node->numSlices; i++) + { + READ_INT_FIELD(slices[i].sliceIndex); + READ_INT_FIELD(slices[i].parentIndex); + READ_INT_FIELD(slices[i].gangType); + READ_INT_FIELD(slices[i].numsegments); + READ_INT_FIELD(slices[i].parallel_workers); + READ_INT_FIELD(slices[i].segindex); + READ_BOOL_FIELD(slices[i].directDispatch.isDirectDispatch); + READ_NODE_FIELD(slices[i].directDispatch.contentIds); + } - READ_NODE_FIELD(expr); - READ_NODE_FIELD(format); - READ_ENUM_FIELD(item_type, JsonValueType); - READ_BOOL_FIELD(unique_keys); - READ_LOCATION_FIELD(location); + READ_BITMAPSET_FIELD(rewindPlanIDs); - READ_DONE(); -} + READ_NODE_FIELD(intoPolicy); -static JsonReturning * -_readJsonReturning(void) -{ - READ_LOCALS(JsonReturning); + READ_UINT64_FIELD(query_mem); - READ_NODE_FIELD(format); - READ_OID_FIELD(typid); - READ_INT_FIELD(typmod); + READ_NODE_FIELD(intoClause); + READ_NODE_FIELD(copyIntoClause); + READ_NODE_FIELD(refreshClause); + READ_INT_FIELD(metricsQueryType); + READ_NODE_FIELD(extensionContext); READ_DONE(); } -static JsonValueExpr * -_readJsonValueExpr(void) +static Motion * +_readMotion(void) { - READ_LOCALS(JsonValueExpr); + READ_LOCALS(Motion); - READ_NODE_FIELD(raw_expr); - READ_NODE_FIELD(formatted_expr); - READ_NODE_FIELD(format); + READ_FLOAT_FIELD(plan.startup_cost); + READ_FLOAT_FIELD(plan.total_cost); + READ_FLOAT_FIELD(plan.plan_rows); + READ_INT_FIELD(plan.plan_width); + READ_BOOL_FIELD(plan.parallel_aware); + READ_BOOL_FIELD(plan.parallel_safe); + READ_BOOL_FIELD(plan.async_capable); + READ_INT_FIELD(plan.plan_node_id); + READ_NODE_FIELD(plan.targetlist); + READ_NODE_FIELD(plan.qual); + READ_NODE_FIELD(plan.lefttree); + READ_NODE_FIELD(plan.righttree); + READ_NODE_FIELD(plan.initPlan); + READ_BITMAPSET_FIELD(plan.extParam); + READ_BITMAPSET_FIELD(plan.allParam); + READ_NODE_FIELD(plan.flow); + READ_UINT_FIELD(plan.locustype); + READ_INT_FIELD(plan.parallel); + READ_UINT64_FIELD(plan.operatorMemKB); + + READ_INT_FIELD(motionID); + READ_ENUM_FIELD(motionType, MotionType); + Assert(local_node->motionType == MOTIONTYPE_GATHER || + local_node->motionType == MOTIONTYPE_GATHER_SINGLE || + local_node->motionType == MOTIONTYPE_HASH || + local_node->motionType == MOTIONTYPE_BROADCAST || + local_node->motionType == MOTIONTYPE_BROADCAST_WORKERS || + local_node->motionType == MOTIONTYPE_EXPLICIT); + + READ_BOOL_FIELD(sendSorted); + + READ_NODE_FIELD(hashExprs); + READ_OID_ARRAY(hashFuncs, list_length(local_node->hashExprs)); + + READ_INT_FIELD(numSortCols); + READ_ATTRNUMBER_ARRAY(sortColIdx, local_node->numSortCols); + READ_OID_ARRAY(sortOperators, local_node->numSortCols); + READ_OID_ARRAY(collations, local_node->numSortCols); + READ_BOOL_ARRAY(nullsFirst, local_node->numSortCols); + + READ_INT_FIELD(segidColIdx); + READ_INT_FIELD(numHashSegments); + READ_DONE(); } -static JsonFormat * -_readJsonFormat(void) +static OidAssignment * +_readOidAssignment(void) { - READ_LOCALS(JsonFormat); - - READ_ENUM_FIELD(format_type, JsonFormatType); - READ_ENUM_FIELD(encoding, JsonEncoding); - READ_LOCATION_FIELD(location); + READ_LOCALS(OidAssignment); + READ_OID_FIELD(catalog); + READ_STRING_FIELD(objname); + READ_OID_FIELD(namespaceOid); + READ_OID_FIELD(keyOid1); + READ_OID_FIELD(keyOid2); + READ_OID_FIELD(oid); READ_DONE(); } -#include "readfuncs_common.c" -#ifndef COMPILING_BINARY_FUNCS /* * parseNodeString * @@ -3106,8 +1033,6 @@ _readJsonFormat(void) Node * parseNodeString(void) { - void *return_value; - READ_TEMP_LOCALS(); /* Guard against stack overflow due to overly complex expressions */ @@ -3118,534 +1043,10 @@ parseNodeString(void) #define MATCH(tokname, namelen) \ (length == namelen && memcmp(token, tokname, namelen) == 0) - /* - * Same as MATCH, but we make our life a bit easier by relying on the - * compiler to be smart, and evaluate the strlen("") at - * compilation time for us. - */ -#define MATCHX(tokname) \ - (length == strlen(tokname) && strncmp(token, tokname, strlen(tokname)) == 0) - - if (MATCH("QUERY", 5)) - return_value = _readQuery(); - else if (MATCH("WITHCHECKOPTION", 15)) - return_value = _readWithCheckOption(); - else if (MATCH("SORTGROUPCLAUSE", 15)) - return_value = _readSortGroupClause(); - else if (MATCH("GROUPINGSET", 11)) - return_value = _readGroupingSet(); - else if (MATCH("WINDOWCLAUSE", 12)) - return_value = _readWindowClause(); - else if (MATCH("ROWMARKCLAUSE", 13)) - return_value = _readRowMarkClause(); - else if (MATCH("CTESEARCHCLAUSE", 15)) - return_value = _readCTESearchClause(); - else if (MATCH("CTECYCLECLAUSE", 14)) - return_value = _readCTECycleClause(); - else if (MATCH("COMMONTABLEEXPR", 15)) - return_value = _readCommonTableExpr(); - else if (MATCH("SETOPERATIONSTMT", 16)) - return_value = _readSetOperationStmt(); - else if (MATCH("ALIAS", 5)) - return_value = _readAlias(); - else if (MATCH("RANGEVAR", 8)) - return_value = _readRangeVar(); - else if (MATCH("INTOCLAUSE", 10)) - return_value = _readIntoClause(); - else if (MATCH("COPYINTOCLAUSE", 14)) - return_value = _readCopyIntoClause(); - else if (MATCH("REFRESHCLAUSE", 13)) - return_value = _readRefreshClause(); - else if (MATCH("TABLEFUNC", 9)) - return_value = _readTableFunc(); - else if (MATCH("VAR", 3)) - return_value = _readVar(); - else if (MATCH("CONST", 5)) - return_value = _readConst(); - else if (MATCH("PARAM", 5)) - return_value = _readParam(); - else if (MATCH("AGGREF", 6)) - return_value = _readAggref(); - else if (MATCH("GROUPINGFUNC", 12)) - return_value = _readGroupingFunc(); - else if (MATCH("GROUPID", 7)) - return_value = _readGroupId(); - else if (MATCH("GROUPINGSETID", 13)) - return_value = _readGroupingSetId(); - else if (MATCH("WINDOWFUNC", 10)) - return_value = _readWindowFunc(); - else if (MATCH("SUBSCRIPTINGREF", 15)) - return_value = _readSubscriptingRef(); - else if (MATCH("FUNCEXPR", 8)) - return_value = _readFuncExpr(); - else if (MATCH("NAMEDARGEXPR", 12)) - return_value = _readNamedArgExpr(); - else if (MATCH("OPEXPR", 6)) - return_value = _readOpExpr(); - else if (MATCH("DISTINCTEXPR", 12)) - return_value = _readDistinctExpr(); - else if (MATCH("NULLIFEXPR", 10)) - return_value = _readNullIfExpr(); - else if (MATCH("SCALARARRAYOPEXPR", 17)) - return_value = _readScalarArrayOpExpr(); - else if (MATCH("BOOLEXPR", 8)) - return_value = _readBoolExpr(); - else if (MATCH("SUBLINK", 7)) - return_value = _readSubLink(); - else if (MATCH("FIELDSELECT", 11)) - return_value = _readFieldSelect(); - else if (MATCH("FIELDSTORE", 10)) - return_value = _readFieldStore(); - else if (MATCH("RELABELTYPE", 11)) - return_value = _readRelabelType(); - else if (MATCH("COERCEVIAIO", 11)) - return_value = _readCoerceViaIO(); - else if (MATCH("ARRAYCOERCEEXPR", 15)) - return_value = _readArrayCoerceExpr(); - else if (MATCH("CONVERTROWTYPEEXPR", 18)) - return_value = _readConvertRowtypeExpr(); - else if (MATCH("COLLATE", 7)) - return_value = _readCollateExpr(); - else if (MATCH("CASE", 4)) - return_value = _readCaseExpr(); - else if (MATCH("WHEN", 4)) - return_value = _readCaseWhen(); - else if (MATCH("CASETESTEXPR", 12)) - return_value = _readCaseTestExpr(); - else if (MATCH("ARRAY", 5)) - return_value = _readArrayExpr(); - else if (MATCH("ROW", 3)) - return_value = _readRowExpr(); - else if (MATCH("ROWCOMPARE", 10)) - return_value = _readRowCompareExpr(); - else if (MATCH("COALESCE", 8)) - return_value = _readCoalesceExpr(); - else if (MATCH("MINMAX", 6)) - return_value = _readMinMaxExpr(); - else if (MATCH("SQLVALUEFUNCTION", 16)) - return_value = _readSQLValueFunction(); - else if (MATCH("XMLEXPR", 7)) - return_value = _readXmlExpr(); - else if (MATCH("NULLTEST", 8)) - return_value = _readNullTest(); - else if (MATCH("BOOLEANTEST", 11)) - return_value = _readBooleanTest(); - else if (MATCH("COERCETODOMAIN", 14)) - return_value = _readCoerceToDomain(); - else if (MATCH("COERCETODOMAINVALUE", 19)) - return_value = _readCoerceToDomainValue(); - else if (MATCH("SETTODEFAULT", 12)) - return_value = _readSetToDefault(); - else if (MATCH("CURRENTOFEXPR", 13)) - return_value = _readCurrentOfExpr(); - else if (MATCH("NEXTVALUEEXPR", 13)) - return_value = _readNextValueExpr(); - else if (MATCH("INFERENCEELEM", 13)) - return_value = _readInferenceElem(); - else if (MATCH("TARGETENTRY", 11)) - return_value = _readTargetEntry(); - else if (MATCH("RANGETBLREF", 11)) - return_value = _readRangeTblRef(); - else if (MATCH("JOINEXPR", 8)) - return_value = _readJoinExpr(); - else if (MATCH("FROMEXPR", 8)) - return_value = _readFromExpr(); - else if (MATCH("ONCONFLICTEXPR", 14)) - return_value = _readOnConflictExpr(); - else if (MATCH("APPENDRELINFO", 13)) - return_value = _readAppendRelInfo(); - else if (MATCH("RTE", 3)) - return_value = _readRangeTblEntry(); - else if (MATCH("RANGETBLFUNCTION", 16)) - return_value = _readRangeTblFunction(); - else if (MATCH("TABLESAMPLECLAUSE", 17)) - return_value = _readTableSampleClause(); - else if (MATCH("NOTIFY", 6)) - return_value = _readNotifyStmt(); - else if (MATCH("DEFELEM", 7)) - return_value = _readDefElem(); - else if (MATCH("DECLARECURSOR", 13)) - return_value = _readDeclareCursorStmt(); - else if (MATCH("PLANNEDSTMT", 11)) - return_value = _readPlannedStmt(); - else if (MATCH("PLAN", 4)) - return_value = _readPlan(); - else if (MATCH("RESULT", 6)) - return_value = _readResult(); - else if (MATCH("PROJECTSET", 10)) - return_value = _readProjectSet(); - else if (MATCH("MODIFYTABLE", 11)) - return_value = _readModifyTable(); - else if (MATCH("APPEND", 6)) - return_value = _readAppend(); - else if (MATCH("MERGEAPPEND", 11)) - return_value = _readMergeAppend(); - else if (MATCH("RECURSIVEUNION", 14)) - return_value = _readRecursiveUnion(); - else if (MATCH("BITMAPAND", 9)) - return_value = _readBitmapAnd(); - else if (MATCH("BITMAPOR", 8)) - return_value = _readBitmapOr(); - else if (MATCH("SCAN", 4)) - return_value = _readScan(); - else if (MATCH("SEQSCAN", 7)) - return_value = _readSeqScan(); - else if (MATCH("SAMPLESCAN", 10)) - return_value = _readSampleScan(); - else if (MATCH("INDEXSCAN", 9)) - return_value = _readIndexScan(); - else if (MATCH("DYNAMICINDEXSCAN", 16)) - return_value = _readDynamicIndexScan(); - else if (MATCH("DYNAMICINDEXONLYSCAN", 20)) - return_value = _readDynamicIndexOnlyScan(); - else if (MATCH("INDEXONLYSCAN", 13)) - return_value = _readIndexOnlyScan(); - else if (MATCH("BITMAPINDEXSCAN", 15)) - return_value = _readBitmapIndexScan(); - else if (MATCH("DYNAMICBITMAPINDEXSCAN", 23)) - return_value = _readDynamicBitmapIndexScan(); - else if (MATCH("BITMAPHEAPSCAN", 14)) - return_value = _readBitmapHeapScan(); - else if (MATCH("DYNAMICBITMAPHEAPSCAN", 21)) - return_value = _readDynamicBitmapHeapScan(); - else if (MATCH("TIDSCAN", 7)) - return_value = _readTidScan(); - else if (MATCH("TIDRANGESCAN", 12)) - return_value = _readTidRangeScan(); - else if (MATCH("SUBQUERYSCAN", 12)) - return_value = _readSubqueryScan(); - else if (MATCH("TABLEFUNCTIONSCAN", 17)) - return_value = _readTableFunctionScan(); - else if (MATCH("FUNCTIONSCAN", 12)) - return_value = _readFunctionScan(); - else if (MATCH("VALUESSCAN", 10)) - return_value = _readValuesScan(); - else if (MATCH("TABLEFUNCSCAN", 13)) - return_value = _readTableFuncScan(); - else if (MATCH("CTESCAN", 7)) - return_value = _readCteScan(); - else if (MATCH("NAMEDTUPLESTORESCAN", 19)) - return_value = _readNamedTuplestoreScan(); - else if (MATCH("WORKTABLESCAN", 13)) - return_value = _readWorkTableScan(); - else if (MATCH("FOREIGNSCAN", 11)) - return_value = _readForeignScan(); - else if (MATCH("DYNAMICFOREIGNSCAN", 18)) - return_value = _readDynamicForeignScan(); - else if (MATCH("CUSTOMSCAN", 10)) - return_value = _readCustomScan(); - else if (MATCH("JOIN", 4)) - return_value = _readJoin(); - else if (MATCH("NESTLOOP", 8)) - return_value = _readNestLoop(); - else if (MATCH("MERGEJOIN", 9)) - return_value = _readMergeJoin(); - else if (MATCH("HASHJOIN", 8)) - return_value = _readHashJoin(); - else if (MATCH("MATERIAL", 8)) - return_value = _readMaterial(); - else if (MATCH("MEMOIZE", 7)) - return_value = _readMemoize(); - else if (MATCH("SORT", 4)) - return_value = _readSort(); - else if (MATCH("INCREMENTALSORT", 15)) - return_value = _readIncrementalSort(); - else if (MATCH("GROUP", 5)) - return_value = _readGroup(); - else if (MATCH("AGG", 3)) - return_value = _readAgg(); - else if (MATCH("TupleSplit", 10)) - return_value = _readTupleSplit(); - else if (MATCH("DQAExpr", 7)) - return_value = _readDQAExpr(); - else if (MATCH("WINDOWAGG", 9)) - return_value = _readWindowAgg(); - else if (MATCH("WINDOWHASHAGG", 13)) - return_value = _readWindowHashAgg(); - else if (MATCH("UNIQUE", 6)) - return_value = _readUnique(); - else if (MATCH("GATHER", 6)) - return_value = _readGather(); - else if (MATCH("GATHERMERGE", 11)) - return_value = _readGatherMerge(); - else if (MATCH("HASH", 4)) - return_value = _readHash(); - else if (MATCH("SETOP", 5)) - return_value = _readSetOp(); - else if (MATCH("LOCKROWS", 8)) - return_value = _readLockRows(); - else if (MATCH("RUNTIMEFILTER", 13)) - return_value = _readRuntimeFilter(); - else if (MATCH("LIMIT", 5)) - return_value = _readLimit(); - else if (MATCH("NESTLOOPPARAM", 13)) - return_value = _readNestLoopParam(); - else if (MATCH("PLANROWMARK", 11)) - return_value = _readPlanRowMark(); - else if (MATCH("PARTITIONPRUNEINFO", 18)) - return_value = _readPartitionPruneInfo(); - else if (MATCH("PARTITIONEDRELPRUNEINFO", 23)) - return_value = _readPartitionedRelPruneInfo(); - else if (MATCH("PARTITIONPRUNESTEPOP", 20)) - return_value = _readPartitionPruneStepOp(); - else if (MATCH("PARTITIONPRUNESTEPCOMBINE", 25)) - return_value = _readPartitionPruneStepCombine(); - else if (MATCH("PLANINVALITEM", 13)) - return_value = _readPlanInvalItem(); - else if (MATCH("SUBPLAN", 7)) - return_value = _readSubPlan(); - else if (MATCH("ALTERNATIVESUBPLAN", 18)) - return_value = _readAlternativeSubPlan(); - else if (MATCH("RESTRICTINFO", 12)) - return_value = _readRestrictInfo(); - else if (MATCH("EXTENSIBLENODE", 14)) - return_value = _readExtensibleNode(); - else if (MATCH("PARTITIONBOUNDSPEC", 18)) - return_value = _readPartitionBoundSpec(); - else if (MATCH("PARTITIONRANGEDATUM", 19)) - return_value = _readPartitionRangeDatum(); - else if (MATCH("PARTITIONSPEC", 13)) - return_value = _readPartitionSpec(); - else if (MATCH("PARTITIONELEM", 13)) - return_value = _readPartitionElem(); - else if (MATCHX("PARTITIONCMD")) - return_value = _readPartitionCmd(); - - /* GPDB additions */ - else if (MATCHX("A_ARRAYEXPR")) - return_value = _readA_ArrayExpr(); - else if (MATCHX("A_CONST")) - return_value = _readAConst(); - else if (MATCHX("AEXPR")) - return_value = _readAExpr(); - else if (MATCHX("ALTERDOMAINSTMT")) - return_value = _readAlterDomainStmt(); - else if (MATCHX("ALTERFUNCTIONSTMT")) - return_value = _readAlterFunctionStmt(); - else if (MATCHX("ALTEROBJECTSCHEMASTMT")) - return_value = _readAlterObjectSchemaStmt(); - else if (MATCHX("ALTEROWNERSTMT")) - return_value = _readAlterOwnerStmt(); - else if (MATCHX("ALTEROPFAMILYSTMT")) - return_value = _readAlterOpFamilyStmt(); - else if (MATCHX("ALTERPOLICYSTMT")) - return_value = _readAlterPolicyStmt(); - else if (MATCHX("ALTERROLESETSTMT")) - return_value = _readAlterRoleSetStmt(); - else if (MATCHX("ALTERSYSTEMSTMT")) - return_value = _readAlterSystemStmt(); - else if (MATCHX("ALTERROLESTMT")) - return_value = _readAlterRoleStmt(); - else if (MATCHX("ALTERPROFILESTMT")) - return_value = _readAlterProfileStmt(); - else if (MATCHX("ALTERSEQSTMT")) - return_value = _readAlterSeqStmt(); - else if (MATCHX("ALTERTABLECMD")) - return_value = _readAlterTableCmd(); - else if (MATCHX("ALTEREDTABLEINFO")) - return_value = _readAlteredTableInfo(); - else if (MATCHX("NEWCONSTRAINT")) - return_value = _readNewConstraint(); - else if (MATCHX("NEWCOLUMNVALUE")) - return_value = _readNewColumnValue(); - else if (MATCHX("ALTERTABLESTMT")) - return_value = _readAlterTableStmt(); - else if (MATCHX("ALTERTYPESTMT")) - return_value = _readAlterTypeStmt(); - else if (MATCHX("CDBPROCESS")) - return_value = _readCdbProcess(); - else if (MATCHX("CLUSTERSTMT")) - return_value = _readClusterStmt(); - else if (MATCHX("COLUMNDEF")) - return_value = _readColumnDef(); - else if (MATCHX("COLUMNREF")) - return_value = _readColumnRef(); - else if (MATCHX("PARAMREF")) - return_value = _readParamRef(); - else if (MATCHX("COMMONTABLEEXPR")) - return_value = _readCommonTableExpr(); - else if (MATCHX("COMPTYPESTMT")) - return_value = _readCompositeTypeStmt(); - else if (MATCHX("CONSTRAINT")) - return_value = _readConstraint(); - else if (MATCHX("CONSTRAINTSSETSTMT")) - return_value = _readConstraintsSetStmt(); - else if (MATCHX("CREATECAST")) - return_value = _readCreateCastStmt(); - else if (MATCHX("CREATECONVERSION")) - return_value = _readCreateConversionStmt(); - else if (MATCHX("CREATEDBSTMT")) - return_value = _readCreatedbStmt(); - else if (MATCHX("CREATEDOMAINSTMT")) - return_value = _readCreateDomainStmt(); - else if (MATCHX("CREATEENUMSTMT")) - return_value = _readCreateEnumStmt(); - else if (MATCHX("CREATEEXTERNALSTMT")) - return_value = _readCreateExternalStmt(); - else if (MATCHX("CREATEFUNCSTMT")) - return_value = _readCreateFunctionStmt(); - else if (MATCHX("CREATEOPCLASS")) - return_value = _readCreateOpClassStmt(); - else if (MATCHX("CREATEOPCLASSITEM")) - return_value = _readCreateOpClassItem(); - else if (MATCHX("CREATEOPFAMILYSTMT")) - return_value = _readCreateOpFamilyStmt(); - else if (MATCHX("CREATEPLANGSTMT")) - return_value = _readCreatePLangStmt(); - else if (MATCHX("CREATEPUBLICATIONSTMT")) - return_value = _readCreatePublicationStmt(); - else if (MATCHX("ALTERPUBLICATIONSTMT")) - return_value = _readAlterPublicationStmt(); - else if (MATCHX("CREATESUBSCRIPTIONSTMT")) - return_value = _readCreateSubscriptionStmt(); - else if (MATCHX("DROPSUBSCRIPTIONSTMT")) - return_value = _readDropSubscriptionStmt(); - else if (MATCHX("ALTERSUBSCRIPTIONSTMT")) - return_value = _readAlterSubscriptionStmt(); - else if (MATCHX("CREATEPOLICYSTMT")) - return_value = _readCreatePolicyStmt(); - else if (MATCHX("CREATEROLESTMT")) - return_value = _readCreateRoleStmt(); - else if (MATCHX("CREATEPROFILESTMT")) - return_value = _readCreateProfileStmt(); - else if (MATCHX("CREATESCHEMASTMT")) - return_value = _readCreateSchemaStmt(); - else if (MATCHX("ALTERSCHEMASTMT")) - return_value = _readAlterSchemaStmt(); - else if (MATCHX("CREATETAGSTMT")) - return_value = _readCreateTagStmt(); - else if (MATCHX("ALTERTAGSTMT")) - return_value = _readAlterTagStmt(); - else if (MATCHX("DROPTAGSTMT")) - return_value = _readDropTagStmt(); - else if (MATCHX("CREATESEQSTMT")) - return_value = _readCreateSeqStmt(); - else if (MATCHX("CREATETRANSFORMSTMT")) - return_value = _readCreateTransformStmt(); - else if (MATCHX("CURSORPOSINFO")) - return_value = _readCursorPosInfo(); - else if (MATCHX("DEFELEM")) - return_value = _readDefElem(); - else if (MATCHX("DEFINESTMT")) - return_value = _readDefineStmt(); - else if (MATCHX("DENYLOGININTERVAL")) - return_value = _readDenyLoginInterval(); - else if (MATCHX("DENYLOGINPOINT")) - return_value = _readDenyLoginPoint(); - else if (MATCHX("DROPDBSTMT")) - return_value = _readDropdbStmt(); - else if (MATCHX("DROPROLESTMT")) - return_value = _readDropRoleStmt(); - else if (MATCHX("DROPPROFILESTMT")) - return_value = _readDropProfileStmt(); - else if (MATCHX("DROPSTMT")) - return_value = _readDropStmt(); - else if (MATCHX("DISTRIBUTIONKEYELEM")) - return_value = _readDistributionKeyElem(); - else if (MATCHX("EXTTABLETYPEDESC")) - return_value = _readExtTableTypeDesc(); - else if (MATCHX("FUNCCALL")) - return_value = _readFuncCall(); - else if (MATCHX("FUNCTIONPARAMETER")) - return_value = _readFunctionParameter(); - else if (MATCHX("OBJECTWITHARGS")) - return_value = _readObjectWithArgs(); - else if (MATCHX("GRANTROLESTMT")) - return_value = _readGrantRoleStmt(); - else if (MATCHX("GRANTSTMT")) - return_value = _readGrantStmt(); - else if (MATCHX("INDEXELEM")) - return_value = _readIndexElem(); - else if (MATCHX("INDEXSTMT")) - return_value = _readIndexStmt(); - else if (MATCHX("LOCKSTMT")) - return_value = _readLockStmt(); - else if (MATCHX("REINDEXSTMT")) - return_value = _readReindexStmt(); - else if (MATCHX("REINDEXINDEXINFO")) - return_value = _readReindexIndexInfo(); - else if (MATCHX("RENAMESTMT")) - return_value = _readRenameStmt(); - else if (MATCHX("REPLICAIDENTITYSTMT")) - return_value = _readReplicaIdentityStmt(); - else if (MATCHX("RULESTMT")) - return_value = _readRuleStmt(); - else if (MATCHX("SEGFILEMAPNODE")) - return_value = _readSegfileMapNode(); - else if (MATCHX("SINGLEROWERRORDESC")) - return_value = _readSingleRowErrorDesc(); - else if (MATCHX("SLICETABLE")) - return_value = _readSliceTable(); - else if (MATCHX("SORTBY")) - return_value = _readSortBy(); - else if (MATCHX("TABLEVALUEEXPR")) - return_value = _readTableValueExpr(); - else if (MATCHX("TRUNCATESTMT")) - return_value = _readTruncateStmt(); - else if (MATCHX("TYPECAST")) - return_value = _readTypeCast(); - else if (MATCHX("TYPENAME")) - return_value = _readTypeName(); - else if (MATCHX("VACUUMSTMT")) - return_value = _readVacuumStmt(); - else if (MATCHX("VACUUMRELATION")) - return_value = _readVacuumRelation(); - else if (MATCHX("VARIABLESETSTMT")) - return_value = _readVariableSetStmt(); - else if (MATCHX("VIEWSTMT")) - return_value = _readViewStmt(); - else if (MATCHX("WITHCLAUSE")) - return_value = _readWithClause(); - else if (MATCHX("GPPARTITIONDEFINITION")) - return_value = _readGpPartitionDefinition(); - else if (MATCHX("GPPARTDEFELEM")) - return_value = _readGpPartDefElem(); - else if (MATCHX("GPPARTITIONRANGEITEM")) - return_value = _readGpPartitionRangeItem(); - else if (MATCHX("GPPARTITIONRANGESPEC")) - return_value = _readGpPartitionRangeSpec(); - else if (MATCHX("GPPARTITIONLISTSPEC")) - return_value = _readGpPartitionListSpec(); - else if (MATCHX("COLUMNREFERENCESTORAGEDIRECTIVE")) - return_value = _readColumnReferenceStorageDirective(); - else if (MATCHX("RETURN")) - return_value = _readReturnStmt(); - else if (MATCHX("DROPDIRECTORYTABLESTMT")) - return_value = _readDropDirectoryTableStmt(); - else if (MATCHX("RTEPERMISSIONINFO")) - return_value = _readRTEPermissionInfo(); - else if (MATCHX("GPPOLICY")) - return_value = _readGpPolicy(); - else if (MATCHX("MERGEACTION")) - return_value = _readMergeAction(); - else if (MATCHX("PUBLICATIONOBJSPEC")) - return_value = _readPublicationObjSpec(); - else if (MATCHX("PUBLICATIONTABLE")) - return_value = _readPublicationTable(); - else if (MATCHX("WINDOWDEF")) - return_value = _readWindowDef(); - else if (MATCHX("JSONCONSTRUCTOREXPR")) - return_value = _readJsonConstructorExpr(); - else if (MATCHX("JSONISPREDICATE")) - return_value = _readJsonIsPredicate(); - else if (MATCHX("JSONRETURNING")) - return_value = _readJsonReturning(); - else if (MATCHX("JSONVALUEEXPR")) - return_value = _readJsonValueExpr(); - else if (MATCHX("JSONFORMAT")) - return_value = _readJsonFormat(); - else - { - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("This operation involves an internal data item " - "of a type called \"%.*s\" which is not " - "supported in this version of %s.", - length, token, PACKAGE_NAME))); - return_value = NULL; /* keep compiler quiet */ - } +#include "readfuncs.switch.c" - return (Node *) return_value; + elog(ERROR, "badly formatted node string \"%.32s\"...", token); + return NULL; /* keep compiler quiet */ } @@ -3711,98 +1112,47 @@ readDatum(bool typbyval) } /* - * readAttrNumberCols - */ -AttrNumber * -readAttrNumberCols(int numCols) -{ - int tokenLength, - i; - const char *token; - AttrNumber *attr_vals; - - if (numCols <= 0) - return NULL; - - attr_vals = (AttrNumber *) palloc(numCols * sizeof(AttrNumber)); - for (i = 0; i < numCols; i++) - { - token = pg_strtok(&tokenLength); - attr_vals[i] = atoi(token); - } - - return attr_vals; -} - -/* - * readOidCols - */ -Oid * -readOidCols(int numCols) -{ - int tokenLength, - i; - const char *token; - Oid *oid_vals; - - if (numCols <= 0) - return NULL; - - oid_vals = (Oid *) palloc(numCols * sizeof(Oid)); - for (i = 0; i < numCols; i++) - { - token = pg_strtok(&tokenLength); - oid_vals[i] = atooid(token); - } - - return oid_vals; -} - -/* - * readIntCols - */ -int * -readIntCols(int numCols) -{ - int tokenLength, - i; - const char *token; - int *int_vals; - - if (numCols <= 0) - return NULL; - - int_vals = (int *) palloc(numCols * sizeof(int)); - for (i = 0; i < numCols; i++) - { - token = pg_strtok(&tokenLength); - int_vals[i] = atoi(token); - } - - return int_vals; -} - -/* - * readBoolCols - */ -bool * -readBoolCols(int numCols) -{ - int tokenLength, - i; - const char *token; - bool *bool_vals; - - if (numCols <= 0) - return NULL; - - bool_vals = (bool *) palloc(numCols * sizeof(bool)); - for (i = 0; i < numCols; i++) - { - token = pg_strtok(&tokenLength); - bool_vals[i] = strtobool(token); - } - - return bool_vals; -} -#endif + * common implementation for scalar-array-reading functions + * + * The data format is either "<>" for a NULL pointer (in which case numCols + * is ignored) or "(item item item)" where the number of items must equal + * numCols. The convfunc must be okay with stopping at whitespace or a + * right parenthesis, since pg_strtok won't null-terminate the token. + */ +#define READ_SCALAR_ARRAY(fnname, datatype, convfunc) \ +datatype * \ +fnname(int numCols) \ +{ \ + datatype *vals; \ + READ_TEMP_LOCALS(); \ + token = pg_strtok(&length); \ + if (token == NULL) \ + elog(ERROR, "incomplete scalar array"); \ + if (length == 0) \ + return NULL; /* it was "<>", so return NULL pointer */ \ + if (length != 1 || token[0] != '(') \ + elog(ERROR, "unrecognized token: \"%.*s\"", length, token); \ + vals = (datatype *) palloc(numCols * sizeof(datatype)); \ + for (int i = 0; i < numCols; i++) \ + { \ + token = pg_strtok(&length); \ + if (token == NULL || token[0] == ')') \ + elog(ERROR, "incomplete scalar array"); \ + vals[i] = convfunc(token); \ + } \ + token = pg_strtok(&length); \ + if (token == NULL || length != 1 || token[0] != ')') \ + elog(ERROR, "incomplete scalar array"); \ + return vals; \ +} + +/* + * Note: these functions are exported in nodes.h for possible use by + * extensions, so don't mess too much with their names or API. + */ +READ_SCALAR_ARRAY(readAttrNumberCols, int16, atoi) +READ_SCALAR_ARRAY(readOidCols, Oid, atooid) +/* outfuncs.c has writeIndexCols, but we don't yet need that here */ +/* READ_SCALAR_ARRAY(readIndexCols, Index, atoui) */ +READ_SCALAR_ARRAY(readIntCols, int, atoi) +READ_SCALAR_ARRAY(readBoolCols, bool, strtobool) diff --git a/src/backend/nodes/readfuncs_common.c b/src/backend/nodes/readfuncs_common.c deleted file mode 100644 index f895e4a4468..00000000000 --- a/src/backend/nodes/readfuncs_common.c +++ /dev/null @@ -1,1916 +0,0 @@ -/*------------------------------------------------------------------------- - * - * readfuncs_common.c - * Common de-serialization functions for Postgres tree nodes. - * - * Portions Copyright (c) 2005-2010, Greenplum inc - * Portions Copyright (c) 2012-Present VMware, Inc. or its affiliates. - * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group - * - * - * NOTES - * This file contains all common de-serialization functions for both - * binary and text representations, and de-serialization functions - * that are Cloudberry-specific for text representation. - * - * All text-representation only functions are guarded by the macro - * `COMPILING_BINARY_FUNCS`, they appear first in this file. - * - * This C source file SHOULD not be compiled alone, it MUST be - * only be included by readfuncs.c, so we intended to not complete - * the header files. - * - * When you consider adding new de-serialization functions, you should - * folow these rules: - * 1. Do not add any functions(Cloudberry-specific) to readfuncs.c - * 2. Add functions to readfuncs_common.c that can be used for both - * binary and text representations. - * 3. Add functions to readfast.c if these functions can only be used - * for binary representation. - * 4. Add functions to readfuncs_common.c if these functions can only - * be used for text representation. - * - *------------------------------------------------------------------------- - */ - -static void unwrapStringList(List *list); - -/* functions only used for text representation */ -#ifndef COMPILING_BINARY_FUNCS - - - -static A_Const * -_readAConst(void) -{ - READ_LOCALS(A_Const); - - /* We expect either NULL or :val here */ - token = pg_strtok(&length); - if (length == 4 && strncmp(token, "NULL", 4) == 0) - local_node->isnull = true; - else - { - union ValUnion *tmp = nodeRead(NULL, 0); - - /* To forestall valgrind complaints, copy only the valid data */ - switch (nodeTag(tmp)) - { - case T_Integer: - memcpy(&local_node->val, tmp, sizeof(Integer)); - break; - case T_Float: - memcpy(&local_node->val, tmp, sizeof(Float)); - break; - case T_Boolean: - memcpy(&local_node->val, tmp, sizeof(Boolean)); - break; - case T_String: - memcpy(&local_node->val, tmp, sizeof(String)); - break; - case T_BitString: - memcpy(&local_node->val, tmp, sizeof(BitString)); - break; - default: - elog(ERROR, "unrecognized node type: %d", - (int) nodeTag(tmp)); - break; - } - } - - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static A_Expr * -_readAExpr(void) -{ - READ_LOCALS(A_Expr); - - token = pg_strtok(&length); - - if (strncmp(token,"OPER",length)==0) - { - local_node->kind = AEXPR_OP; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"ANY",length)==0) - { - local_node->kind = AEXPR_OP_ANY; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"ALL",length)==0) - { - local_node->kind = AEXPR_OP_ALL; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"DISTINCT",length)==0) - { - local_node->kind = AEXPR_DISTINCT; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"NOT_DISTINCT",length)==0) - { - local_node->kind = AEXPR_NOT_DISTINCT; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"NULLIF",length)==0) - { - local_node->kind = AEXPR_NULLIF; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"IN",length)==0) - { - local_node->kind = AEXPR_IN; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"LIKE",length)==0) - { - local_node->kind = AEXPR_LIKE; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"ILIKE",length)==0) - { - local_node->kind = AEXPR_ILIKE; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"SIMILAR",length)==0) - { - local_node->kind = AEXPR_SIMILAR; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"BETWEEN",length)==0) - { - local_node->kind = AEXPR_BETWEEN; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"NOT_BETWEEN",length)==0) - { - local_node->kind = AEXPR_NOT_BETWEEN; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"BETWEEN_SYM",length)==0) - { - local_node->kind = AEXPR_BETWEEN_SYM; - READ_NODE_FIELD(name); - } - else if (strncmp(token,"NOT_BETWEEN_SYM",length)==0) - { - local_node->kind = AEXPR_NOT_BETWEEN_SYM; - READ_NODE_FIELD(name); - } - else - { - elog(ERROR,"Unable to understand A_Expr node %.30s",token); - } - - READ_NODE_FIELD(lexpr); - READ_NODE_FIELD(rexpr); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -#endif - -/* common functions for both formats */ - -static GpPartDefElem * -_readGpPartDefElem(void) -{ - READ_LOCALS(GpPartDefElem); - - READ_STRING_FIELD(partName); - READ_NODE_FIELD(boundSpec); - READ_NODE_FIELD(subSpec); - READ_BOOL_FIELD(isDefault); - READ_NODE_FIELD(options); - READ_STRING_FIELD(accessMethod); - READ_STRING_FIELD(tablespacename); - READ_NODE_FIELD(colencs); - - READ_DONE(); -} - -static GpPartitionRangeItem * -_readGpPartitionRangeItem(void) -{ - READ_LOCALS(GpPartitionRangeItem); - - READ_NODE_FIELD(val); - READ_ENUM_FIELD(edge, GpPartitionEdgeBounding); - - READ_DONE(); -} - -static GpPartitionRangeSpec * -_readGpPartitionRangeSpec(void) -{ - READ_LOCALS(GpPartitionRangeSpec); - - READ_NODE_FIELD(partStart); - READ_NODE_FIELD(partEnd); - READ_NODE_FIELD(partEvery); - - READ_DONE(); -} - -static GpPartitionListSpec * -_readGpPartitionListSpec(void) -{ - READ_LOCALS(GpPartitionListSpec); - - READ_NODE_FIELD(partValues); - - READ_DONE(); -} - -static GpPartitionDefinition * -_readGpPartitionDefinition(void) -{ - READ_LOCALS(GpPartitionDefinition); - - READ_NODE_FIELD(partDefElems); - READ_NODE_FIELD(encClauses); - READ_BOOL_FIELD(isTemplate); - - READ_DONE(); -} - -/* - * _readA_ArrayExpr - */ -static A_ArrayExpr * -_readA_ArrayExpr(void) -{ - READ_LOCALS(A_ArrayExpr); - - READ_NODE_FIELD(elements); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static AlterDomainStmt * -_readAlterDomainStmt(void) -{ - READ_LOCALS(AlterDomainStmt); - - READ_CHAR_FIELD(subtype); - READ_NODE_FIELD(typeName); - READ_STRING_FIELD(name); - READ_NODE_FIELD(def); - READ_ENUM_FIELD(behavior, DropBehavior); - Assert(local_node->behavior <= DROP_CASCADE); - - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static AlterFunctionStmt * -_readAlterFunctionStmt(void) -{ - READ_LOCALS(AlterFunctionStmt); - READ_ENUM_FIELD(objtype,ObjectType); - READ_NODE_FIELD(func); - READ_NODE_FIELD(actions); - - READ_DONE(); -} - -static AlterObjectSchemaStmt * -_readAlterObjectSchemaStmt(void) -{ - READ_LOCALS(AlterObjectSchemaStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(object); - READ_STRING_FIELD(newschema); - READ_BOOL_FIELD(missing_ok); - READ_ENUM_FIELD(objectType,ObjectType); - - READ_DONE(); -} - -static AlterOpFamilyStmt * -_readAlterOpFamilyStmt(void) -{ - READ_LOCALS(AlterOpFamilyStmt); - READ_NODE_FIELD(opfamilyname); - READ_STRING_FIELD(amname); - READ_BOOL_FIELD(isDrop); - READ_NODE_FIELD(items); - - READ_DONE(); -} - -static AlterOwnerStmt * -_readAlterOwnerStmt(void) -{ - READ_LOCALS(AlterOwnerStmt); - - READ_ENUM_FIELD(objectType,ObjectType); - READ_NODE_FIELD(relation); - READ_NODE_FIELD(object); - READ_NODE_FIELD(newowner); - - READ_DONE(); -} - -static AlterPolicyStmt * -_readAlterPolicyStmt() -{ - READ_LOCALS(AlterPolicyStmt); - - READ_STRING_FIELD(policy_name); - READ_NODE_FIELD(table); - READ_NODE_FIELD(roles); - READ_NODE_FIELD(qual); - READ_NODE_FIELD(with_check); - - READ_DONE(); -} - -static AlterPublicationStmt * -_readAlterPublicationStmt() -{ - READ_LOCALS(AlterPublicationStmt); - - READ_STRING_FIELD(pubname); - READ_NODE_FIELD(options); - READ_NODE_FIELD(pubobjects); - READ_BOOL_FIELD(for_all_tables); - READ_ENUM_FIELD(action, AlterPublicationAction); - - READ_DONE(); -} - -static AlterRoleSetStmt * -_readAlterRoleSetStmt(void) -{ - READ_LOCALS(AlterRoleSetStmt); - - READ_NODE_FIELD(role); - READ_NODE_FIELD(setstmt); - - READ_DONE(); -} - -static AlterRoleStmt * -_readAlterRoleStmt(void) -{ - READ_LOCALS(AlterRoleStmt); - - READ_NODE_FIELD(role); - READ_NODE_FIELD(options); - READ_INT_FIELD(action); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); - - READ_DONE(); -} - -static AlterProfileStmt * -_readAlterProfileStmt(void) -{ - READ_LOCALS(AlterProfileStmt); - - READ_STRING_FIELD(profile_name); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterSeqStmt * -_readAlterSeqStmt(void) -{ - READ_LOCALS(AlterSeqStmt); - - READ_NODE_FIELD(sequence); - READ_NODE_FIELD(options); - READ_BOOL_FIELD(for_identity); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static AlterSubscriptionStmt * -_readAlterSubscriptionStmt() -{ - READ_LOCALS(AlterSubscriptionStmt); - - READ_ENUM_FIELD(kind, AlterSubscriptionType); - READ_STRING_FIELD(subname); - READ_STRING_FIELD(conninfo); - READ_NODE_FIELD(publication); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlterSystemStmt * -_readAlterSystemStmt(void) -{ - READ_LOCALS(AlterSystemStmt); - - READ_NODE_FIELD(setstmt); - - READ_DONE(); -} - -static AlterTableCmd * -_readAlterTableCmd(void) -{ - READ_LOCALS(AlterTableCmd); - - READ_ENUM_FIELD(subtype, AlterTableType); - READ_STRING_FIELD(name); - READ_INT_FIELD(num); - READ_NODE_FIELD(newowner); - READ_NODE_FIELD(def); - READ_NODE_FIELD(transform); - READ_ENUM_FIELD(behavior, DropBehavior); - READ_BOOL_FIELD(missing_ok); - READ_BOOL_FIELD(recurse); - - READ_INT_FIELD(backendId); - READ_NODE_FIELD(policy); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); - - READ_DONE(); -} - -static AlterTableStmt * -_readAlterTableStmt(void) -{ - READ_LOCALS(AlterTableStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(cmds); - READ_ENUM_FIELD(objtype, ObjectType); - READ_INT_FIELD(lockmode); - READ_NODE_FIELD(wqueue); - - READ_DONE(); -} - -static AlterTypeStmt * -_readAlterTypeStmt(void) -{ - READ_LOCALS(AlterTypeStmt); - - READ_NODE_FIELD(typeName); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static AlteredTableInfo * -_readAlteredTableInfo(void) -{ - READ_LOCALS(AlteredTableInfo); - - READ_OID_FIELD(relid); - READ_CHAR_FIELD(relkind); - /* oldDesc is omitted */ - - for (int i = 0; i < AT_NUM_PASSES; i++) - { - READ_NODE_FIELD(subcmds[i]); - } - - READ_NODE_FIELD(constraints); - READ_NODE_FIELD(newvals); - READ_NODE_FIELD(afterStmts); - READ_BOOL_FIELD(verify_new_notnull); - READ_INT_FIELD(rewrite); - READ_OID_FIELD(newAccessMethod); - READ_BOOL_FIELD(dist_opfamily_changed); - READ_OID_FIELD(new_opclass); - READ_BOOL_FIELD(chgPersistence); - READ_CHAR_FIELD(newrelpersistence); - READ_NODE_FIELD(partition_constraint); - READ_BOOL_FIELD(validate_default); - READ_NODE_FIELD(changedConstraintOids); - READ_NODE_FIELD(changedConstraintDefs); - /* The QD sends changedConstraintDefs wrapped in Values. Unwrap them. */ - unwrapStringList(local_node->changedConstraintDefs); - READ_NODE_FIELD(changedIndexOids); - READ_NODE_FIELD(changedIndexDefs); - unwrapStringList(local_node->changedIndexDefs); - READ_NODE_FIELD(beforeStmtLists); - READ_NODE_FIELD(constraintLists); - - READ_DONE(); -} - -static CdbProcess * -_readCdbProcess(void) -{ - READ_LOCALS(CdbProcess); - - READ_STRING_FIELD(listenerAddr); - READ_INT_FIELD(listenerPort); - READ_INT_FIELD(pid); - READ_INT_FIELD(contentid); - READ_INT_FIELD(dbid); - - READ_DONE(); -} - -static ColumnDef * -_readColumnDef(void) -{ - READ_LOCALS(ColumnDef); - - READ_STRING_FIELD(colname); - READ_NODE_FIELD(typeName); - READ_STRING_FIELD(compression); - READ_INT_FIELD(inhcount); - READ_BOOL_FIELD(is_local); - READ_BOOL_FIELD(is_not_null); - READ_BOOL_FIELD(is_from_type); - READ_INT_FIELD(attnum); - READ_INT_FIELD(storage); - READ_STRING_FIELD(storage_name); - READ_NODE_FIELD(raw_default); - READ_NODE_FIELD(cooked_default); - - READ_BOOL_FIELD(hasCookedMissingVal); - READ_BOOL_FIELD(missingIsNull); - if (local_node->hasCookedMissingVal && !local_node->missingIsNull) - local_node->missingVal = readDatum(false); - - READ_CHAR_FIELD(identity); - READ_NODE_FIELD(identitySequence); - READ_CHAR_FIELD(generated); - READ_NODE_FIELD(collClause); - READ_OID_FIELD(collOid); - READ_NODE_FIELD(constraints); - READ_NODE_FIELD(encoding); - READ_NODE_FIELD(fdwoptions); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static ColumnRef * -_readColumnRef(void) -{ - READ_LOCALS(ColumnRef); - - READ_NODE_FIELD(fields); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static ParamRef * -_readParamRef(void) -{ - READ_LOCALS(ParamRef); - - READ_INT_FIELD(number); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static ClusterStmt * -_readClusterStmt(void) -{ - READ_LOCALS(ClusterStmt); - - READ_NODE_FIELD(relation); - READ_STRING_FIELD(indexname); - - READ_DONE(); -} - - -static ColumnReferenceStorageDirective * -_readColumnReferenceStorageDirective(void) -{ - READ_LOCALS(ColumnReferenceStorageDirective); - - READ_STRING_FIELD(column); - READ_BOOL_FIELD(deflt); - READ_NODE_FIELD(encoding); - - READ_DONE(); -} - -static CompositeTypeStmt * -_readCompositeTypeStmt(void) -{ - READ_LOCALS(CompositeTypeStmt); - - READ_NODE_FIELD(typevar); - READ_NODE_FIELD(coldeflist); - - READ_DONE(); -} - -/* - * _readConstraint - */ -static Constraint * -_readConstraint(void) -{ - READ_LOCALS(Constraint); - - READ_ENUM_FIELD(contype, ConstrType); - READ_STRING_FIELD(conname); /* name, or NULL if unnamed */ - READ_BOOL_FIELD(deferrable); - READ_BOOL_FIELD(initdeferred); - READ_LOCATION_FIELD(location); - - READ_BOOL_FIELD(is_no_inherit); - READ_NODE_FIELD(raw_expr); - READ_STRING_FIELD(cooked_expr); - READ_CHAR_FIELD(generated_when); - READ_BOOL_FIELD(nulls_not_distinct); - - READ_NODE_FIELD(keys); - READ_NODE_FIELD(including); - - READ_NODE_FIELD(exclusions); - - READ_NODE_FIELD(options); - READ_STRING_FIELD(indexname); - READ_STRING_FIELD(indexspace); - READ_BOOL_FIELD(reset_default_tblspc); - - READ_STRING_FIELD(access_method); - READ_NODE_FIELD(where_clause); - - READ_NODE_FIELD(pktable); - READ_NODE_FIELD(fk_attrs); - READ_NODE_FIELD(pk_attrs); - READ_CHAR_FIELD(fk_matchtype); - READ_CHAR_FIELD(fk_upd_action); - READ_CHAR_FIELD(fk_del_action); - READ_NODE_FIELD(old_conpfeqop); - READ_OID_FIELD(old_pktable_oid); - - READ_BOOL_FIELD(skip_validation); - READ_BOOL_FIELD(initially_valid); - - READ_DONE(); -} - -static ConstraintsSetStmt * -_readConstraintsSetStmt(void) -{ - READ_LOCALS(ConstraintsSetStmt); - - READ_NODE_FIELD(constraints); - READ_BOOL_FIELD(deferred); - - READ_DONE(); -} - -static CopyIntoClause * -_readCopyIntoClause(void) -{ - READ_LOCALS(CopyIntoClause); - - READ_NODE_FIELD(attlist); - READ_BOOL_FIELD(is_program); - READ_STRING_FIELD(filename); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static CreateCastStmt * -_readCreateCastStmt(void) -{ - READ_LOCALS(CreateCastStmt); - - READ_NODE_FIELD(sourcetype); - READ_NODE_FIELD(targettype); - READ_NODE_FIELD(func); - READ_ENUM_FIELD(context, CoercionContext); - READ_BOOL_FIELD(inout); - - READ_DONE(); -} - -static CreateConversionStmt * -_readCreateConversionStmt(void) -{ - READ_LOCALS(CreateConversionStmt); - - READ_NODE_FIELD(conversion_name); - READ_STRING_FIELD(for_encoding_name); - READ_STRING_FIELD(to_encoding_name); - READ_NODE_FIELD(func_name); - READ_BOOL_FIELD(def); - - READ_DONE(); -} - -static CreateDomainStmt * -_readCreateDomainStmt(void) -{ - READ_LOCALS(CreateDomainStmt); - - READ_NODE_FIELD(domainname); - READ_NODE_FIELD(typeName); - READ_NODE_FIELD(collClause); - READ_NODE_FIELD(constraints); - - READ_DONE(); -} - -static void -_readDropStmt_common(DropStmt *local_node) -{ - READ_TEMP_LOCALS(); - - READ_NODE_FIELD(objects); - READ_ENUM_FIELD(removeType,ObjectType); - READ_ENUM_FIELD(behavior,DropBehavior); - READ_BOOL_FIELD(missing_ok); - READ_BOOL_FIELD(concurrent); - READ_BOOL_FIELD(isdynamic); - - /* Force 'missing_ok' in QEs */ -#ifdef COMPILING_BINARY_FUNCS - local_node->missing_ok=true; -#endif /* COMPILING_BINARY_FUNCS */ -} - -static DropDirectoryTableStmt * -_readDropDirectoryTableStmt(void) -{ - READ_LOCALS(DropDirectoryTableStmt); - - _readDropStmt_common(&local_node->base); - - READ_BOOL_FIELD(with_content); - - READ_DONE(); -} - -static CreateEnumStmt * -_readCreateEnumStmt(void) -{ - READ_LOCALS(CreateEnumStmt); - - READ_NODE_FIELD(typeName); - READ_NODE_FIELD(vals); - - READ_DONE(); -} - -static CreateExternalStmt * -_readCreateExternalStmt(void) -{ - READ_LOCALS(CreateExternalStmt); - - READ_NODE_FIELD(relation); - READ_NODE_FIELD(tableElts); - READ_NODE_FIELD(exttypedesc); - READ_STRING_FIELD(format); - READ_NODE_FIELD(formatOpts); - READ_BOOL_FIELD(isweb); - READ_BOOL_FIELD(iswritable); - READ_NODE_FIELD(sreh); - READ_NODE_FIELD(extOptions); - READ_NODE_FIELD(encoding); - READ_NODE_FIELD(distributedBy); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static CreateFunctionStmt * -_readCreateFunctionStmt(void) -{ - READ_LOCALS(CreateFunctionStmt); - - READ_BOOL_FIELD(is_procedure); - READ_BOOL_FIELD(replace); - READ_NODE_FIELD(funcname); - READ_NODE_FIELD(parameters); - READ_NODE_FIELD(returnType); - READ_NODE_FIELD(options); - READ_NODE_FIELD(sql_body); - - READ_DONE(); -} - -static CreateOpClassItem * -_readCreateOpClassItem(void) -{ - READ_LOCALS(CreateOpClassItem); - READ_INT_FIELD(itemtype); - READ_NODE_FIELD(name); - READ_INT_FIELD(number); - READ_NODE_FIELD(order_family); - READ_NODE_FIELD(class_args); - READ_NODE_FIELD(storedtype); - - READ_DONE(); -} - - -static CreateOpClassStmt * -_readCreateOpClassStmt(void) -{ - READ_LOCALS(CreateOpClassStmt); - - READ_NODE_FIELD(opclassname); - READ_NODE_FIELD(opfamilyname); - READ_STRING_FIELD(amname); - READ_NODE_FIELD(datatype); - READ_NODE_FIELD(items); - READ_BOOL_FIELD(isDefault); - - READ_DONE(); -} - -static CreateOpFamilyStmt * -_readCreateOpFamilyStmt(void) -{ - READ_LOCALS(CreateOpFamilyStmt); - READ_NODE_FIELD(opfamilyname); - READ_STRING_FIELD(amname); - - READ_DONE(); -} - -static CreatePLangStmt * -_readCreatePLangStmt(void) -{ - READ_LOCALS(CreatePLangStmt); - - READ_BOOL_FIELD(replace); - READ_STRING_FIELD(plname); - READ_NODE_FIELD(plhandler); - READ_NODE_FIELD(plinline); - READ_NODE_FIELD(plvalidator); - READ_BOOL_FIELD(pltrusted); - - READ_DONE(); -} - -static CreatePolicyStmt * -_readCreatePolicyStmt() -{ - READ_LOCALS(CreatePolicyStmt); - - READ_STRING_FIELD(policy_name); - READ_NODE_FIELD(table); - READ_STRING_FIELD(cmd_name); - READ_BOOL_FIELD(permissive); - READ_NODE_FIELD(roles); - READ_NODE_FIELD(qual); - READ_NODE_FIELD(with_check); - - READ_DONE(); -} - -static CreatePublicationStmt * -_readCreatePublicationStmt() -{ - READ_LOCALS(CreatePublicationStmt); - - READ_STRING_FIELD(pubname); - READ_NODE_FIELD(options); - READ_NODE_FIELD(pubobjects); - READ_BOOL_FIELD(for_all_tables); - - READ_DONE(); -} - -static CreateRoleStmt * -_readCreateRoleStmt(void) -{ - READ_LOCALS(CreateRoleStmt); - - READ_ENUM_FIELD(stmt_type, RoleStmtType); - READ_STRING_FIELD(role); - READ_NODE_FIELD(options); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static CreateProfileStmt * -_readCreateProfileStmt(void) -{ - READ_LOCALS(CreateProfileStmt); - - READ_STRING_FIELD(profile_name); - READ_NODE_FIELD(options); - - READ_DONE(); -} - -static CreateSchemaStmt * -_readCreateSchemaStmt(void) -{ - READ_LOCALS(CreateSchemaStmt); - - READ_STRING_FIELD(schemaname); - READ_NODE_FIELD(authrole); - local_node->schemaElts = 0; - READ_BOOL_FIELD(istemp); - READ_BOOL_FIELD(pop_search_path); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static AlterSchemaStmt * -_readAlterSchemaStmt(void) -{ - READ_LOCALS(AlterSchemaStmt); - - READ_STRING_FIELD(schemaname); - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(unsettag); - - READ_DONE(); -} - -static CreateTagStmt * -_readCreateTagStmt(void) -{ - READ_LOCALS(CreateTagStmt); - - READ_STRING_FIELD(tag_name); - READ_BOOL_FIELD(missing_ok); - READ_NODE_FIELD(allowed_values); - - READ_DONE(); -} - -static AlterTagStmt * -_readAlterTagStmt(void) -{ - READ_LOCALS(AlterTagStmt); - - READ_STRING_FIELD(tag_name); - READ_INT_FIELD(action); - READ_NODE_FIELD(tag_values); - READ_BOOL_FIELD(missing_ok); - READ_BOOL_FIELD(unset); - - READ_DONE(); -} - -static DropTagStmt * -_readDropTagStmt(void) -{ - READ_LOCALS(DropTagStmt); - - READ_NODE_FIELD(tags); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static CreateSeqStmt * -_readCreateSeqStmt(void) -{ - READ_LOCALS(CreateSeqStmt); - READ_NODE_FIELD(sequence); - READ_NODE_FIELD(options); - READ_OID_FIELD(ownerId); - READ_BOOL_FIELD(for_identity); - READ_BOOL_FIELD(if_not_exists); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static CreateSubscriptionStmt * -_readCreateSubscriptionStmt() -{ - READ_LOCALS(CreateSubscriptionStmt); - - READ_STRING_FIELD(subname); - READ_STRING_FIELD(conninfo); - READ_NODE_FIELD(publication); - READ_NODE_FIELD(options); - - /* - * conninfo can be an empty string, but the serialization - * doesn't distinguish an empty string from NULL. The - * code that executes the command in't prepared for a NULL. - */ - if (local_node->conninfo == NULL) - local_node->conninfo = pstrdup(""); - - READ_DONE(); -} - -static CreateTransformStmt * -_readCreateTransformStmt() -{ - READ_LOCALS(CreateTransformStmt); - - READ_BOOL_FIELD(replace); - READ_NODE_FIELD(type_name); - READ_STRING_FIELD(lang); - READ_NODE_FIELD(fromsql); - READ_NODE_FIELD(tosql); - - READ_DONE(); -} - -static CreatedbStmt * -_readCreatedbStmt(void) -{ - READ_LOCALS(CreatedbStmt); - - READ_STRING_FIELD(dbname); - READ_NODE_FIELD(options); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static CursorPosInfo * -_readCursorPosInfo(void) -{ - READ_LOCALS(CursorPosInfo); - - READ_STRING_FIELD(cursor_name); - READ_INT_FIELD(gp_segment_id); - READ_UINT_FIELD(ctid.ip_blkid.bi_hi); - READ_UINT_FIELD(ctid.ip_blkid.bi_lo); - READ_UINT_FIELD(ctid.ip_posid); - READ_OID_FIELD(table_oid); - - READ_DONE(); -} - -static DQAExpr* -_readDQAExpr(void) -{ - READ_LOCALS(DQAExpr); - - READ_INT_FIELD(agg_expr_id); - READ_BITMAPSET_FIELD(agg_args_id_bms); - READ_NODE_FIELD(agg_filter); - - READ_DONE(); -} - -static DefineStmt * -_readDefineStmt(void) -{ - READ_LOCALS(DefineStmt); - READ_ENUM_FIELD(kind, ObjectType); - READ_BOOL_FIELD(oldstyle); - READ_NODE_FIELD(defnames); - READ_NODE_FIELD(args); - READ_NODE_FIELD(definition); - READ_BOOL_FIELD(if_not_exists); - READ_BOOL_FIELD(replace); - READ_BOOL_FIELD(trusted); /* CDB */ - - READ_DONE(); -} - -static DenyLoginInterval * -_readDenyLoginInterval(void) -{ - READ_LOCALS(DenyLoginInterval); - - READ_NODE_FIELD(start); - READ_NODE_FIELD(end); - - READ_DONE(); -} - -static DenyLoginPoint * -_readDenyLoginPoint(void) -{ - READ_LOCALS(DenyLoginPoint); - - READ_NODE_FIELD(day); - READ_NODE_FIELD(time); - - READ_DONE(); -} - -static DistributionKeyElem * -_readDistributionKeyElem(void) -{ - READ_LOCALS(DistributionKeyElem); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(opclass); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static DropRoleStmt * -_readDropRoleStmt(void) -{ - READ_LOCALS(DropRoleStmt); - - READ_NODE_FIELD(roles); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static DropProfileStmt * -_readDropProfileStmt(void) -{ - READ_LOCALS(DropProfileStmt); - - READ_NODE_FIELD(profiles); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static DropStmt * -_readDropStmt(void) -{ - READ_LOCALS(DropStmt); - - READ_NODE_FIELD(objects); - READ_ENUM_FIELD(removeType,ObjectType); - READ_ENUM_FIELD(behavior,DropBehavior); - READ_BOOL_FIELD(missing_ok); - READ_BOOL_FIELD(concurrent); - READ_BOOL_FIELD(isdynamic); - - /* Force 'missing_ok' in QEs */ -#ifdef COMPILING_BINARY_FUNCS - local_node->missing_ok=true; -#endif /* COMPILING_BINARY_FUNCS */ - - READ_DONE(); -} - -static DropSubscriptionStmt * -_readDropSubscriptionStmt() -{ - READ_LOCALS(DropSubscriptionStmt); - - READ_STRING_FIELD(subname); - READ_BOOL_FIELD(missing_ok); - READ_ENUM_FIELD(behavior, DropBehavior); - - READ_DONE(); -} - -static DropdbStmt * -_readDropdbStmt(void) -{ - READ_LOCALS(DropdbStmt); - - READ_STRING_FIELD(dbname); - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static ExtTableTypeDesc * -_readExtTableTypeDesc(void) -{ - READ_LOCALS(ExtTableTypeDesc); - - READ_ENUM_FIELD(exttabletype, ExtTableType); - READ_NODE_FIELD(location_list); - READ_NODE_FIELD(on_clause); - READ_STRING_FIELD(command_string); - - READ_DONE(); -} - -/* - * _readFuncCall - * - * This parsenode is transformed during parse_analyze. - * It not stored in views = no upgrade implication for changes - */ -static FuncCall * -_readFuncCall(void) -{ - READ_LOCALS(FuncCall); - - READ_NODE_FIELD(funcname); - READ_NODE_FIELD(args); - READ_NODE_FIELD(agg_order); - READ_NODE_FIELD(agg_filter); - READ_NODE_FIELD(over); - READ_BOOL_FIELD(agg_within_group); - READ_BOOL_FIELD(agg_star); - READ_BOOL_FIELD(agg_distinct); - READ_BOOL_FIELD(func_variadic); - READ_ENUM_FIELD(funcformat, CoercionForm); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static FunctionParameter * -_readFunctionParameter(void) -{ - READ_LOCALS(FunctionParameter); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(argType); - READ_ENUM_FIELD(mode, FunctionParameterMode); - READ_NODE_FIELD(defexpr); - - READ_DONE(); -} - -static GrantRoleStmt * -_readGrantRoleStmt(void) -{ - READ_LOCALS(GrantRoleStmt); - - READ_NODE_FIELD(granted_roles); - READ_NODE_FIELD(grantee_roles); - READ_BOOL_FIELD(is_grant); - READ_NODE_FIELD(opt); - READ_NODE_FIELD(grantor); - READ_ENUM_FIELD(behavior, DropBehavior); - Assert(local_node->behavior <= DROP_CASCADE); - - READ_DONE(); -} - -static GrantStmt * -_readGrantStmt(void) -{ - READ_LOCALS(GrantStmt); - - READ_BOOL_FIELD(is_grant); - READ_ENUM_FIELD(targtype,GrantTargetType); - READ_ENUM_FIELD(objtype,ObjectType); - READ_NODE_FIELD(objects); - READ_NODE_FIELD(privileges); - READ_NODE_FIELD(grantees); - READ_BOOL_FIELD(grant_option); - READ_ENUM_FIELD(behavior, DropBehavior); - - READ_DONE(); -} - -/* - * _readGroupId - */ -static GroupId * -_readGroupId(void) -{ - READ_LOCALS(GroupId); - - READ_INT_FIELD(agglevelsup); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readGroupingSetId - */ -static GroupingSetId * -_readGroupingSetId(void) -{ - READ_LOCALS(GroupingSetId); - - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static IndexElem * -_readIndexElem(void) -{ - READ_LOCALS(IndexElem); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(expr); - READ_STRING_FIELD(indexcolname); - READ_NODE_FIELD(collation); - READ_NODE_FIELD(opclass); - READ_NODE_FIELD(opclassopts); - READ_ENUM_FIELD(ordering, SortByDir); - READ_ENUM_FIELD(nulls_ordering, SortByNulls); - - READ_DONE(); -} - -static IndexStmt * -_readIndexStmt(void) -{ - READ_LOCALS(IndexStmt); - - READ_STRING_FIELD(idxname); - READ_NODE_FIELD(relation); - READ_OID_FIELD(relationOid); - READ_STRING_FIELD(accessMethod); - READ_STRING_FIELD(tableSpace); - READ_NODE_FIELD(indexParams); - READ_NODE_FIELD(indexIncludingParams); - READ_NODE_FIELD(options); - READ_NODE_FIELD(whereClause); - READ_NODE_FIELD(excludeOpNames); - READ_STRING_FIELD(idxcomment); - READ_OID_FIELD(indexOid); - READ_OID_FIELD(oldNumber); - READ_UINT_FIELD(oldCreateSubid); - READ_UINT_FIELD(oldFirstRelfilelocatorSubid); - READ_BOOL_FIELD(unique); - READ_BOOL_FIELD(nulls_not_distinct); - READ_BOOL_FIELD(primary); - READ_BOOL_FIELD(isconstraint); - READ_BOOL_FIELD(deferrable); - READ_BOOL_FIELD(initdeferred); - READ_BOOL_FIELD(transformed); - READ_BOOL_FIELD(concurrent); - READ_BOOL_FIELD(if_not_exists); - READ_BOOL_FIELD(reset_default_tblspc); - READ_ENUM_FIELD(concurrentlyPhase,IndexConcurrentlyPhase); - READ_OID_FIELD(indexRelationOid); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static LockStmt * -_readLockStmt(void) -{ - READ_LOCALS(LockStmt); - - READ_NODE_FIELD(relations); - READ_INT_FIELD(mode); - READ_BOOL_FIELD(nowait); - - READ_DONE(); -} - -static NewColumnValue * -_readNewColumnValue(void) -{ - READ_LOCALS(NewColumnValue); - - READ_INT_FIELD(attnum); - READ_NODE_FIELD(expr); - /* can't serialize exprstate */ - READ_BOOL_FIELD(is_generated); - - READ_DONE(); -} - -static NewConstraint * -_readNewConstraint(void) -{ - READ_LOCALS(NewConstraint); - - READ_STRING_FIELD(name); - READ_ENUM_FIELD(contype, ConstrType); - READ_OID_FIELD(refrelid); - READ_OID_FIELD(refindid); - READ_OID_FIELD(conid); - READ_NODE_FIELD(qual); - /* can't serialize qualstate */ - - READ_DONE(); -} - -static ObjectWithArgs * -_readObjectWithArgs(void) -{ - READ_LOCALS(ObjectWithArgs); - - READ_NODE_FIELD(objname); - READ_NODE_FIELD(objargs); - READ_BOOL_FIELD(args_unspecified); - - READ_DONE(); -} - -static PartitionCmd * -_readPartitionCmd(void) -{ - READ_LOCALS(PartitionCmd); - - READ_NODE_FIELD(name); - READ_NODE_FIELD(bound); - - READ_DONE(); -} - -#ifdef COMPILING_BINARY_FUNCS -static GpAlterPartitionId * -_readGpAlterPartitionId(void) -{ - READ_LOCALS(GpAlterPartitionId); - - READ_ENUM_FIELD(idtype, GpAlterPartitionIdType); - READ_NODE_FIELD(partiddef); - - READ_DONE(); -} - -static GpAlterPartitionCmd * -_readGpAlterPartitionCmd(void) -{ - READ_LOCALS(GpAlterPartitionCmd); - - READ_NODE_FIELD(partid); - READ_NODE_FIELD(arg); - - READ_DONE(); -} -#endif - -static PartitionElem * -_readPartitionElem(void) -{ - READ_LOCALS(PartitionElem); - - READ_STRING_FIELD(name); - READ_NODE_FIELD(expr); - READ_NODE_FIELD(collation); - READ_NODE_FIELD(opclass); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static PartitionSpec * -_readPartitionSpec(void) -{ - READ_LOCALS(PartitionSpec); - - READ_ENUM_FIELD(strategy, PartitionStrategy); - READ_NODE_FIELD(partParams); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static RefreshClause * -_readRefreshClause(void) -{ - READ_LOCALS(RefreshClause); - - READ_BOOL_FIELD(concurrent); - READ_BOOL_FIELD(skipData); - READ_NODE_FIELD(relation); - - READ_DONE(); -} - -static ReindexStmt * -_readReindexStmt(void) -{ - READ_LOCALS(ReindexStmt); - - READ_ENUM_FIELD(kind,ReindexObjectType); - READ_NODE_FIELD(relation); - READ_STRING_FIELD(name); - READ_NODE_FIELD(params); - READ_OID_FIELD(relid); - READ_ENUM_FIELD(concurrentlyPhase,ReindexConcurrentlyPhase); - READ_NODE_FIELD(newIndexInfo); - READ_NODE_FIELD(oldIndexInfo); - - READ_DONE(); -} - -static ReindexIndexInfo * -_readReindexIndexInfo(void) -{ - READ_LOCALS(ReindexIndexInfo); - - READ_OID_FIELD(indexId); - READ_OID_FIELD(tableId); - READ_OID_FIELD(amId); - READ_BOOL_FIELD(safe); - READ_STRING_FIELD(ccNewName); - READ_STRING_FIELD(ccOldName); - - READ_DONE(); -} - -static RenameStmt * -_readRenameStmt(void) -{ - READ_LOCALS(RenameStmt); - - READ_ENUM_FIELD(renameType, ObjectType); - READ_ENUM_FIELD(relationType, ObjectType); - READ_NODE_FIELD(relation); - READ_OID_FIELD(objid); - READ_NODE_FIELD(object); - READ_STRING_FIELD(subname); - READ_STRING_FIELD(newname); - READ_ENUM_FIELD(behavior,DropBehavior); - - READ_BOOL_FIELD(missing_ok); - - READ_DONE(); -} - -static ReplicaIdentityStmt * -_readReplicaIdentityStmt(void) -{ - READ_LOCALS(ReplicaIdentityStmt); - - READ_CHAR_FIELD(identity_type); - READ_STRING_FIELD(name); - - READ_DONE(); -} - -static RestrictInfo * -_readRestrictInfo(void) -{ - READ_LOCALS(RestrictInfo); - - /* NB: this isn't a complete set of fields */ - READ_NODE_FIELD(clause); - READ_BOOL_FIELD(is_pushed_down); - READ_BOOL_FIELD(can_join); - READ_BOOL_FIELD(pseudoconstant); - READ_BOOL_FIELD(has_clone); - READ_BOOL_FIELD(is_clone); - READ_BOOL_FIELD(leakproof); - READ_ENUM_FIELD(has_volatile, VolatileFunctionStatus); - READ_UINT_FIELD(security_level); - READ_INT_FIELD(num_base_rels); - READ_BOOL_FIELD(contain_outer_query_references); - READ_BITMAPSET_FIELD(clause_relids); - READ_BITMAPSET_FIELD(required_relids); - READ_BITMAPSET_FIELD(incompatible_relids); - READ_BITMAPSET_FIELD(outer_relids); - READ_BITMAPSET_FIELD(left_relids); - READ_BITMAPSET_FIELD(right_relids); - READ_NODE_FIELD(orclause); - - READ_INT_FIELD(rinfo_serial); - READ_FLOAT_FIELD(eval_cost.startup); - READ_FLOAT_FIELD(eval_cost.per_tuple); - READ_FLOAT_FIELD(norm_selec); - READ_FLOAT_FIELD(outer_selec); - READ_NODE_FIELD(mergeopfamilies); - - READ_NODE_FIELD(left_em); - READ_NODE_FIELD(right_em); - READ_BOOL_FIELD(outer_is_left); - READ_OID_FIELD(hashjoinoperator); - READ_FLOAT_FIELD(left_bucketsize); - READ_FLOAT_FIELD(left_mcvfreq); - READ_FLOAT_FIELD(right_mcvfreq); - READ_OID_FIELD(left_hasheqoperator); - READ_OID_FIELD(right_hasheqoperator); - READ_OID_FIELD(hasheqoperator); - - READ_DONE(); -} - -static RuleStmt * -_readRuleStmt(void) -{ - READ_LOCALS(RuleStmt); - - READ_NODE_FIELD(relation); - READ_STRING_FIELD(rulename); - READ_NODE_FIELD(whereClause); - READ_ENUM_FIELD(event,CmdType); - READ_BOOL_FIELD(instead); - READ_NODE_FIELD(actions); - READ_BOOL_FIELD(replace); - - READ_DONE(); -} - -static SegfileMapNode * -_readSegfileMapNode(void) -{ - READ_LOCALS(SegfileMapNode); - - READ_OID_FIELD(relid); - READ_INT_FIELD(segno); - - READ_DONE(); -} - -/* - * _readSingleRowErrorDesc - */ -static SingleRowErrorDesc * -_readSingleRowErrorDesc(void) -{ - READ_LOCALS(SingleRowErrorDesc); - - READ_INT_FIELD(rejectlimit); - READ_BOOL_FIELD(is_limit_in_rows); - READ_CHAR_FIELD(log_error_type); - - READ_DONE(); -} - -static SliceTable * -_readSliceTable(void) -{ - READ_LOCALS(SliceTable); - - READ_INT_FIELD(localSlice); - READ_INT_FIELD(numSlices); - local_node->slices = palloc0(local_node->numSlices * sizeof(ExecSlice)); - for (int i = 0; i < local_node->numSlices; i++) - { - READ_INT_FIELD(slices[i].sliceIndex); - READ_INT_FIELD(slices[i].rootIndex); - READ_INT_FIELD(slices[i].parentIndex); - READ_INT_FIELD(slices[i].planNumSegments); - READ_NODE_FIELD(slices[i].children); /* List of int index */ - READ_ENUM_FIELD(slices[i].gangType, GangType); - READ_NODE_FIELD(slices[i].segments); /* List of int index */ - READ_BOOL_FIELD(slices[i].useMppParallelMode); - READ_INT_FIELD(slices[i].parallel_workers); - local_node->slices[i].primaryGang = NULL; - READ_NODE_FIELD(slices[i].primaryProcesses); /* List of (CDBProcess *) */ - READ_BITMAPSET_FIELD(slices[i].processesMap); - } - READ_BOOL_FIELD(hasMotions); - - READ_INT_FIELD(instrument_options); - READ_INT_FIELD(ic_instance_id); - - READ_DONE(); -} - -static SortBy * -_readSortBy(void) -{ - READ_LOCALS(SortBy); - - READ_NODE_FIELD(node); - READ_ENUM_FIELD(sortby_dir, SortByDir); - READ_ENUM_FIELD(sortby_nulls, SortByNulls); - READ_NODE_FIELD(useOp); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readTableFunctionScan - */ -static TableFunctionScan * -_readTableFunctionScan(void) -{ - READ_LOCALS(TableFunctionScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(function); - - READ_DONE(); -} - -static TableValueExpr * -_readTableValueExpr(void) -{ - READ_LOCALS(TableValueExpr); - - READ_NODE_FIELD(subquery); - - READ_DONE(); -} - -static TruncateStmt * -_readTruncateStmt(void) -{ - READ_LOCALS(TruncateStmt); - - READ_NODE_FIELD(relations); - READ_ENUM_FIELD(behavior,DropBehavior); - - READ_DONE(); -} - -static TupleSplit * -_readTupleSplit(void) -{ - READ_LOCALS(TupleSplit); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(numCols); - READ_ATTRNUMBER_ARRAY(grpColIdx, local_node->numCols); - - READ_NODE_FIELD(dqa_expr_lst); - - READ_DONE(); -} - -static TypeCast * -_readTypeCast(void) -{ - READ_LOCALS(TypeCast); - - READ_NODE_FIELD(arg); - READ_NODE_FIELD(typeName); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static TypeName * -_readTypeName(void) -{ - READ_LOCALS(TypeName); - - READ_NODE_FIELD(names); - READ_OID_FIELD(typeOid); - READ_BOOL_FIELD(setof); - READ_BOOL_FIELD(pct_type); - READ_NODE_FIELD(typmods); - READ_INT_FIELD(typemod); - READ_NODE_FIELD(arrayBounds); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static VacuumRelation * -_readVacuumRelation(void) -{ - READ_LOCALS(VacuumRelation); - - READ_NODE_FIELD(relation); - READ_OID_FIELD(oid); - READ_NODE_FIELD(va_cols); - - READ_DONE(); -} - - -/* - * _readVacuumStmt - */ -static VacuumStmt * -_readVacuumStmt(void) -{ - READ_LOCALS(VacuumStmt); - - READ_NODE_FIELD(options); - READ_NODE_FIELD(rels); - READ_BOOL_FIELD(is_vacuumcmd); - - READ_DONE(); -} - - -static VariableSetStmt * -_readVariableSetStmt(void) -{ - READ_LOCALS(VariableSetStmt); - - READ_STRING_FIELD(name); - READ_ENUM_FIELD(kind, VariableSetKind); - READ_NODE_FIELD(args); - READ_BOOL_FIELD(is_local); - - READ_DONE(); -} - -static ViewStmt * -_readViewStmt(void) -{ - READ_LOCALS(ViewStmt); - - READ_NODE_FIELD(view); - READ_NODE_FIELD(aliases); - READ_NODE_FIELD(query); - READ_BOOL_FIELD(replace); - READ_NODE_FIELD(options); - READ_NODE_FIELD(tags); - - READ_DONE(); -} - -static WithClause * -_readWithClause(void) -{ - READ_LOCALS(WithClause); - - READ_NODE_FIELD(ctes); - READ_BOOL_FIELD(recursive); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -static void -unwrapStringList(List *list) -{ - ListCell *lc; - - foreach(lc, list) - { - String *val = lfirst(lc); - - lfirst(lc) = strVal(val); - pfree(val); - } -} - -/* - * _readMemoize - */ -static Memoize * -_readMemoize(void) -{ - READ_LOCALS(Memoize); - - ReadCommonPlan(&local_node->plan); - - READ_INT_FIELD(numKeys); - READ_OID_ARRAY(hashOperators, local_node->numKeys); - READ_OID_ARRAY(collations, local_node->numKeys); - READ_NODE_FIELD(param_exprs); - READ_BOOL_FIELD(singlerow); - READ_BOOL_FIELD(binary_mode); - READ_UINT_FIELD(est_entries); - READ_BITMAPSET_FIELD(keyparamids); - - READ_DONE(); -} - -/* - * _readTidRangeScan - */ -static TidRangeScan * -_readTidRangeScan(void) -{ - READ_LOCALS(TidRangeScan); - - ReadCommonScan(&local_node->scan); - - READ_NODE_FIELD(tidrangequals); - - READ_DONE(); -} - -/* - * _readCTESearchClause - */ -static CTESearchClause * -_readCTESearchClause(void) -{ - READ_LOCALS(CTESearchClause); - - READ_NODE_FIELD(search_col_list); - READ_BOOL_FIELD(search_breadth_first); - READ_STRING_FIELD(search_seq_column); - READ_LOCATION_FIELD(location); - - READ_DONE(); -} - -/* - * _readCTECycleClause - */ -static CTECycleClause * -_readCTECycleClause(void) -{ - READ_LOCALS(CTECycleClause); - - READ_NODE_FIELD(cycle_col_list); - READ_STRING_FIELD(cycle_mark_column); - READ_NODE_FIELD(cycle_mark_value); - READ_NODE_FIELD(cycle_mark_default); - READ_STRING_FIELD(cycle_path_column); - READ_LOCATION_FIELD(location); - READ_OID_FIELD(cycle_mark_type); - READ_INT_FIELD(cycle_mark_typmod); - READ_OID_FIELD(cycle_mark_collation); - READ_OID_FIELD(cycle_mark_neop); - - READ_DONE(); -} - -static ReturnStmt * -_readReturnStmt(void) -{ - READ_LOCALS(ReturnStmt); - - READ_NODE_FIELD(returnval); - - READ_DONE(); -} diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 73fa2102b0e..e9e0d38f92b 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -34,6 +34,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "nodes/queryjumble.h" #include "optimizer/optimizer.h" #include "optimizer/plancat.h" #include "optimizer/tlist.h" @@ -56,7 +57,6 @@ #include "utils/backend_status.h" #include "utils/builtins.h" #include "utils/guc.h" -#include "utils/queryjumble.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -173,7 +173,7 @@ parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, query = transformTopLevelStmt(pstate, parseTree); if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, sourceText); + jstate = JumbleQuery(query); if (post_parse_analyze_hook) (*post_parse_analyze_hook) (pstate, query, jstate); @@ -215,7 +215,7 @@ parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, check_variable_parameters(pstate, query); if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, sourceText); + jstate = JumbleQuery(query); if (post_parse_analyze_hook) (*post_parse_analyze_hook) (pstate, query, jstate); @@ -252,7 +252,7 @@ parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, query = transformTopLevelStmt(pstate, parseTree); if (IsQueryIdEnabled()) - jstate = JumbleQuery(query, sourceText); + jstate = JumbleQuery(query); if (post_parse_analyze_hook) (*post_parse_analyze_hook) (pstate, query, jstate); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 12c8649b159..99e68f3b942 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -112,6 +112,7 @@ #include "libpq/libpq.h" #include "libpq/pqformat.h" #include "libpq/pqsignal.h" +#include "nodes/queryjumble.h" #include "pg_getopt.h" #include "pgstat.h" #include "port/pg_bswap.h" @@ -145,7 +146,6 @@ #include "utils/memutils.h" #include "utils/pidfile.h" #include "utils/ps_status.h" -#include "utils/queryjumble.h" #include "utils/timeout.h" #include "utils/timestamp.h" #include "utils/varlena.h" diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile index 38a72665aec..38f4204761e 100644 --- a/src/backend/utils/misc/Makefile +++ b/src/backend/utils/misc/Makefile @@ -29,7 +29,6 @@ OBJS = \ pg_rusage.o \ ps_status.o \ queryenvironment.o \ - queryjumble.o \ rls.o \ sampling.o \ superuser.o \ diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 1ff92994527..bf6d2754e7b 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -49,6 +49,7 @@ #include "libpq/auth.h" #include "libpq/libpq.h" #include "libpq/scram.h" +#include "nodes/queryjumble.h" #include "optimizer/cost.h" #include "optimizer/geqo.h" #include "optimizer/optimizer.h" @@ -84,7 +85,6 @@ #include "utils/pg_locale.h" #include "utils/portal.h" #include "utils/ps_status.h" -#include "utils/queryjumble.h" #include "utils/inval.h" #include "utils/xml.h" diff --git a/src/backend/utils/misc/queryjumble.c b/src/backend/utils/misc/queryjumble.c deleted file mode 100644 index 8ca7708e790..00000000000 --- a/src/backend/utils/misc/queryjumble.c +++ /dev/null @@ -1,865 +0,0 @@ -/*------------------------------------------------------------------------- - * - * queryjumble.c - * Query normalization and fingerprinting. - * - * Normalization is a process whereby similar queries, typically differing only - * in their constants (though the exact rules are somewhat more subtle than - * that) are recognized as equivalent, and are tracked as a single entry. This - * is particularly useful for non-prepared queries. - * - * Normalization is implemented by fingerprinting queries, selectively - * serializing those fields of each query tree's nodes that are judged to be - * essential to the query. This is referred to as a query jumble. This is - * distinct from a regular serialization in that various extraneous - * information is ignored as irrelevant or not essential to the query, such - * as the collations of Vars and, most notably, the values of constants. - * - * This jumble is acquired at the end of parse analysis of each query, and - * a 64-bit hash of it is stored into the query's Query.queryId field. - * The server then copies this value around, making it available in plan - * tree(s) generated from the query. The executor can then use this value - * to blame query costs on the proper queryId. - * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * src/backend/utils/misc/queryjumble.c - * - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include "common/hashfn.h" -#include "miscadmin.h" -#include "parser/scansup.h" -#include "utils/queryjumble.h" - -#define JUMBLE_SIZE 1024 /* query serialization buffer size */ - -/* GUC parameters */ -int compute_query_id = COMPUTE_QUERY_ID_AUTO; - -/* True when compute_query_id is ON, or AUTO and a module requests them */ -bool query_id_enabled = false; - -static uint64 compute_utility_query_id(const char *str, int query_location, int query_len); -static void AppendJumble(JumbleState *jstate, - const unsigned char *item, Size size); -static void JumbleQueryInternal(JumbleState *jstate, Query *query); -static void JumbleRangeTable(JumbleState *jstate, List *rtable); -static void JumbleRowMarks(JumbleState *jstate, List *rowMarks); -static void JumbleExpr(JumbleState *jstate, Node *node); -static void RecordConstLocation(JumbleState *jstate, int location); - -/* - * Given a possibly multi-statement source string, confine our attention to the - * relevant part of the string. - */ -const char * -CleanQuerytext(const char *query, int *location, int *len) -{ - int query_location = *location; - int query_len = *len; - - /* First apply starting offset, unless it's -1 (unknown). */ - if (query_location >= 0) - { - Assert(query_location <= strlen(query)); - query += query_location; - /* Length of 0 (or -1) means "rest of string" */ - if (query_len <= 0) - query_len = strlen(query); - else - Assert(query_len <= strlen(query)); - } - else - { - /* If query location is unknown, distrust query_len as well */ - query_location = 0; - query_len = strlen(query); - } - - /* - * Discard leading and trailing whitespace, too. Use scanner_isspace() - * not libc's isspace(), because we want to match the lexer's behavior. - */ - while (query_len > 0 && scanner_isspace(query[0])) - query++, query_location++, query_len--; - while (query_len > 0 && scanner_isspace(query[query_len - 1])) - query_len--; - - *location = query_location; - *len = query_len; - - return query; -} - -JumbleState * -JumbleQueryDirect(Query *query, const char *querytext) -{ - JumbleState *jstate = NULL; - - Assert(IsA(query, Query)); - Assert(query->utilityStmt == NULL); - - jstate = (JumbleState *) palloc(sizeof(JumbleState)); - - /* Set up workspace for query jumbling */ - jstate->jumble = (unsigned char *) palloc(JUMBLE_SIZE); - jstate->jumble_len = 0; - jstate->clocations_buf_size = 32; - jstate->clocations = (LocationLen *) - palloc(jstate->clocations_buf_size * sizeof(LocationLen)); - jstate->clocations_count = 0; - jstate->highest_extern_param_id = 0; - - /* Compute query ID and mark the Query node with it */ - JumbleQueryInternal(jstate, query); - query->queryId = DatumGetUInt64(hash_any_extended(jstate->jumble, - jstate->jumble_len, - 0)); - - /* - * If we are unlucky enough to get a hash of zero, use 1 instead, to - * prevent confusion with the utility-statement case. - */ - if (query->queryId == UINT64CONST(0)) - query->queryId = UINT64CONST(1); - - return jstate; -} - -JumbleState * -JumbleQuery(Query *query, const char *querytext) -{ - Assert(IsQueryIdEnabled()); - - if (query->utilityStmt) - { - query->queryId = compute_utility_query_id(querytext, - query->stmt_location, - query->stmt_len); - return NULL; - } - else - { - return JumbleQueryDirect(query, querytext); - } -} - -/* - * Enables query identifier computation. - * - * Third-party plugins can use this function to inform core that they require - * a query identifier to be computed. - */ -void -EnableQueryId(void) -{ - if (compute_query_id != COMPUTE_QUERY_ID_OFF) - query_id_enabled = true; -} - -/* - * Compute a query identifier for the given utility query string. - */ -static uint64 -compute_utility_query_id(const char *query_text, int query_location, int query_len) -{ - uint64 queryId; - const char *sql; - - /* - * Confine our attention to the relevant part of the string, if the query - * is a portion of a multi-statement source string. - */ - sql = CleanQuerytext(query_text, &query_location, &query_len); - - queryId = DatumGetUInt64(hash_any_extended((const unsigned char *) sql, - query_len, 0)); - - /* - * If we are unlucky enough to get a hash of zero(invalid), use queryID as - * 2 instead, queryID 1 is already in use for normal statements. - */ - if (queryId == UINT64CONST(0)) - queryId = UINT64CONST(2); - - return queryId; -} - -/* - * AppendJumble: Append a value that is substantive in a given query to - * the current jumble. - */ -static void -AppendJumble(JumbleState *jstate, const unsigned char *item, Size size) -{ - unsigned char *jumble = jstate->jumble; - Size jumble_len = jstate->jumble_len; - - /* - * Whenever the jumble buffer is full, we hash the current contents and - * reset the buffer to contain just that hash value, thus relying on the - * hash to summarize everything so far. - */ - while (size > 0) - { - Size part_size; - - if (jumble_len >= JUMBLE_SIZE) - { - uint64 start_hash; - - start_hash = DatumGetUInt64(hash_any_extended(jumble, - JUMBLE_SIZE, 0)); - memcpy(jumble, &start_hash, sizeof(start_hash)); - jumble_len = sizeof(start_hash); - } - part_size = Min(size, JUMBLE_SIZE - jumble_len); - memcpy(jumble + jumble_len, item, part_size); - jumble_len += part_size; - item += part_size; - size -= part_size; - } - jstate->jumble_len = jumble_len; -} - -/* - * Wrappers around AppendJumble to encapsulate details of serialization - * of individual local variable elements. - */ -#define APP_JUMB(item) \ - AppendJumble(jstate, (const unsigned char *) &(item), sizeof(item)) -#define APP_JUMB_STRING(str) \ - AppendJumble(jstate, (const unsigned char *) (str), strlen(str) + 1) - -/* - * JumbleQueryInternal: Selectively serialize the query tree, appending - * significant data to the "query jumble" while ignoring nonsignificant data. - * - * Rule of thumb for what to include is that we should ignore anything not - * semantically significant (such as alias names) as well as anything that can - * be deduced from child nodes (else we'd just be double-hashing that piece - * of information). - */ -static void -JumbleQueryInternal(JumbleState *jstate, Query *query) -{ - APP_JUMB(query->commandType); - /* resultRelation is usually predictable from commandType */ - JumbleExpr(jstate, (Node *) query->cteList); - JumbleRangeTable(jstate, query->rtable); - JumbleExpr(jstate, (Node *) query->jointree); - JumbleExpr(jstate, (Node *) query->targetList); - JumbleExpr(jstate, (Node *) query->onConflict); - JumbleExpr(jstate, (Node *) query->returningList); - JumbleExpr(jstate, (Node *) query->groupClause); - APP_JUMB(query->groupDistinct); - JumbleExpr(jstate, (Node *) query->groupingSets); - JumbleExpr(jstate, query->havingQual); - JumbleExpr(jstate, (Node *) query->windowClause); - JumbleExpr(jstate, (Node *) query->distinctClause); - JumbleExpr(jstate, (Node *) query->sortClause); - JumbleExpr(jstate, query->limitOffset); - JumbleExpr(jstate, query->limitCount); - APP_JUMB(query->limitOption); - JumbleRowMarks(jstate, query->rowMarks); - JumbleExpr(jstate, query->setOperations); -} - -/* - * Jumble a range table - */ -static void -JumbleRangeTable(JumbleState *jstate, List *rtable) -{ - ListCell *lc; - - foreach(lc, rtable) - { - RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc); - - APP_JUMB(rte->rtekind); - switch (rte->rtekind) - { - case RTE_RELATION: - APP_JUMB(rte->relid); - JumbleExpr(jstate, (Node *) rte->tablesample); - APP_JUMB(rte->inh); - break; - case RTE_SUBQUERY: - JumbleQueryInternal(jstate, rte->subquery); - break; - case RTE_JOIN: - APP_JUMB(rte->jointype); - break; - case RTE_FUNCTION: - JumbleExpr(jstate, (Node *) rte->functions); - break; - case RTE_TABLEFUNC: - JumbleExpr(jstate, (Node *) rte->tablefunc); - break; - case RTE_VALUES: - JumbleExpr(jstate, (Node *) rte->values_lists); - break; - case RTE_CTE: - - /* - * Depending on the CTE name here isn't ideal, but it's the - * only info we have to identify the referenced WITH item. - */ - APP_JUMB_STRING(rte->ctename); - APP_JUMB(rte->ctelevelsup); - break; - case RTE_NAMEDTUPLESTORE: - APP_JUMB_STRING(rte->enrname); - break; - case RTE_RESULT: - break; - default: - elog(ERROR, "unrecognized RTE kind: %d", (int) rte->rtekind); - break; - } - } -} - -/* - * Jumble a rowMarks list - */ -static void -JumbleRowMarks(JumbleState *jstate, List *rowMarks) -{ - ListCell *lc; - - foreach(lc, rowMarks) - { - RowMarkClause *rowmark = lfirst_node(RowMarkClause, lc); - - if (!rowmark->pushedDown) - { - APP_JUMB(rowmark->rti); - APP_JUMB(rowmark->strength); - APP_JUMB(rowmark->waitPolicy); - } - } -} - -/* - * Jumble an expression tree - * - * In general this function should handle all the same node types that - * expression_tree_walker() does, and therefore it's coded to be as parallel - * to that function as possible. However, since we are only invoked on - * queries immediately post-parse-analysis, we need not handle node types - * that only appear in planning. - * - * Note: the reason we don't simply use expression_tree_walker() is that the - * point of that function is to support tree walkers that don't care about - * most tree node types, but here we care about all types. We should complain - * about any unrecognized node type. - */ -static void -JumbleExpr(JumbleState *jstate, Node *node) -{ - ListCell *temp; - - if (node == NULL) - return; - - /* Guard against stack overflow due to overly complex expressions */ - check_stack_depth(); - - /* - * We always emit the node's NodeTag, then any additional fields that are - * considered significant, and then we recurse to any child nodes. - */ - APP_JUMB(node->type); - - switch (nodeTag(node)) - { - case T_Var: - { - Var *var = (Var *) node; - - APP_JUMB(var->varno); - APP_JUMB(var->varattno); - APP_JUMB(var->varlevelsup); - } - break; - case T_Const: - { - Const *c = (Const *) node; - - /* We jumble only the constant's type, not its value */ - APP_JUMB(c->consttype); - /* Also, record its parse location for query normalization */ - RecordConstLocation(jstate, c->location); - } - break; - case T_Param: - { - Param *p = (Param *) node; - - APP_JUMB(p->paramkind); - APP_JUMB(p->paramid); - APP_JUMB(p->paramtype); - /* Also, track the highest external Param id */ - if (p->paramkind == PARAM_EXTERN && - p->paramid > jstate->highest_extern_param_id) - jstate->highest_extern_param_id = p->paramid; - } - break; - case T_Aggref: - { - Aggref *expr = (Aggref *) node; - - APP_JUMB(expr->aggfnoid); - JumbleExpr(jstate, (Node *) expr->aggdirectargs); - JumbleExpr(jstate, (Node *) expr->args); - JumbleExpr(jstate, (Node *) expr->aggorder); - JumbleExpr(jstate, (Node *) expr->aggdistinct); - JumbleExpr(jstate, (Node *) expr->aggfilter); - } - break; - case T_GroupingFunc: - { - GroupingFunc *grpnode = (GroupingFunc *) node; - - JumbleExpr(jstate, (Node *) grpnode->refs); - APP_JUMB(grpnode->agglevelsup); - } - break; - case T_WindowFunc: - { - WindowFunc *expr = (WindowFunc *) node; - - APP_JUMB(expr->winfnoid); - APP_JUMB(expr->winref); - JumbleExpr(jstate, (Node *) expr->args); - JumbleExpr(jstate, (Node *) expr->aggfilter); - } - break; - case T_SubscriptingRef: - { - SubscriptingRef *sbsref = (SubscriptingRef *) node; - - JumbleExpr(jstate, (Node *) sbsref->refupperindexpr); - JumbleExpr(jstate, (Node *) sbsref->reflowerindexpr); - JumbleExpr(jstate, (Node *) sbsref->refexpr); - JumbleExpr(jstate, (Node *) sbsref->refassgnexpr); - } - break; - case T_FuncExpr: - { - FuncExpr *expr = (FuncExpr *) node; - - APP_JUMB(expr->funcid); - JumbleExpr(jstate, (Node *) expr->args); - } - break; - case T_NamedArgExpr: - { - NamedArgExpr *nae = (NamedArgExpr *) node; - - APP_JUMB(nae->argnumber); - JumbleExpr(jstate, (Node *) nae->arg); - } - break; - case T_OpExpr: - case T_DistinctExpr: /* struct-equivalent to OpExpr */ - case T_NullIfExpr: /* struct-equivalent to OpExpr */ - { - OpExpr *expr = (OpExpr *) node; - - APP_JUMB(expr->opno); - JumbleExpr(jstate, (Node *) expr->args); - } - break; - case T_ScalarArrayOpExpr: - { - ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) node; - - APP_JUMB(expr->opno); - APP_JUMB(expr->useOr); - JumbleExpr(jstate, (Node *) expr->args); - } - break; - case T_BoolExpr: - { - BoolExpr *expr = (BoolExpr *) node; - - APP_JUMB(expr->boolop); - JumbleExpr(jstate, (Node *) expr->args); - } - break; - case T_SubLink: - { - SubLink *sublink = (SubLink *) node; - - APP_JUMB(sublink->subLinkType); - APP_JUMB(sublink->subLinkId); - JumbleExpr(jstate, (Node *) sublink->testexpr); - JumbleQueryInternal(jstate, castNode(Query, sublink->subselect)); - } - break; - case T_FieldSelect: - { - FieldSelect *fs = (FieldSelect *) node; - - APP_JUMB(fs->fieldnum); - JumbleExpr(jstate, (Node *) fs->arg); - } - break; - case T_FieldStore: - { - FieldStore *fstore = (FieldStore *) node; - - JumbleExpr(jstate, (Node *) fstore->arg); - JumbleExpr(jstate, (Node *) fstore->newvals); - } - break; - case T_RelabelType: - { - RelabelType *rt = (RelabelType *) node; - - APP_JUMB(rt->resulttype); - JumbleExpr(jstate, (Node *) rt->arg); - } - break; - case T_CoerceViaIO: - { - CoerceViaIO *cio = (CoerceViaIO *) node; - - APP_JUMB(cio->resulttype); - JumbleExpr(jstate, (Node *) cio->arg); - } - break; - case T_ArrayCoerceExpr: - { - ArrayCoerceExpr *acexpr = (ArrayCoerceExpr *) node; - - APP_JUMB(acexpr->resulttype); - JumbleExpr(jstate, (Node *) acexpr->arg); - JumbleExpr(jstate, (Node *) acexpr->elemexpr); - } - break; - case T_ConvertRowtypeExpr: - { - ConvertRowtypeExpr *crexpr = (ConvertRowtypeExpr *) node; - - APP_JUMB(crexpr->resulttype); - JumbleExpr(jstate, (Node *) crexpr->arg); - } - break; - case T_CollateExpr: - { - CollateExpr *ce = (CollateExpr *) node; - - APP_JUMB(ce->collOid); - JumbleExpr(jstate, (Node *) ce->arg); - } - break; - case T_CaseExpr: - { - CaseExpr *caseexpr = (CaseExpr *) node; - - JumbleExpr(jstate, (Node *) caseexpr->arg); - foreach(temp, caseexpr->args) - { - CaseWhen *when = lfirst_node(CaseWhen, temp); - - JumbleExpr(jstate, (Node *) when->expr); - JumbleExpr(jstate, (Node *) when->result); - } - JumbleExpr(jstate, (Node *) caseexpr->defresult); - } - break; - case T_CaseTestExpr: - { - CaseTestExpr *ct = (CaseTestExpr *) node; - - APP_JUMB(ct->typeId); - } - break; - case T_ArrayExpr: - JumbleExpr(jstate, (Node *) ((ArrayExpr *) node)->elements); - break; - case T_RowExpr: - JumbleExpr(jstate, (Node *) ((RowExpr *) node)->args); - break; - case T_RowCompareExpr: - { - RowCompareExpr *rcexpr = (RowCompareExpr *) node; - - APP_JUMB(rcexpr->rctype); - JumbleExpr(jstate, (Node *) rcexpr->largs); - JumbleExpr(jstate, (Node *) rcexpr->rargs); - } - break; - case T_CoalesceExpr: - JumbleExpr(jstate, (Node *) ((CoalesceExpr *) node)->args); - break; - case T_MinMaxExpr: - { - MinMaxExpr *mmexpr = (MinMaxExpr *) node; - - APP_JUMB(mmexpr->op); - JumbleExpr(jstate, (Node *) mmexpr->args); - } - break; - case T_SQLValueFunction: - { - SQLValueFunction *svf = (SQLValueFunction *) node; - - APP_JUMB(svf->op); - /* type is fully determined by op */ - APP_JUMB(svf->typmod); - } - break; - case T_XmlExpr: - { - XmlExpr *xexpr = (XmlExpr *) node; - - APP_JUMB(xexpr->op); - JumbleExpr(jstate, (Node *) xexpr->named_args); - JumbleExpr(jstate, (Node *) xexpr->args); - } - break; - case T_NullTest: - { - NullTest *nt = (NullTest *) node; - - APP_JUMB(nt->nulltesttype); - JumbleExpr(jstate, (Node *) nt->arg); - } - break; - case T_BooleanTest: - { - BooleanTest *bt = (BooleanTest *) node; - - APP_JUMB(bt->booltesttype); - JumbleExpr(jstate, (Node *) bt->arg); - } - break; - case T_CoerceToDomain: - { - CoerceToDomain *cd = (CoerceToDomain *) node; - - APP_JUMB(cd->resulttype); - JumbleExpr(jstate, (Node *) cd->arg); - } - break; - case T_CoerceToDomainValue: - { - CoerceToDomainValue *cdv = (CoerceToDomainValue *) node; - - APP_JUMB(cdv->typeId); - } - break; - case T_SetToDefault: - { - SetToDefault *sd = (SetToDefault *) node; - - APP_JUMB(sd->typeId); - } - break; - case T_CurrentOfExpr: - { - CurrentOfExpr *ce = (CurrentOfExpr *) node; - - APP_JUMB(ce->cvarno); - if (ce->cursor_name) - APP_JUMB_STRING(ce->cursor_name); - APP_JUMB(ce->cursor_param); - } - break; - case T_NextValueExpr: - { - NextValueExpr *nve = (NextValueExpr *) node; - - APP_JUMB(nve->seqid); - APP_JUMB(nve->typeId); - } - break; - case T_InferenceElem: - { - InferenceElem *ie = (InferenceElem *) node; - - APP_JUMB(ie->infercollid); - APP_JUMB(ie->inferopclass); - JumbleExpr(jstate, ie->expr); - } - break; - case T_TargetEntry: - { - TargetEntry *tle = (TargetEntry *) node; - - APP_JUMB(tle->resno); - APP_JUMB(tle->ressortgroupref); - JumbleExpr(jstate, (Node *) tle->expr); - } - break; - case T_RangeTblRef: - { - RangeTblRef *rtr = (RangeTblRef *) node; - - APP_JUMB(rtr->rtindex); - } - break; - case T_JoinExpr: - { - JoinExpr *join = (JoinExpr *) node; - - APP_JUMB(join->jointype); - APP_JUMB(join->isNatural); - APP_JUMB(join->rtindex); - JumbleExpr(jstate, join->larg); - JumbleExpr(jstate, join->rarg); - JumbleExpr(jstate, join->quals); - } - break; - case T_FromExpr: - { - FromExpr *from = (FromExpr *) node; - - JumbleExpr(jstate, (Node *) from->fromlist); - JumbleExpr(jstate, from->quals); - } - break; - case T_OnConflictExpr: - { - OnConflictExpr *conf = (OnConflictExpr *) node; - - APP_JUMB(conf->action); - JumbleExpr(jstate, (Node *) conf->arbiterElems); - JumbleExpr(jstate, conf->arbiterWhere); - JumbleExpr(jstate, (Node *) conf->onConflictSet); - JumbleExpr(jstate, conf->onConflictWhere); - APP_JUMB(conf->constraint); - APP_JUMB(conf->exclRelIndex); - JumbleExpr(jstate, (Node *) conf->exclRelTlist); - } - break; - case T_List: - foreach(temp, (List *) node) - { - JumbleExpr(jstate, (Node *) lfirst(temp)); - } - break; - case T_IntList: - foreach(temp, (List *) node) - { - APP_JUMB(lfirst_int(temp)); - } - break; - case T_SortGroupClause: - { - SortGroupClause *sgc = (SortGroupClause *) node; - - APP_JUMB(sgc->tleSortGroupRef); - APP_JUMB(sgc->eqop); - APP_JUMB(sgc->sortop); - APP_JUMB(sgc->nulls_first); - } - break; - case T_GroupingSet: - { - GroupingSet *gsnode = (GroupingSet *) node; - - JumbleExpr(jstate, (Node *) gsnode->content); - } - break; - case T_WindowClause: - { - WindowClause *wc = (WindowClause *) node; - - APP_JUMB(wc->winref); - APP_JUMB(wc->frameOptions); - JumbleExpr(jstate, (Node *) wc->partitionClause); - JumbleExpr(jstate, (Node *) wc->orderClause); - JumbleExpr(jstate, wc->startOffset); - JumbleExpr(jstate, wc->endOffset); - } - break; - case T_CommonTableExpr: - { - CommonTableExpr *cte = (CommonTableExpr *) node; - - /* we store the string name because RTE_CTE RTEs need it */ - APP_JUMB_STRING(cte->ctename); - APP_JUMB(cte->ctematerialized); - JumbleQueryInternal(jstate, castNode(Query, cte->ctequery)); - } - break; - case T_SetOperationStmt: - { - SetOperationStmt *setop = (SetOperationStmt *) node; - - APP_JUMB(setop->op); - APP_JUMB(setop->all); - JumbleExpr(jstate, setop->larg); - JumbleExpr(jstate, setop->rarg); - } - break; - case T_RangeTblFunction: - { - RangeTblFunction *rtfunc = (RangeTblFunction *) node; - - JumbleExpr(jstate, rtfunc->funcexpr); - } - break; - case T_TableFunc: - { - TableFunc *tablefunc = (TableFunc *) node; - - JumbleExpr(jstate, tablefunc->docexpr); - JumbleExpr(jstate, tablefunc->rowexpr); - JumbleExpr(jstate, (Node *) tablefunc->colexprs); - } - break; - case T_TableSampleClause: - { - TableSampleClause *tsc = (TableSampleClause *) node; - - APP_JUMB(tsc->tsmhandler); - JumbleExpr(jstate, (Node *) tsc->args); - JumbleExpr(jstate, (Node *) tsc->repeatable); - } - break; - default: - /* Only a warning, since we can stumble along anyway */ - elog(WARNING, "unrecognized node type: %d", - (int) nodeTag(node)); - break; - } -} - -/* - * Record location of constant within query string of query tree - * that is currently being walked. - */ -static void -RecordConstLocation(JumbleState *jstate, int location) -{ - /* -1 indicates unknown or undefined location */ - if (location >= 0) - { - /* enlarge array if needed */ - if (jstate->clocations_count >= jstate->clocations_buf_size) - { - jstate->clocations_buf_size *= 2; - jstate->clocations = (LocationLen *) - repalloc(jstate->clocations, - jstate->clocations_buf_size * - sizeof(LocationLen)); - } - jstate->clocations[jstate->clocations_count].location = location; - /* initialize lengths to -1 to simplify third-party module usage */ - jstate->clocations[jstate->clocations_count].length = -1; - jstate->clocations_count++; - } -} diff --git a/src/include/Makefile b/src/include/Makefile index d6cbf9a063d..f6639834c59 100644 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -46,6 +46,7 @@ install: all installdirs $(INSTALL_DATA) pg_config.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) pg_config_ext.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) pg_config_os.h '$(DESTDIR)$(includedir_server)' + $(INSTALL_DATA) nodes/nodetags.h '$(DESTDIR)$(includedir_server)/nodes' $(INSTALL_DATA) utils/errcodes.h '$(DESTDIR)$(includedir_server)/utils' $(INSTALL_DATA) utils/fmgroids.h '$(DESTDIR)$(includedir_server)/utils' $(INSTALL_DATA) utils/fmgrprotos.h '$(DESTDIR)$(includedir_server)/utils' @@ -78,6 +79,7 @@ clean: rm -f storage/lwlocknames.h utils/probes.h rm -f catalog/schemapg.h catalog/system_fk_info.h rm -f catalog/pg_*_d.h catalog/gp_*_d.h catalog/header-stamp + rm -f nodes/nodetags.h nodes/header-stamp distclean maintainer-clean: clean rm -f pg_config.h pg_config_ext.h pg_config_os.h stamp-h stamp-ext-h diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h index e20bc30ca3f..8ad9577555e 100644 --- a/src/include/access/tupdesc.h +++ b/src/include/access/tupdesc.h @@ -97,8 +97,10 @@ typedef struct TupleDescData *TupleDesc; * These are never serialized on disk, only in the read/outfast protocol, * as part of PlannedStmts. */ -typedef struct tupleDescNode +typedef struct TupleDescNode { + pg_node_attr(no_copy_equal, custom_read_write) + NodeTag type; int natts; TupleDesc tuple; diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index 3e6ae6f688e..071a93d9223 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -48,11 +48,11 @@ typedef struct CookedConstraint */ NodeTag type; ConstrType contype; /* CONSTR_DEFAULT or CONSTR_CHECK */ - Oid conoid; /* constr OID if created, otherwise Invalid */ + Oid conoid pg_node_attr(read_as(InvalidOid), read_write_ignore); /* constr OID if created, otherwise Invalid */ char *name; /* name, or NULL if none */ AttrNumber attnum; /* which attr (only for DEFAULT) */ Node *expr; /* transformed default or check expr */ - bool skip_validation; /* skip validation? (only for CHECK) */ + bool skip_validation pg_node_attr(read_as(false), read_write_ignore); /* skip validation? (only for CHECK) */ bool is_local; /* constraint has local (non-inherited) def */ int inhcount; /* number of times constraint is inherited */ bool is_no_inherit; /* constraint has local def and cannot be diff --git a/src/include/commands/explain_gp.h b/src/include/commands/explain_gp.h new file mode 100644 index 00000000000..016e5449543 --- /dev/null +++ b/src/include/commands/explain_gp.h @@ -0,0 +1,91 @@ +/*------------------------------------------------------------------------- + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * explain_gp.h + * + * src/include/commands/explain_gp.h + * + *------------------------------------------------------------------------- + */ +#ifndef EXPLAIN_GP_H +#define EXPLAIN_GP_H + + +/* EXPLAIN ANALYZE statistics for one plan node of a slice */ +typedef struct CdbExplain_StatInst +{ + NodeTag pstype; /* PlanState node type */ + + /* fields from Instrumentation struct */ + instr_time starttime; /* Start time of current iteration of node */ + instr_time counter; /* Accumulated runtime for this node */ + double firsttuple; /* Time for first tuple of this cycle */ + double startup; /* Total startup time (in seconds) */ + double total; /* Total total time (in seconds) */ + double ntuples; /* Total tuples produced */ + double ntuples2; + double nloops; /* # of run cycles for this node */ + double nfiltered1; + double nfiltered2; + bool prf_work; + double nfilteredPRF; + double execmemused; /* executor memory used (bytes) */ + double workmemused; /* work_mem actually used (bytes) */ + double workmemwanted; /* work_mem to avoid workfile i/o (bytes) */ + bool workfileCreated; /* workfile created in this node */ + instr_time firststart; /* Start time of first iteration of node */ + int numPartScanned; /* Number of part tables scanned */ + + TuplesortInstrumentation sortstats; /* Sort stats, if this is a Sort node */ + HashInstrumentation hashstats; /* Hash stats, if this is a Hash node */ + IncrementalSortGroupInfo fullsortGroupInfo; /* Full sort group info for Incremental Sort node */ + IncrementalSortGroupInfo prefixsortGroupInfo; /* Prefix sort group info for Incremental Sort node */ + int bnotes; /* Offset to beginning of node's extra text */ + int enotes; /* Offset to end of node's extra text */ + int nworkers_launched; /* Number of workers launched for this node */ + WalUsage walusage; /* add WAL usage */ +} CdbExplain_StatInst; + + +/* EXPLAIN ANALYZE statistics for one process working on one slice */ +typedef struct CdbExplain_SliceWorker +{ + double peakmemused; /* bytes alloc in per-query mem context tree */ + double vmem_reserved; /* vmem reserved by a QE */ + int nworkers_launched; /* Number of workers launched for this slice */ +} CdbExplain_SliceWorker; + + +/* Header of EXPLAIN ANALYZE statistics message sent from qExec to qDisp */ +typedef struct CdbExplain_StatHdr +{ + NodeTag type; /* T_CdbExplain_StatHdr */ + int segindex; /* segment id */ + int nInst; /* num of StatInst entries following StatHdr */ + int bnotes; /* offset to extra text area */ + int enotes; /* offset to end of extra text area */ + + CdbExplain_SliceWorker worker; /* qExec's overall stats for slice */ + + /* + * During serialization, we use this as a temporary StatInst and save + * "one-at-a-time" StatInst into this variable. We then write this + * variable into buffer (serialize it) and then "recycle" the same inst + * for next plan node's StatInst. During deserialization, an Array + * [0..nInst-1] of StatInst entries is appended starting here. + */ + CdbExplain_StatInst inst[1]; + + /* extra text is appended after that */ +} CdbExplain_StatHdr; + +#endif //EXPLAIN_GP_H diff --git a/src/include/executor/execdesc.h b/src/include/executor/execdesc.h index bcf9dbd6cd8..0a3e50522aa 100644 --- a/src/include/executor/execdesc.h +++ b/src/include/executor/execdesc.h @@ -65,6 +65,8 @@ typedef struct SerializedParamExecData typedef struct SerializedParams { + pg_node_attr(custom_read_write, no_copy, no_equal) + NodeTag type; int nExternParams; @@ -163,6 +165,8 @@ typedef struct ExecSlice */ typedef struct SliceTable { + pg_node_attr(custom_read_write, custom_copy_equal) + NodeTag type; int localSlice; /* Index of the slice to execute. */ @@ -181,6 +185,8 @@ typedef struct SliceTable */ typedef struct CursorPosInfo { + pg_node_attr(no_equal) + NodeTag type; char *cursor_name; @@ -201,6 +207,8 @@ typedef struct CursorPosInfo */ typedef struct QueryDispatchDesc { + pg_node_attr(no_copy, no_equal) + NodeTag type; /* @@ -267,8 +275,10 @@ typedef struct QueryDispatchDesc * When a CREATE command is dispatched to segments, the OIDs used for the * new objects are sent in a list of OidAssignments. */ -typedef struct +typedef struct OidAssignment { + pg_node_attr(no_equal, custom_read_write) + NodeTag type; /* diff --git a/src/include/nodes/altertablenodes.h b/src/include/nodes/altertablenodes.h index b919179b8db..f79859674b1 100644 --- a/src/include/nodes/altertablenodes.h +++ b/src/include/nodes/altertablenodes.h @@ -55,6 +55,8 @@ typedef struct AlteredTableInfo { + pg_node_attr(no_equal, custom_copy_equal, custom_read_write) + NodeTag type; /* Information saved before any work commences: */ @@ -129,6 +131,8 @@ typedef struct ExprState ExprState; /* Note: new NOT NULL constraints are handled elsewhere */ typedef struct NewConstraint { + pg_node_attr(no_equal, no_copy, custom_read_write) + NodeTag type; char *name; /* Constraint name, or NULL if none */ @@ -150,11 +154,12 @@ typedef struct NewConstraint */ typedef struct NewColumnValue { + pg_node_attr(no_equal, no_copy) NodeTag type; AttrNumber attnum; /* which column */ Expr *expr; /* expression to compute */ - ExprState *exprstate; /* execution state */ + ExprState *exprstate pg_node_attr(read_as(NULL), read_write_ignore); /* execution state */ bool is_generated; /* is it a GENERATED expression? */ } NewColumnValue; diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index bd2c1bcf58c..a7fc0d02d67 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -29,703 +29,12 @@ typedef enum NodeTag { T_Invalid = 0, - /* - * TAGS FOR EXECUTOR NODES (execnodes.h) - */ - T_IndexInfo, - T_ExprContext, - T_ProjectionInfo, - T_JunkFilter, - T_OnConflictSetState, - T_MergeActionState, - T_ResultRelInfo, - T_EState, - T_TupleTableSlot, - T_CdbProcess, - T_SliceTable, - T_CursorPosInfo, - T_PartitionState, - T_QueryDispatchDesc, - T_OidAssignment, - - /* - * TAGS FOR PLAN NODES (plannodes.h) - */ - T_Plan, - T_Scan, - T_Join, - - /* Real plan node starts below. Scan and Join are "Virtual nodes", - * It will take the form of IndexScan, SeqScan, etc. - * CteScan will take the form of SubqueryScan. - */ - T_Result, - T_Plan_Start = T_Result, - T_ProjectSet, - T_ModifyTable, - T_Append, - T_MergeAppend, - T_RecursiveUnion, - T_Sequence, - T_BitmapAnd, - T_BitmapOr, - T_SeqScan, - T_DynamicSeqScan, - T_SampleScan, - T_IndexScan, - T_DynamicIndexScan, - T_DynamicIndexOnlyScan, - T_IndexOnlyScan, - T_BitmapIndexScan, - T_DynamicBitmapIndexScan, - T_BitmapHeapScan, - T_DynamicBitmapHeapScan, - T_TidScan, - T_TidRangeScan, - T_SubqueryScan, - T_FunctionScan, - T_TableFunctionScan, - T_ValuesScan, - T_TableFuncScan, - T_CteScan, - T_NamedTuplestoreScan, - T_WorkTableScan, - T_ForeignScan, - T_DynamicForeignScan, - T_CustomScan, - T_NestLoop, - T_MergeJoin, - T_HashJoin, - T_Material, - T_Memoize, - T_Sort, - T_IncrementalSort, - T_Group, - T_Agg, - T_TupleSplit, - T_WindowAgg, - T_WindowHashAgg, - T_Unique, - T_Gather, - T_GatherMerge, - T_Hash, - T_RuntimeFilter, - T_SetOp, - T_LockRows, - T_Limit, - T_Motion, - T_ShareInputScan, - T_SplitUpdate, - T_SplitMerge, - T_AssertOp, - T_PartitionSelector, - T_Plan_End, - /* these aren't subclasses of Plan: */ - T_NestLoopParam, - T_PlanRowMark, - T_PartitionPruneInfo, - T_PartitionedRelPruneInfo, - T_PartitionPruneStepOp, - T_PartitionPruneStepCombine, - T_PlanInvalItem, - - /* - * TAGS FOR PLAN STATE NODES (execnodes.h) - * - * These should correspond one-to-one with Plan node types. - */ - T_PlanState, - T_ScanState, - T_JoinState, - - /* Real plan node starts below. Scan and Join are "Virtal nodes", - * It will take the form of IndexScan, SeqScan, etc. - */ - T_ResultState, - T_ProjectSetState, - T_ModifyTableState, - T_AppendState, - T_MergeAppendState, - T_RecursiveUnionState, - T_SequenceState, - T_BitmapAndState, - T_BitmapOrState, - T_SeqScanState, - T_DynamicSeqScanState, - T_SampleScanState, - T_IndexScanState, - T_DynamicIndexScanState, - T_DynamicIndexOnlyScanState, - T_IndexOnlyScanState, - T_BitmapIndexScanState, - T_DynamicBitmapIndexScanState, - T_BitmapHeapScanState, - T_DynamicBitmapHeapScanState, - T_TidScanState, - T_TidRangeScanState, - T_SubqueryScanState, - T_FunctionScanState, - T_TableFunctionState, - T_TableFuncScanState, - T_ValuesScanState, - T_CteScanState, - T_NamedTuplestoreScanState, - T_WorkTableScanState, - T_ForeignScanState, - T_DynamicForeignScanState, - T_CustomScanState, - T_NestLoopState, - T_MergeJoinState, - T_HashJoinState, - T_MaterialState, - T_MemoizeState, - T_SortState, - T_IncrementalSortState, - T_GroupState, - T_AggState, - T_TupleSplitState, - T_WindowAggState, - T_UniqueState, - T_GatherState, - T_GatherMergeState, - T_HashState, - T_RuntimeFilterState, - T_SetOpState, - T_LockRowsState, - T_LimitState, - T_MotionState, - T_ShareInputScanState, - T_SplitUpdateState, - T_SplitMergeState, - T_AssertOpState, - T_PartitionSelectorState, - - /* - * TupleDesc and ParamListInfo are not Nodes as such, but you can wrap - * them in TupleDescNode and SerializedParams structs for serialization. - */ - T_TupleDescNode, - T_SerializedParams, - - /* - * TAGS FOR PRIMITIVE NODES (primnodes.h) - */ - T_Alias, - T_RangeVar, - T_TableFunc, - T_Expr, - T_Var, - T_Const, - T_Param, - T_DQAExpr, - T_Aggref, - T_GroupingFunc, - T_WindowFunc, - T_SubscriptingRef, - T_FuncExpr, - T_NamedArgExpr, - T_OpExpr, - T_DistinctExpr, - T_NullIfExpr, - T_ScalarArrayOpExpr, - T_BoolExpr, - T_SubLink, - T_SubPlan, - T_AlternativeSubPlan, - T_FieldSelect, - T_FieldStore, - T_RelabelType, - T_CoerceViaIO, - T_ArrayCoerceExpr, - T_ConvertRowtypeExpr, - T_CollateExpr, - T_CaseExpr, - T_CaseWhen, - T_CaseTestExpr, - T_ArrayExpr, - T_RowExpr, - T_RowCompareExpr, - T_CoalesceExpr, - T_MinMaxExpr, - T_SQLValueFunction, - T_XmlExpr, - T_JsonFormat, - T_JsonReturning, - T_JsonValueExpr, - T_JsonConstructorExpr, - T_JsonIsPredicate, - T_NullTest, - T_BooleanTest, - T_CoerceToDomain, - T_CoerceToDomainValue, - T_SetToDefault, - T_CurrentOfExpr, - T_NextValueExpr, - T_InferenceElem, - T_TargetEntry, - T_RangeTblRef, - T_JoinExpr, - T_FromExpr, - T_OnConflictExpr, - T_IntoClause, - T_CopyIntoClause, - T_RefreshClause, - T_Flow, - T_GroupId, - T_GroupingSetId, - T_AggExprId, - T_RowIdExpr, - T_DistributedBy, - T_DMLActionExpr, - - /* - * TAGS FOR EXPRESSION STATE NODES (execnodes.h) - * - * ExprState represents the evaluation state for a whole expression tree. - * Most Expr-based plan nodes do not have a corresponding expression state - * node, they're fully handled within execExpr* - but sometimes the state - * needs to be shared with other parts of the executor, as for example - * with SubPlanState, which nodeSubplan.c has to modify. - */ - T_ExprState, - T_WindowFuncExprState, - T_SetExprState, - T_SubPlanState, - T_DomainConstraintState, - T_AggExprIdState, - T_RowIdExprState, - - /* - * TAGS FOR PLANNER NODES (pathnodes.h) - */ - T_PlannerInfo, - T_PlannerGlobal, - T_RelOptInfo, - T_IndexOptInfo, - T_ForeignKeyOptInfo, - T_ParamPathInfo, - T_RelAggInfo, - T_Path, - T_AppendOnlyPath, - T_AOCSPath, - T_ExternalPath, - T_CtePath, - T_IndexPath, - T_BitmapHeapPath, - T_BitmapAndPath, - T_BitmapOrPath, - T_TidPath, - T_TidRangePath, - T_SubqueryScanPath, - T_TableFunctionScanPath, - T_ForeignPath, - T_CustomPath, - T_NestPath, - T_MergePath, - T_HashPath, - T_RuntimeFilterPath, - T_AppendPath, - T_MergeAppendPath, - T_GroupResultPath, - T_MaterialPath, - T_MemoizePath, - T_UniquePath, - T_GatherPath, - T_GatherMergePath, - T_ProjectionPath, - T_ProjectSetPath, - T_SortPath, - T_IncrementalSortPath, - T_GroupPath, - T_UpperUniquePath, - T_AggPath, - T_GroupingSetsPath, - T_MinMaxAggPath, - T_WindowAggPath, - T_TupleSplitPath, - T_SetOpPath, - T_RecursiveUnionPath, - T_LockRowsPath, - T_ModifyTablePath, - T_LimitPath, - /* these aren't subclasses of Path: */ - T_EquivalenceClass, - T_EquivalenceMember, - T_PathKey, - T_PathTarget, - T_RestrictInfo, - T_IndexClause, - T_PlaceHolderVar, - T_SpecialJoinInfo, - T_OuterJoinClauseInfo, - T_AppendRelInfo, - T_RowIdentityVarInfo, - T_PlaceHolderInfo, - T_GroupedVarInfo, - T_MinMaxAggInfo, - T_SegfileMapNode, - T_PlannerParamItem, - T_AggInfo, - T_AggTransInfo, - T_RollupData, - T_GroupingSetData, - T_StatisticExtInfo, - T_JoinDomain, - - /* Tags for MPP planner nodes (relation.h) */ - T_CdbMotionPath = 580, - T_PartitionSelectorPath, - T_SplitUpdatePath, - T_SplitMergePath, - T_CdbRelColumnInfo, - T_DistributionKey, - - /* - * TAGS FOR MEMORY NODES (memnodes.h) - */ - T_MemoryContext, - T_AllocSetContext, - T_SlabContext, - T_GenerationContext, - T_MemoryAccount, - - /* - * TAGS FOR VALUE NODES (value.h) - */ - T_Value, - T_Integer, - T_Float, - T_Boolean, - T_String, - T_BitString, - T_Null, - - /* - * TAGS FOR LIST NODES (pg_list.h) - */ - T_List, - T_IntList, - T_OidList, - T_XidList, - - /* - * TAGS FOR EXTENSIBLE NODES (extensible.h) - */ - T_ExtensibleNode, - T_ErrorSaveContext, - - /* - * TAGS FOR STATEMENT NODES (mostly in parsenodes.h) - */ - T_RawStmt, - T_Query, - T_PlannedStmt, - T_InsertStmt, - T_DeleteStmt, - T_UpdateStmt, - T_MergeStmt, - T_SelectStmt, - T_ReturnStmt, - T_PLAssignStmt, - T_AlterTableStmt, - T_AlterTableCmd, - T_AlterDomainStmt, - T_SetOperationStmt, - T_GrantStmt, - T_GrantRoleStmt, - T_AlterDefaultPrivilegesStmt, - T_ClosePortalStmt, - T_ClusterStmt, - T_CopyStmt, - T_CreateStmt, - T_SingleRowErrorDesc, - T_ExtTableTypeDesc, - T_CreateExternalStmt, - T_DefineStmt, - T_DropStmt, - T_TruncateStmt, - T_CommentStmt, - T_FetchStmt, - T_IndexStmt, - T_CreateFunctionStmt, - T_AlterFunctionStmt, - T_DoStmt, - T_RenameStmt, - T_RuleStmt, - T_NotifyStmt, - T_ListenStmt, - T_UnlistenStmt, - T_TransactionStmt, - T_ViewStmt, - T_LoadStmt, - T_CreateDomainStmt, - T_CreatedbStmt, - T_DropdbStmt, - T_VacuumStmt, - T_ExplainStmt, - T_CreateTableAsStmt, - T_CreateSeqStmt, - T_AlterSeqStmt, - T_VariableSetStmt, - T_VariableShowStmt, - T_DiscardStmt, - T_CreateTrigStmt, - T_CreatePLangStmt, - T_CreateRoleStmt, - T_AlterRoleStmt, - T_DropRoleStmt, - T_CreateProfileStmt, - T_AlterProfileStmt, - T_DropProfileStmt, - T_CreateQueueStmt, - T_AlterQueueStmt, - T_DropQueueStmt, - T_CreateResourceGroupStmt, - T_DropResourceGroupStmt, - T_AlterResourceGroupStmt, - T_LockStmt, - T_ConstraintsSetStmt, - T_ReindexStmt, - T_CheckPointStmt, - T_CreateSchemaStmt, - T_AlterSchemaStmt, - T_CreateTagStmt, - T_AlterTagStmt, - T_DropTagStmt, - T_AlterDatabaseStmt, - T_AlterDatabaseRefreshCollStmt, - T_AlterDatabaseSetStmt, - T_AlterRoleSetStmt, - T_CreateConversionStmt, - T_CreateCastStmt, - T_CreateOpClassStmt, - T_CreateOpFamilyStmt, - T_AlterOpFamilyStmt, - T_PrepareStmt, - T_ExecuteStmt, - T_DeallocateStmt, - T_DeclareCursorStmt, - T_CreateTableSpaceStmt, - T_DropTableSpaceStmt, - T_AlterObjectDependsStmt, - T_AlterObjectSchemaStmt, - T_AlterOwnerStmt, - T_AlterOperatorStmt, - T_AlterTypeStmt, - T_DropOwnedStmt, - T_ReassignOwnedStmt, - T_CompositeTypeStmt, - T_CreateEnumStmt, - T_CreateRangeStmt, - T_AlterEnumStmt, - T_AlterTSDictionaryStmt, - T_AlterTSConfigurationStmt, - T_PublicationTable, - T_PublicationObjSpec, - T_CreateFdwStmt, - T_AlterFdwStmt, - T_CreateForeignServerStmt, - T_AlterForeignServerStmt, - T_CreateStorageServerStmt, - T_AlterStorageServerStmt, - T_DropStorageServerStmt, - T_CreateUserMappingStmt, - T_AlterUserMappingStmt, - T_DropUserMappingStmt, - T_CreateStorageUserMappingStmt, - T_AlterStorageUserMappingStmt, - T_DropStorageUserMappingStmt, - T_AlterTableSpaceOptionsStmt, - T_AlterTableMoveAllStmt, - T_SecLabelStmt, - T_CreateForeignTableStmt, - T_ImportForeignSchemaStmt, - T_CreateExtensionStmt, - T_AlterExtensionStmt, - T_AlterExtensionContentsStmt, - T_CreateEventTrigStmt, - T_AlterEventTrigStmt, - T_RefreshMatViewStmt, - T_ReplicaIdentityStmt, - T_AlterSystemStmt, - T_CreatePolicyStmt, - T_AlterPolicyStmt, - T_CreateTransformStmt, - T_CreateAmStmt, - T_CreatePublicationStmt, - T_AlterPublicationStmt, - T_CreateSubscriptionStmt, - T_AlterSubscriptionStmt, - T_DropSubscriptionStmt, - T_CreateStatsStmt, - T_AlterCollationStmt, - T_CallStmt, - T_AlterStatsStmt, - T_CreateTaskStmt, - T_AlterTaskStmt, - T_DropTaskStmt, - - /* GPDB additions */ - T_PartitionBy, - T_PartitionRangeItem, - T_PartitionValuesSpec, - T_CreateDirectoryTableStmt, - T_AlterDirectoryTableStmt, - T_DropDirectoryTableStmt, - T_CreateFileSpaceStmt, - T_FileSpaceEntry, - T_DropFileSpaceStmt, - T_TableValueExpr, - T_DenyLoginInterval, - T_DenyLoginPoint, - T_AlteredTableInfo, - T_NewConstraint, - T_NewColumnValue, - T_GpPartitionDefinition, - T_GpPartDefElem, - T_GpPartitionRangeItem, - T_GpPartitionRangeSpec, - T_GpPartitionListSpec, - T_GpAlterPartitionId, - T_GpDropPartitionCmd, - T_GpSplitPartitionCmd, - T_GpAlterPartitionCmd, - T_CreateWarehouseStmt, - T_DropWarehouseStmt, - T_AddForeignSegStmt, - - /* - * TAGS FOR PARSE TREE NODES (parsenodes.h) - */ - T_A_Expr, - T_ColumnRef, - T_ParamRef, - T_A_Const, - T_FuncCall, - T_A_Star, - T_A_Indices, - T_A_Indirection, - T_A_ArrayExpr, - T_ResTarget, - T_MultiAssignRef, - T_TypeCast, - T_CollateClause, - T_SortBy, - T_WindowDef, - T_RangeSubselect, - T_RangeFunction, - T_RangeTableSample, - T_RangeTableFunc, - T_RangeTableFuncCol, - T_TypeName, - T_ColumnDef, - T_IndexElem, - T_StatsElem, - T_Constraint, - T_DefElem, - T_RangeTblEntry, - T_RTEPermissionInfo, - T_RangeTblFunction, - T_TableSampleClause, - T_WithCheckOption, - T_SortGroupClause, - T_GroupingSet, - T_WindowClause, - T_ObjectWithArgs, - T_AccessPriv, - T_CreateOpClassItem, - T_TableLikeClause, - T_FunctionParameter, - T_LockingClause, - T_RowMarkClause, - T_XmlSerialize, - T_WithClause, - T_InferClause, - T_OnConflictClause, - T_CTESearchClause, - T_CTECycleClause, - T_CommonTableExpr, - T_MergeWhenClause, - T_MergeAction, - T_ColumnReferenceStorageDirective, - T_DistributionKeyElem, - T_RoleSpec, - T_TriggerTransition, - T_JsonOutput, - T_JsonKeyValue, - T_JsonObjectConstructor, - T_JsonArrayConstructor, - T_JsonArrayQueryConstructor, - T_JsonAggConstructor, - T_JsonObjectAgg, - T_JsonArrayAgg, - T_PartitionElem, - T_PartitionSpec, - T_PartitionBoundSpec, - T_PartitionRangeDatum, - T_PartitionCmd, - T_VacuumRelation, - - T_Bitmapset, - - /* - * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h) - */ - T_IdentifySystemCmd, - T_BaseBackupCmd, - T_CreateReplicationSlotCmd, - T_DropReplicationSlotCmd, - T_StartReplicationCmd, - T_ReadReplicationSlotCmd, - T_TimeLineHistoryCmd, - T_SQLCmd, - - /* - * TAGS FOR RANDOM OTHER STUFF - * - * These are objects that aren't part of parse/plan/execute node tree - * structures, but we give them NodeTags anyway for identification - * purposes (usually because they are involved in APIs where we want to - * pass multiple object types through the same pointer). - */ - T_TriggerData, /* in commands/trigger.h */ - T_EventTriggerData, /* in commands/event_trigger.h */ - T_ReturnSetInfo, /* in nodes/execnodes.h */ - T_WindowObjectData, /* private in nodeWindowAgg.c */ - T_TIDBitmap, /* in nodes/tidbitmap.h */ - T_InlineCodeBlock, /* in nodes/parsenodes.h */ - T_FdwRoutine, /* in foreign/fdwapi.h */ - T_IndexAmRoutine, /* in access/amapi.h */ - T_TableAmRoutine, /* in access/tableam.h */ - T_TsmRoutine, /* in access/tsmapi.h */ - T_ForeignKeyCacheInfo, /* in utils/rel.h */ - T_CallContext, /* in nodes/parsenodes.h */ - T_SupportRequestSimplify, /* in nodes/supportnodes.h */ - T_SupportRequestSelectivity, /* in nodes/supportnodes.h */ - T_SupportRequestCost, /* in nodes/supportnodes.h */ - T_SupportRequestRows, /* in nodes/supportnodes.h */ - T_SupportRequestIndexCondition, /* in nodes/supportnodes.h */ - T_SupportRequestWFuncMonotonic, - T_SupportRequestOptimizeWindowClause, - - T_StreamBitmap, /* in nodes/tidbitmap.h */ - T_FormatterData, /* in access/formatter.h */ - T_ExtProtocolData, /* in access/extprotocol.h */ - T_ExtProtocolValidatorData, /* in access/extprotocol.h */ - T_ExternalScanInfo, /* in access/plannodes.h */ - T_CookedConstraint, /* in catalog/heap.h */ - - /* CDB: tags for random other stuff */ - T_CdbExplain_StatHdr = 1000, /* in cdb/cdbexplain.c */ - T_GpPolicy, /* in catalog/gp_distribution_policy.h */ - T_RetrieveStmt, - T_ReindexIndexInfo, /* in nodes/parsenodes.h */ - T_EphemeralNamedRelationInfo, /* utils/queryenvironment.h */ - T_CompoundUtilityStmt, - T_CreateForeignStmt, - +#include "nodes/nodetags.h" } NodeTag; +#define T_Plan_Start T_Plan +#define T_Plan_End T_PlanRowMark + /* * pg_node_attr() - Used in node definitions to set extra information for * gen_node_support.pl diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index b79846b3d6d..999934bc1e0 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -768,6 +768,8 @@ typedef struct RangeTableSample */ typedef struct ColumnDef { + pg_node_attr(custom_copy_equal, custom_read_write) + NodeTag type; char *colname; /* name of column */ TypeName *typeName; /* type of column */ @@ -966,8 +968,8 @@ typedef struct PartitionSpec PartitionStrategy strategy; List *partParams; /* List of PartitionElems */ - struct GpPartitionDefinition *gpPartDef; - struct PartitionSpec *subPartSpec; /* subpartition specification */ + struct GpPartitionDefinition *gpPartDef pg_node_attr(read_as(NULL), read_write_ignore); + struct PartitionSpec *subPartSpec pg_node_attr(read_as(NULL), read_write_ignore); /* subpartition specification */ int location; /* token location, or -1 if unknown */ } PartitionSpec; @@ -1208,7 +1210,7 @@ typedef struct RangeTblEntry /* These are for pre-planned sub-queries only. They are internal to * window planning. */ - struct PlannerInfo *subquery_root; /* merge16_delete_temp */ + struct PlannerInfo *subquery_root pg_node_attr(equal_ignore, copy_ignore); /* merge16_delete_temp */ List *subquery_rtable; List *subquery_pathkeys; @@ -1420,7 +1422,7 @@ typedef struct RangeTblFunction List *funccoltypmods pg_node_attr(query_jumble_ignore); /* OID list of column collation OIDs */ List *funccolcollations pg_node_attr(query_jumble_ignore); - bytea *funcuserdata; /* merge16_delete_temp */ /* describe function user data. assume bytea */ + bytea *funcuserdata pg_node_attr(array_size(funccolcount)); /* merge16_delete_temp */ /* describe function user data. assume bytea */ /* This is set during planning for use by the executor: */ /* PARAM_EXEC Param IDs affecting this func */ @@ -2321,8 +2323,8 @@ typedef struct CreateSchemaStmt NodeTag type; char *schemaname; /* the name of the schema to create */ RoleSpec *authrole; /* the owner of the created schema */ - List *schemaElts; /* schema components (list of parsenodes) */ - bool if_not_exists; /* just do nothing if schema already exists? */ + List *schemaElts pg_node_attr(read_as(NIL), read_write_ignore); /* schema components (list of parsenodes) */ + bool if_not_exists pg_node_attr(read_as(false), read_write_ignore); /* just do nothing if schema already exists? */ /* * In GPDB, when a CreateSchemaStmt is dispatched to executor nodes, the @@ -2885,7 +2887,7 @@ typedef enum ExtTableType EXTTBL_TYPE_EXECUTE /* table defined with EXECUTE clause */ } ExtTableType; -typedef struct +typedef struct ExtTableTypeDesc { NodeTag type; ExtTableType exttabletype; @@ -3938,7 +3940,8 @@ typedef struct FetchStmt * properties are empty. * ---------------------- */ -typedef enum IndexConcurrentlyPhase { +typedef enum IndexConcurrentlyPhase +{ CONCURRENTLY_INIT, CONCURRENTLY_BUILD_INDEX, CONCURRENTLY_VALIDATE_INDEX, @@ -4347,7 +4350,7 @@ typedef struct ViewStmt Node *query; /* the SELECT query (as a raw parse tree) */ bool replace; /* replace an existing view? */ List *options; /* options from WITH clause */ - ViewCheckOption withCheckOption; /* WITH CHECK OPTION */ + ViewCheckOption withCheckOption pg_node_attr(read_as(NO_CHECK_OPTION), read_write_ignore); /* WITH CHECK OPTION */ List *tags; /* List of tags DefElem nodes */ } ViewStmt; diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index d5556d66c4b..d9311233747 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -156,7 +156,7 @@ typedef struct ApplyShareInputContext */ typedef struct PlannerGlobal { - pg_node_attr(no_copy_equal, no_read, no_query_jumble) + pg_node_attr(no_copy_equal, no_read, no_query_jumble, custom_read_write) NodeTag type; @@ -169,7 +169,7 @@ typedef struct PlannerGlobal /* PlannerInfos for SubPlan nodes */ List *subroots pg_node_attr(read_write_ignore); - int *subplan_sliceIds; /* slice IDs for SubPlan nodes. */ + int *subplan_sliceIds pg_node_attr(array_size(subplans)); /* slice IDs for SubPlan nodes. */ /* indices of subplans that require REWIND */ Bitmapset *rewindPlanIDs; @@ -270,7 +270,7 @@ typedef struct PlannerInfo PlannerInfo; struct PlannerInfo { - pg_node_attr(no_copy_equal, no_read, no_query_jumble) + pg_node_attr(no_copy_equal, no_read, no_query_jumble, custom_read_write) NodeTag type; @@ -1297,7 +1297,7 @@ typedef struct RelOptInfo */ typedef struct RelAggInfo { - pg_node_attr(custom_copy_equal) + pg_node_attr(no_copy_equal, no_read) NodeTag type; @@ -1792,7 +1792,7 @@ typedef enum VolatileFunctionStatus */ typedef struct PathTarget { - pg_node_attr(no_copy_equal, no_read, no_query_jumble) + pg_node_attr(no_read, no_query_jumble) NodeTag type; @@ -1934,7 +1934,7 @@ typedef struct Path Cost startup_cost; /* cost expended before fetching any tuples */ Cost total_cost; /* total cost (assuming all tuples fetched) */ - EstimatedBytes memory; /* executor RAM needed for Path + kids */ + EstimatedBytes memory pg_node_attr(read_write_ignore); /* executor RAM needed for Path + kids */ CdbPathLocus locus; /* distribution of the result tuples */ diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index f759a976ec6..56bc51ba7d2 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -77,7 +77,7 @@ typedef enum DMLAction */ typedef struct PlannedStmt { - pg_node_attr(no_equal, no_query_jumble) + pg_node_attr(no_equal, no_query_jumble, custom_copy_equal, custom_read_write) NodeTag type; @@ -122,7 +122,7 @@ typedef struct PlannedStmt List *subplans; /* Plan trees for SubPlan expressions; note * that some could be NULL */ - int *subplan_sliceIds; /* merge16_delete_temp */ /* slice IDs containing SubPlans; size equals 'subplans' */ + int *subplan_sliceIds pg_node_attr(array_size(subplans)); /* merge16_delete_temp */ /* slice IDs containing SubPlans; size equals 'subplans' */ Bitmapset *rewindPlanIDs; /* indices of subplans that require REWIND */ @@ -272,7 +272,7 @@ typedef struct PlanSlice */ typedef struct Plan { - pg_node_attr(abstract, no_equal, no_query_jumble) + pg_node_attr(no_equal, no_query_jumble) NodeTag type; @@ -328,7 +328,7 @@ typedef struct Plan * MPP needs to keep track of the characteristics of flow of output * tuple of Plan nodes. */ - Flow *flow; /* Flow description. Initially NULL. + Flow *flow pg_node_attr(read_as(NULL), read_write_ignore); /* Flow description. Initially NULL. * Set during parallelization. */ @@ -339,8 +339,8 @@ typedef struct Plan * Field flow has the locus info only in the top Plan nodes, * other nodes couldn't be set that. */ - uint8 locustype; - int parallel; /* parallel workers of this plan if there was */ + uint8 locustype pg_node_attr(read_as(0), read_write_ignore); + int parallel pg_node_attr(read_as(0), read_write_ignore); /* parallel workers of this plan if there was */ /** * How much memory (in KB) should be used to execute this plan node? @@ -381,7 +381,7 @@ typedef struct Result Node *resconstantqual; int numHashFilterCols; - int16 *hashFilterColIdx pg_node_attr(array_size(numHashFilterCols)); + AttrNumber *hashFilterColIdx pg_node_attr(array_size(numHashFilterCols)); Oid *hashFilterFuncs pg_node_attr(array_size(numHashFilterCols)); } Result; @@ -595,8 +595,6 @@ typedef struct BitmapOr */ typedef struct Scan { - pg_node_attr(abstract) - Plan plan; Index scanrelid; /* relid is index into the range table */ } Scan; @@ -1188,8 +1186,6 @@ typedef struct CustomScan */ typedef struct Join { - pg_node_attr(abstract) - Plan plan; JoinType jointype; bool inner_unique; @@ -1648,22 +1644,22 @@ typedef struct WindowHashAgg Plan plan; Index winref; /* ID referenced by window functions */ int partNumCols; /* number of columns in partition clause */ - AttrNumber *partColIdx; /* their indexes in the target list */ - Oid *partOperators; /* equality operators for partition columns */ - Oid *partCollations; /* collations for partition columns */ + AttrNumber *partColIdx pg_node_attr(array_size(partNumCols)); /* their indexes in the target list */ + Oid *partOperators pg_node_attr(array_size(partNumCols)); /* equality operators for partition columns */ + Oid *partCollations pg_node_attr(array_size(partNumCols)); /* collations for partition columns */ /* * Different with `WindowAgg`, WindowHashAgg may use the * `order by` information. */ int ordNumCols; /* number of sort-key columns */ - AttrNumber *ordColIdx; /* their indexes in the target list */ - Oid *ordOperators; /* OIDs of operators to sort them by */ - Oid *ordCollations; /* OIDs of collations */ - bool *ordNullsFirst; /* NULLS FIRST/LAST directions */ + AttrNumber *ordColIdx pg_node_attr(array_size(ordNumCols)); /* their indexes in the target list */ + Oid *ordOperators pg_node_attr(array_size(ordNumCols)); /* OIDs of operators to sort them by */ + Oid *ordCollations pg_node_attr(array_size(ordNumCols)); /* OIDs of collations */ + bool *ordNullsFirst pg_node_attr(array_size(ordNumCols)); /* NULLS FIRST/LAST directions */ int frameOptions; /* frame_clause options, see WindowDef */ - Node *startOffset; /* expression for starting bound, if any */ - Node *endOffset; /* expression for ending bound, if any */ + Node *startOffset pg_node_attr(array_size(frameOptions)); /* expression for starting bound, if any */ + Node *endOffset pg_node_attr(array_size(frameOptions)); /* expression for ending bound, if any */ /* these fields are used with RANGE offset PRECEDING/FOLLOWING: */ Oid startInRangeFunc; /* in_range function for startOffset */ Oid endInRangeFunc; /* in_range function for endOffset */ @@ -1892,6 +1888,7 @@ typedef enum MotionType */ typedef struct Motion { + pg_node_attr(no_equal, custom_read_write, custom_copy_equal) Plan plan; MotionType motionType; @@ -1900,7 +1897,7 @@ typedef struct Motion /* For Hash */ List *hashExprs; /* list of hash expressions */ - Oid *hashFuncs; /* merge16_delete_temp */ /* corresponding hash functions */ + Oid *hashFuncs pg_node_attr(array_size(hashExprs)); /* merge16_delete_temp */ /* corresponding hash functions */ int numHashSegments; /* the module number of the hash function */ /* For Explicit */ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 15a96a7b28a..c85d98b868c 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -195,8 +195,6 @@ typedef struct RefreshClause */ typedef struct Expr { - pg_node_attr(abstract) - NodeTag type; } Expr; @@ -520,7 +518,7 @@ typedef struct Aggref } Aggref; -typedef struct +typedef struct DQAExpr { Expr xpr; @@ -577,7 +575,7 @@ typedef struct GroupId typedef struct GroupingSetId { Expr xpr; - int location; /* token location */ + int location pg_node_attr(query_jumble_location); /* token location */ } GroupingSetId; /* diff --git a/src/include/utils/queryjumble.h b/src/include/nodes/queryjumble.h similarity index 56% rename from src/include/utils/queryjumble.h rename to src/include/nodes/queryjumble.h index c472bddc64a..e820f18055b 100644 --- a/src/include/utils/queryjumble.h +++ b/src/include/nodes/queryjumble.h @@ -3,21 +3,19 @@ * queryjumble.h * Query normalization and fingerprinting. * - * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * src/include/utils/queryjumble.h + * src/include/nodes/queryjumble.h * *------------------------------------------------------------------------- */ -#ifndef QUERYJUBLE_H -#define QUERYJUBLE_H +#ifndef QUERYJUMBLE_H +#define QUERYJUMBLE_H #include "nodes/parsenodes.h" -#define JUMBLE_SIZE 1024 /* query serialization buffer size */ - /* * Struct for tracking locations/lengths of constants during normalization */ @@ -25,6 +23,12 @@ typedef struct LocationLen { int location; /* start offset in query text */ int length; /* length in bytes, or -1 to ignore */ + + /* Does this location represent a squashed list? */ + bool squashed; + + /* Is this location a PARAM_EXTERN parameter? */ + bool extern_param; } LocationLen; /* @@ -48,8 +52,29 @@ typedef struct JumbleState /* Current number of valid entries in clocations array */ int clocations_count; - /* highest Param id we've seen, in order to start normalization correctly */ + /* + * ID of the highest PARAM_EXTERN parameter we've seen in the query; used + * to start normalization correctly. However, if there are any squashed + * lists in the query, we disregard query-supplied parameter numbers and + * renumber everything. This is to avoid possible gaps caused by + * squashing in case any params are in squashed lists. + */ int highest_extern_param_id; + + /* Whether squashable lists are present */ + bool has_squashed_lists; + + /* + * Count of the number of NULL nodes seen since last appending a value. + * These are flushed out to the jumble buffer before subsequent appends + * and before performing the final jumble hash. + */ + unsigned int pending_nulls; + +#ifdef USE_ASSERT_CHECKING + /* The total number of bytes added to the jumble buffer */ + Size total_jumble_len; +#endif } JumbleState; /* Values for the compute_query_id GUC */ @@ -58,19 +83,23 @@ enum ComputeQueryIdType COMPUTE_QUERY_ID_OFF, COMPUTE_QUERY_ID_ON, COMPUTE_QUERY_ID_AUTO, - COMPUTE_QUERY_ID_REGRESS + COMPUTE_QUERY_ID_REGRESS, }; +#define JUMBLE_SIZE 1024 + /* GUC parameters */ -extern int compute_query_id; +extern PGDLLIMPORT int compute_query_id; extern const char *CleanQuerytext(const char *query, int *location, int *len); -extern JumbleState *JumbleQuery(Query *query, const char *querytext); -extern JumbleState *JumbleQueryDirect(Query *query, const char *querytext); +extern LocationLen *ComputeConstantLengths(const JumbleState *jstate, + const char *query, + int query_loc); +extern JumbleState *JumbleQuery(Query *query); extern void EnableQueryId(void); -extern bool query_id_enabled; +extern PGDLLIMPORT bool query_id_enabled; /* * Returns whether query identifier computation has been enabled, either diff --git a/src/include/nodes/tidbitmap.h b/src/include/nodes/tidbitmap.h index 7e4db94d0e6..9b6c1876f02 100644 --- a/src/include/nodes/tidbitmap.h +++ b/src/include/nodes/tidbitmap.h @@ -97,13 +97,15 @@ typedef enum StreamType * lossy storage for any page in the chunk's range, since the same * hashtable entry has to serve both purposes. */ +#define PagetableEntryWordNumber Max(WORDS_PER_PAGE, WORDS_PER_CHUNK) + typedef struct PagetableEntry { BlockNumber blockno; /* page number (hashtable key) */ char status; /* hash entry status */ bool ischunk; /* T = lossy storage, F = exact */ bool recheck; /* should the tuples be rechecked? */ - tbm_bitmapword words[Max(WORDS_PER_PAGE, WORDS_PER_CHUNK)]; + tbm_bitmapword words[PagetableEntryWordNumber]; } PagetableEntry; /* diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index c7478e9ac78..63c4776d4a6 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -15,8 +15,8 @@ #define ANALYZE_H #include "nodes/params.h" +#include "nodes/queryjumble.h" #include "parser/parse_node.h" -#include "utils/queryjumble.h" /* GUC parameter */ extern PGDLLIMPORT bool enableLockOptimization; diff --git a/src/include/utils/queryenvironment.h b/src/include/utils/queryenvironment.h index a25efe883c7..5c1d363271a 100644 --- a/src/include/utils/queryenvironment.h +++ b/src/include/utils/queryenvironment.h @@ -58,6 +58,8 @@ typedef EphemeralNamedRelationData *EphemeralNamedRelation; typedef struct EphemeralNamedRelationInfo { + pg_node_attr(no_copy_equal) + NodeTag type; char *name; /* name used to identify the relation */ Oid reliddesc; /* oid of relation to get tupdesc */ diff --git a/src/test/regress/expected/expressions.out b/src/test/regress/expected/expressions.out index 2bb3fbf11c1..667c54833bb 100644 --- a/src/test/regress/expected/expressions.out +++ b/src/test/regress/expected/expressions.out @@ -509,14 +509,12 @@ select * from inttest where a in (1::myint,2::myint,3::myint,4::myint,5::myint,6 select * from inttest where a not in (1::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); a --- - -(1 row) +(0 rows) select * from inttest where a not in (0::myint,2::myint,3::myint,4::myint,5::myint,6::myint,7::myint,8::myint,9::myint, null); a --- - -(1 row) +(0 rows) -- ensure the result matched with the non-hashed version. We simply remove -- some array elements so that we don't reach the hashing threshold. diff --git a/src/test/regress/expected/partition_append.out b/src/test/regress/expected/partition_append.out index 9154c7d5a6b..134dbe685b0 100755 --- a/src/test/regress/expected/partition_append.out +++ b/src/test/regress/expected/partition_append.out @@ -2447,17 +2447,17 @@ select relid::regclass, level from gp_partition_template where relid = 'rank_set alter table rank_settemp set subpartition template (default subpartition def2); -- def2 is there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (default subpartition def2); -- Should still be there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); @@ -2465,9 +2465,9 @@ alter table rank_settemp add partition f1 values ('N'); alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); alter table rank_settemp add partition f2 values ('C'); select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1} :partEnd <> :partEvery <>} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1 :location 52} :partEnd <> :partEvery <> :location 52} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) drop table rank_settemp; @@ -3603,11 +3603,11 @@ alter table mpp5992 set subpartition template (subpartition l1 values (1,2,3), subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- Now we can add a new partition @@ -3857,11 +3857,11 @@ select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relnam (112 rows) select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- MPP-10223: split subpartitions @@ -4061,9 +4061,9 @@ subpartition template (start (1) end (10) every (1)) NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' as the Apache Cloudberry data distribution key for this table. HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; - relid | level | template -----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2} :partEvery ({A_CONST :val 1 :location 141})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1 :location 115} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2 :location 125} :partEvery ({A_CONST :val 1 :location 141}) :location 115} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 115}) :encClauses <> :isTemplate true :fromCatalog false :location 114} (1 row) -- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 658b8fcbf24..8eb4294d264 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -829,7 +829,7 @@ SELECT table_name, view_definition FROM information_schema.views table_name | view_definition ------------+--------------------------------------------------------------------------------------------------------------------------------------- xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; - xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text NO INDENT) AS "xmlserialize"; + xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text INDENT) AS "xmlserialize"; xmlview11 | SELECT (XMLSERIALIZE(DOCUMENT '42'::xml AS character varying NO INDENT))::character varying AS "xmlserialize"; xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; diff --git a/src/test/singlenode_regress/expected/partition.out b/src/test/singlenode_regress/expected/partition.out index c510a220c2f..dc98c658805 100755 --- a/src/test/singlenode_regress/expected/partition.out +++ b/src/test/singlenode_regress/expected/partition.out @@ -2203,17 +2203,17 @@ select relid::regclass, level from gp_partition_template where relid = 'rank_set alter table rank_settemp set subpartition template (default subpartition def2); -- def2 is there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (default subpartition def2); -- Should still be there select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName def2 :boundSpec <> :subSpec <> :isDefault true :options <> :accessMethod <> :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) alter table rank_settemp set subpartition template (start (date '2006-01-01') with (appendonly=true)); @@ -2221,9 +2221,9 @@ alter table rank_settemp add partition f1 values ('N'); alter table rank_settemp set subpartition template (start (date '2007-01-01') with (appendonly=true, compresslevel=5)); alter table rank_settemp add partition f2 values ('C'); select relid::regclass, level, template from gp_partition_template where relid = 'rank_settemp'::regclass; - relid | level | template ---------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1} :partEnd <> :partEvery <>} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +--------------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + rank_settemp | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({TYPECAST :arg {A_CONST :val "\2007-01-01" :location 64} :typeName {TYPENAME :names ("date") :typeOid 0 :setof false :pct_type false :typmods <> :typemod -1 :arrayBounds <> :location 59} :location -1}) :edge 1 :location 52} :partEnd <> :partEvery <> :location 52} :subSpec <> :isDefault false :options ({DEFELEM :defnamespace <> :defname compresslevel :arg 5 :defaction 0 :location 101}) :accessMethod ao_row :tablespacename <> :colencs <> :location 52}) :encClauses <> :isTemplate true :fromCatalog false :location 51} (1 row) drop table rank_settemp; @@ -3297,11 +3297,11 @@ alter table mpp5992 set subpartition template (subpartition l1 values (1,2,3), subpartition l2 values (4,5,6), subpartition l3 values (7,8,9,10)); select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- Now we can add a new partition @@ -3551,11 +3551,11 @@ select relname, relam, pg_get_expr(relpartbound, oid) from pg_class where relnam (112 rows) select relid::regclass, level, template from gp_partition_template where relid = 'mpp5992'::regclass; - relid | level | template ----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} - mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143}))} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +---------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + mpp5992 | 3 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName lll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "M" :location 133})) :location 125} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 107} {GPPARTDEFELEM :partName lll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "F" :location 165})) :location 157} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 139}) :encClauses <> :isTemplate true :fromCatalog false :location 105} + mpp5992 | 2 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName ll1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "Engineering" :location 108})) :location 100} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 83} {GPPARTDEFELEM :partName ll2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val "QA" :location 149})) :location 141} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 124}) :encClauses <> :isTemplate true :fromCatalog false :location 81} + mpp5992 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName l1 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 1 :location 72}) ({A_CONST :val 2 :location 74}) ({A_CONST :val 3 :location 76})) :location 64} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 48} {GPPARTDEFELEM :partName l2 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 4 :location 105}) ({A_CONST :val 5 :location 107}) ({A_CONST :val 6 :location 109})) :location 97} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 81} {GPPARTDEFELEM :partName l3 :boundSpec {GPPARTITIONLISTSPEC :partValues (({A_CONST :val 7 :location 137}) ({A_CONST :val 8 :location 139}) ({A_CONST :val 9 :location 141}) ({A_CONST :val 10 :location 143})) :location 129} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 113}) :encClauses <> :isTemplate true :fromCatalog false :location 47} (3 rows) -- MPP-10223: split subpartitions @@ -3749,9 +3749,9 @@ subpartition by range(d) subpartition template (start (1) end (10) every (1)) (start (20) end (30) every (1)); select relid::regclass, level, template from gp_partition_template where relid = 'MPP10480'::regclass; - relid | level | template -----------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2} :partEvery ({A_CONST :val 1 :location 141})} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <>}) :encClauses <> :isTemplate true} + relid | level | template +----------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + mpp10480 | 1 | {GPPARTITIONDEFINITION :partDefElems ({GPPARTDEFELEM :partName <> :boundSpec {GPPARTITIONRANGESPEC :partStart {GPPARTITIONRANGEITEM :val ({A_CONST :val 1 :location 122}) :edge 1 :location 115} :partEnd {GPPARTITIONRANGEITEM :val ({A_CONST :val 10 :location 130}) :edge 2 :location 125} :partEvery ({A_CONST :val 1 :location 141}) :location 115} :subSpec <> :isDefault false :options <> :accessMethod <> :tablespacename <> :colencs <> :location 115}) :encClauses <> :isTemplate true :fromCatalog false :location 114} (1 row) -- MPP-10421: fix SPLIT of partitions with PRIMARY KEY constraint/indexes