pg_query 2.1.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +104 -0
- data/README.md +59 -31
- data/Rakefile +2 -2
- data/ext/pg_query/extconf.rb +8 -2
- data/ext/pg_query/include/access/amapi.h +45 -1
- data/ext/pg_query/include/access/attmap.h +1 -1
- data/ext/pg_query/include/access/attnum.h +2 -2
- data/ext/pg_query/include/access/clog.h +4 -2
- data/ext/pg_query/include/access/commit_ts.h +6 -9
- data/ext/pg_query/include/access/detoast.h +1 -11
- data/ext/pg_query/include/access/genam.h +15 -12
- data/ext/pg_query/include/access/gin.h +2 -2
- data/ext/pg_query/include/access/htup.h +1 -1
- data/ext/pg_query/include/access/htup_details.h +75 -87
- data/ext/pg_query/include/access/itup.h +7 -1
- data/ext/pg_query/include/access/parallel.h +2 -2
- data/ext/pg_query/include/access/printtup.h +1 -1
- data/ext/pg_query/include/access/relation.h +1 -1
- data/ext/pg_query/include/access/relscan.h +17 -2
- data/ext/pg_query/include/access/rmgr.h +30 -3
- data/ext/pg_query/include/access/rmgrlist.h +23 -23
- data/ext/pg_query/include/access/sdir.h +1 -1
- data/ext/pg_query/include/access/skey.h +1 -1
- data/ext/pg_query/include/access/stratnum.h +4 -2
- data/ext/pg_query/include/access/sysattr.h +1 -1
- data/ext/pg_query/include/access/table.h +2 -1
- data/ext/pg_query/include/access/tableam.h +272 -20
- data/ext/pg_query/include/access/toast_compression.h +73 -0
- data/ext/pg_query/include/access/transam.h +123 -13
- data/ext/pg_query/include/access/tupconvert.h +1 -1
- data/ext/pg_query/include/access/tupdesc.h +1 -1
- data/ext/pg_query/include/access/tupmacs.h +3 -3
- data/ext/pg_query/include/access/twophase.h +5 -1
- data/ext/pg_query/include/access/xact.h +79 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +50 -14
- data/ext/pg_query/include/access/xlogdefs.h +8 -16
- data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/access/xlogreader.h +148 -32
- data/ext/pg_query/include/access/xlogrecord.h +18 -9
- data/ext/pg_query/include/access/xlogrecovery.h +157 -0
- data/ext/pg_query/include/c.h +101 -44
- data/ext/pg_query/include/catalog/catalog.h +3 -1
- data/ext/pg_query/include/catalog/catversion.h +2 -2
- data/ext/pg_query/include/catalog/dependency.h +10 -16
- data/ext/pg_query/include/catalog/genbki.h +83 -5
- data/ext/pg_query/include/catalog/index.h +18 -3
- data/ext/pg_query/include/catalog/indexing.h +12 -324
- data/ext/pg_query/include/catalog/namespace.h +4 -2
- data/ext/pg_query/include/catalog/objectaccess.h +70 -2
- data/ext/pg_query/include/catalog/objectaddress.h +11 -6
- data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_am.h +4 -1
- data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
- data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
- data/ext/pg_query/include/catalog/pg_authid.h +7 -2
- data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
- data/ext/pg_query/include/catalog/pg_class.h +45 -15
- data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
- data/ext/pg_query/include/catalog/pg_collation.h +33 -8
- data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
- data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
- data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/catalog/pg_control.h +5 -5
- data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
- data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_depend.h +11 -7
- data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_index.h +17 -7
- data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
- data/ext/pg_query/include/catalog/pg_language.h +10 -5
- data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
- data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
- data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_operator.h +21 -16
- data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
- data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_proc.h +20 -11
- data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
- data/ext/pg_query/include/catalog/pg_publication.h +50 -4
- data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
- data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/catalog/pg_transform.h +8 -5
- data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
- data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_type.h +56 -24
- data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
- data/ext/pg_query/include/catalog/storage.h +5 -3
- data/ext/pg_query/include/commands/async.h +4 -5
- data/ext/pg_query/include/commands/dbcommands.h +2 -1
- data/ext/pg_query/include/commands/defrem.h +11 -24
- data/ext/pg_query/include/commands/event_trigger.h +2 -2
- data/ext/pg_query/include/commands/explain.h +1 -1
- data/ext/pg_query/include/commands/prepare.h +1 -1
- data/ext/pg_query/include/commands/tablespace.h +3 -1
- data/ext/pg_query/include/commands/trigger.h +27 -17
- data/ext/pg_query/include/commands/user.h +2 -2
- data/ext/pg_query/include/commands/vacuum.h +88 -41
- data/ext/pg_query/include/commands/variable.h +1 -1
- data/ext/pg_query/include/common/file_perm.h +4 -4
- data/ext/pg_query/include/common/hashfn.h +1 -1
- data/ext/pg_query/include/common/ip.h +1 -7
- data/ext/pg_query/include/common/keywords.h +2 -6
- data/ext/pg_query/include/common/kwlookup.h +1 -1
- data/ext/pg_query/include/common/pg_prng.h +60 -0
- data/ext/pg_query/include/common/relpath.h +2 -2
- data/ext/pg_query/include/common/string.h +24 -1
- data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
- data/ext/pg_query/include/datatype/timestamp.h +40 -1
- data/ext/pg_query/include/executor/execdesc.h +1 -1
- data/ext/pg_query/include/executor/executor.h +65 -22
- data/ext/pg_query/include/executor/functions.h +17 -3
- data/ext/pg_query/include/executor/instrument.h +33 -16
- data/ext/pg_query/include/executor/spi.h +41 -3
- data/ext/pg_query/include/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/executor/tuptable.h +1 -1
- data/ext/pg_query/include/fmgr.h +13 -7
- data/ext/pg_query/include/funcapi.h +16 -4
- data/ext/pg_query/include/getaddrinfo.h +1 -1
- data/ext/pg_query/include/jit/jit.h +11 -11
- data/ext/pg_query/include/kwlist_d.h +517 -494
- data/ext/pg_query/include/lib/dshash.h +112 -0
- data/ext/pg_query/include/lib/ilist.h +20 -1
- data/ext/pg_query/include/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/lib/simplehash.h +150 -25
- data/ext/pg_query/include/lib/sort_template.h +432 -0
- data/ext/pg_query/include/lib/stringinfo.h +1 -1
- data/ext/pg_query/include/libpq/auth.h +6 -4
- data/ext/pg_query/include/libpq/crypt.h +5 -4
- data/ext/pg_query/include/libpq/hba.h +43 -4
- data/ext/pg_query/include/libpq/libpq-be.h +23 -6
- data/ext/pg_query/include/libpq/libpq.h +31 -20
- data/ext/pg_query/include/libpq/pqcomm.h +17 -31
- data/ext/pg_query/include/libpq/pqformat.h +1 -1
- data/ext/pg_query/include/libpq/pqsignal.h +4 -4
- data/ext/pg_query/include/mb/pg_wchar.h +106 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +71 -52
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +272 -80
- data/ext/pg_query/include/nodes/extensible.h +4 -2
- data/ext/pg_query/include/nodes/lockoptions.h +1 -1
- data/ext/pg_query/include/nodes/makefuncs.h +7 -6
- data/ext/pg_query/include/nodes/memnodes.h +5 -3
- data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/nodes/nodes.h +30 -11
- data/ext/pg_query/include/nodes/params.h +1 -1
- data/ext/pg_query/include/nodes/parsenodes.h +327 -94
- data/ext/pg_query/include/nodes/pathnodes.h +245 -67
- data/ext/pg_query/include/nodes/pg_list.h +75 -68
- data/ext/pg_query/include/nodes/plannodes.h +128 -30
- data/ext/pg_query/include/nodes/primnodes.h +99 -47
- data/ext/pg_query/include/nodes/print.h +1 -1
- data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/nodes/value.h +58 -39
- data/ext/pg_query/include/optimizer/cost.h +9 -2
- data/ext/pg_query/include/optimizer/geqo.h +9 -7
- data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/optimizer/optimizer.h +25 -22
- data/ext/pg_query/include/optimizer/paths.h +6 -6
- data/ext/pg_query/include/optimizer/planmain.h +15 -14
- data/ext/pg_query/include/parser/analyze.h +19 -5
- data/ext/pg_query/include/parser/gram.h +947 -913
- data/ext/pg_query/include/parser/gramparse.h +1 -1
- data/ext/pg_query/include/parser/kwlist.h +463 -453
- data/ext/pg_query/include/parser/parse_agg.h +2 -7
- data/ext/pg_query/include/parser/parse_coerce.h +4 -1
- data/ext/pg_query/include/parser/parse_expr.h +2 -3
- data/ext/pg_query/include/parser/parse_func.h +2 -1
- data/ext/pg_query/include/parser/parse_node.h +21 -9
- data/ext/pg_query/include/parser/parse_oper.h +1 -3
- data/ext/pg_query/include/parser/parse_relation.h +5 -4
- data/ext/pg_query/include/parser/parse_type.h +1 -1
- data/ext/pg_query/include/parser/parser.h +31 -4
- data/ext/pg_query/include/parser/parsetree.h +1 -1
- data/ext/pg_query/include/parser/scanner.h +1 -1
- data/ext/pg_query/include/parser/scansup.h +2 -5
- data/ext/pg_query/include/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/pg_config.h +94 -46
- data/ext/pg_query/include/pg_config_manual.h +74 -21
- data/ext/pg_query/include/pg_getopt.h +6 -6
- data/ext/pg_query/include/pg_query.h +5 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1237
- data/ext/pg_query/include/pgtime.h +14 -4
- data/ext/pg_query/include/pl_gram.h +126 -128
- data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/include/plerrcodes.h +9 -1
- data/ext/pg_query/include/plpgsql.h +52 -54
- data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
- data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
- data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
- data/ext/pg_query/include/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
- data/ext/pg_query/include/port/atomics/generic.h +1 -1
- data/ext/pg_query/include/port/atomics.h +1 -1
- data/ext/pg_query/include/port/pg_bitutils.h +88 -12
- data/ext/pg_query/include/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/port/pg_crc32c.h +1 -1
- data/ext/pg_query/include/port.h +72 -43
- data/ext/pg_query/include/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres.h +60 -16
- data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
- data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
- data/ext/pg_query/include/postmaster/bgworker.h +2 -1
- data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
- data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
- data/ext/pg_query/include/postmaster/fork_process.h +1 -1
- data/ext/pg_query/include/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postmaster/pgarch.h +42 -8
- data/ext/pg_query/include/postmaster/postmaster.h +18 -17
- data/ext/pg_query/include/postmaster/startup.h +39 -0
- data/ext/pg_query/include/postmaster/syslogger.h +15 -10
- data/ext/pg_query/include/postmaster/walwriter.h +3 -3
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
- data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
- data/ext/pg_query/include/regex/regex.h +18 -16
- data/ext/pg_query/include/replication/logicallauncher.h +3 -5
- data/ext/pg_query/include/replication/logicalproto.h +161 -17
- data/ext/pg_query/include/replication/logicalworker.h +1 -1
- data/ext/pg_query/include/replication/origin.h +7 -7
- data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
- data/ext/pg_query/include/replication/slot.h +23 -12
- data/ext/pg_query/include/replication/syncrep.h +5 -5
- data/ext/pg_query/include/replication/walreceiver.h +145 -13
- data/ext/pg_query/include/replication/walsender.h +8 -8
- data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
- data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/storage/backendid.h +3 -3
- data/ext/pg_query/include/storage/block.h +4 -10
- data/ext/pg_query/include/storage/buf.h +1 -1
- data/ext/pg_query/include/storage/bufmgr.h +19 -14
- data/ext/pg_query/include/storage/bufpage.h +6 -8
- data/ext/pg_query/include/storage/condition_variable.h +13 -2
- data/ext/pg_query/include/storage/dsm.h +4 -1
- data/ext/pg_query/include/storage/dsm_impl.h +3 -2
- data/ext/pg_query/include/storage/fd.h +33 -3
- data/ext/pg_query/include/storage/fileset.h +40 -0
- data/ext/pg_query/include/storage/ipc.h +4 -1
- data/ext/pg_query/include/storage/item.h +1 -1
- data/ext/pg_query/include/storage/itemid.h +1 -1
- data/ext/pg_query/include/storage/itemptr.h +3 -1
- data/ext/pg_query/include/storage/large_object.h +2 -2
- data/ext/pg_query/include/storage/latch.h +9 -13
- data/ext/pg_query/include/storage/lmgr.h +2 -1
- data/ext/pg_query/include/storage/lock.h +17 -13
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +6 -32
- data/ext/pg_query/include/storage/lwlocknames.h +0 -1
- data/ext/pg_query/include/storage/off.h +1 -1
- data/ext/pg_query/include/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/storage/pg_shmem.h +9 -7
- data/ext/pg_query/include/storage/pmsignal.h +15 -4
- data/ext/pg_query/include/storage/predicate.h +4 -4
- data/ext/pg_query/include/storage/proc.h +183 -55
- data/ext/pg_query/include/storage/procarray.h +98 -0
- data/ext/pg_query/include/storage/proclist_types.h +1 -1
- data/ext/pg_query/include/storage/procsignal.h +3 -7
- data/ext/pg_query/include/storage/relfilenode.h +1 -1
- data/ext/pg_query/include/storage/s_lock.h +67 -4
- data/ext/pg_query/include/storage/sharedfileset.h +3 -11
- data/ext/pg_query/include/storage/shm_mq.h +5 -4
- data/ext/pg_query/include/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/storage/shmem.h +1 -1
- data/ext/pg_query/include/storage/sinval.h +3 -3
- data/ext/pg_query/include/storage/sinvaladt.h +1 -1
- data/ext/pg_query/include/storage/smgr.h +10 -8
- data/ext/pg_query/include/storage/spin.h +2 -2
- data/ext/pg_query/include/storage/standby.h +13 -6
- data/ext/pg_query/include/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/storage/sync.h +7 -3
- data/ext/pg_query/include/tcop/cmdtag.h +1 -1
- data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
- data/ext/pg_query/include/tcop/dest.h +1 -1
- data/ext/pg_query/include/tcop/fastpath.h +1 -2
- data/ext/pg_query/include/tcop/pquery.h +7 -1
- data/ext/pg_query/include/tcop/tcopprot.h +19 -11
- data/ext/pg_query/include/tcop/utility.h +7 -3
- data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
- data/ext/pg_query/include/utils/acl.h +24 -3
- data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/utils/array.h +7 -2
- data/ext/pg_query/include/utils/backend_progress.h +44 -0
- data/ext/pg_query/include/utils/backend_status.h +321 -0
- data/ext/pg_query/include/utils/builtins.h +11 -11
- data/ext/pg_query/include/utils/bytea.h +3 -2
- data/ext/pg_query/include/utils/catcache.h +1 -1
- data/ext/pg_query/include/utils/date.h +1 -1
- data/ext/pg_query/include/utils/datetime.h +8 -7
- data/ext/pg_query/include/utils/datum.h +9 -1
- data/ext/pg_query/include/utils/dsa.h +1 -1
- data/ext/pg_query/include/utils/dynahash.h +4 -3
- data/ext/pg_query/include/utils/elog.h +52 -21
- data/ext/pg_query/include/utils/errcodes.h +2 -0
- data/ext/pg_query/include/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/utils/float.h +7 -7
- data/ext/pg_query/include/utils/fmgroids.h +1300 -696
- data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
- data/ext/pg_query/include/utils/fmgrtab.h +6 -5
- data/ext/pg_query/include/utils/guc.h +69 -43
- data/ext/pg_query/include/utils/guc_tables.h +23 -19
- data/ext/pg_query/include/utils/hsearch.h +15 -11
- data/ext/pg_query/include/utils/inval.h +5 -1
- data/ext/pg_query/include/utils/lsyscache.h +11 -1
- data/ext/pg_query/include/utils/memdebug.h +1 -1
- data/ext/pg_query/include/utils/memutils.h +8 -3
- data/ext/pg_query/include/utils/numeric.h +19 -5
- data/ext/pg_query/include/utils/palloc.h +25 -3
- data/ext/pg_query/include/utils/partcache.h +1 -1
- data/ext/pg_query/include/utils/pg_locale.h +17 -9
- data/ext/pg_query/include/utils/pg_lsn.h +1 -1
- data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
- data/ext/pg_query/include/utils/pidfile.h +1 -1
- data/ext/pg_query/include/utils/plancache.h +6 -5
- data/ext/pg_query/include/utils/portal.h +12 -1
- data/ext/pg_query/include/utils/ps_status.h +1 -1
- data/ext/pg_query/include/utils/queryenvironment.h +1 -1
- data/ext/pg_query/include/utils/queryjumble.h +88 -0
- data/ext/pg_query/include/utils/regproc.h +14 -3
- data/ext/pg_query/include/utils/rel.h +71 -20
- data/ext/pg_query/include/utils/relcache.h +9 -7
- data/ext/pg_query/include/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/utils/resowner.h +1 -1
- data/ext/pg_query/include/utils/rls.h +2 -2
- data/ext/pg_query/include/utils/ruleutils.h +4 -1
- data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/utils/snapmgr.h +35 -14
- data/ext/pg_query/include/utils/snapshot.h +14 -1
- data/ext/pg_query/include/utils/sortsupport.h +117 -2
- data/ext/pg_query/include/utils/syscache.h +6 -1
- data/ext/pg_query/include/utils/timeout.h +11 -4
- data/ext/pg_query/include/utils/timestamp.h +6 -5
- data/ext/pg_query/include/utils/tuplesort.h +25 -11
- data/ext/pg_query/include/utils/tuplestore.h +2 -2
- data/ext/pg_query/include/utils/typcache.h +24 -17
- data/ext/pg_query/include/utils/tzparser.h +1 -1
- data/ext/pg_query/include/utils/varlena.h +5 -3
- data/ext/pg_query/include/utils/wait_event.h +289 -0
- data/ext/pg_query/include/utils/xml.h +4 -4
- data/ext/pg_query/pg_query.pb-c.c +4318 -2307
- data/ext/pg_query/pg_query_deparse.c +1114 -381
- data/ext/pg_query/pg_query_fingerprint.c +46 -10
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
- data/ext/pg_query/pg_query_normalize.c +163 -20
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
- data/ext/pg_query/pg_query_parse.c +1 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
- data/ext/pg_query/pg_query_ruby.c +1 -1
- data/ext/pg_query/pg_query_scan.c +2 -1
- data/ext/pg_query/pg_query_split.c +3 -2
- data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
- data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
- data/ext/pg_query/src_backend_commands_define.c +11 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +86 -11
- data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +644 -441
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
- data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
- data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
- data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
- data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
- data/ext/pg_query/src_common_encnames.c +1 -1
- data/ext/pg_query/src_common_hashfn.c +3 -3
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +517 -494
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_pg_prng.c +152 -0
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_string.c +7 -1
- data/ext/pg_query/src_common_stringinfo.c +1 -1
- data/ext/pg_query/src_common_wchar.c +712 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/src_port_pg_bitutils.c +41 -52
- data/ext/pg_query/src_port_pgsleep.c +1 -1
- data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +46 -20
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +6 -4
- data/lib/pg_query/fingerprint.rb +18 -3
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +87 -51
- data/lib/pg_query/pg_query_pb.rb +1109 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- metadata +29 -18
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_random.c +0 -31
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* definitions for executor state nodes
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/nodes/execnodes.h
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#include "access/tupconvert.h"
|
|
18
18
|
#include "executor/instrument.h"
|
|
19
19
|
#include "fmgr.h"
|
|
20
|
+
#include "lib/ilist.h"
|
|
20
21
|
#include "lib/pairingheap.h"
|
|
21
22
|
#include "nodes/params.h"
|
|
22
23
|
#include "nodes/plannodes.h"
|
|
@@ -33,7 +34,6 @@
|
|
|
33
34
|
#include "utils/tuplestore.h"
|
|
34
35
|
|
|
35
36
|
struct PlanState; /* forward references in this file */
|
|
36
|
-
struct PartitionRoutingInfo;
|
|
37
37
|
struct ParallelHashJoinState;
|
|
38
38
|
struct ExecRowMark;
|
|
39
39
|
struct ExprState;
|
|
@@ -41,6 +41,7 @@ struct ExprContext;
|
|
|
41
41
|
struct RangeTblEntry; /* avoid including parsenodes.h here */
|
|
42
42
|
struct ExprEvalStep; /* avoid including execExpr.h everywhere */
|
|
43
43
|
struct CopyMultiInsertBuffer;
|
|
44
|
+
struct LogicalTapeSet;
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
/* ----------------
|
|
@@ -60,7 +61,7 @@ typedef Datum (*ExprStateEvalFunc) (struct ExprState *expression,
|
|
|
60
61
|
|
|
61
62
|
typedef struct ExprState
|
|
62
63
|
{
|
|
63
|
-
NodeTag
|
|
64
|
+
NodeTag type;
|
|
64
65
|
|
|
65
66
|
uint8 flags; /* bitmask of EEO_FLAG_* bits, see above */
|
|
66
67
|
|
|
@@ -141,6 +142,8 @@ typedef struct ExprState
|
|
|
141
142
|
* Unique is it a unique index?
|
|
142
143
|
* OpclassOptions opclass-specific options, or NULL if none
|
|
143
144
|
* ReadyForInserts is it valid for inserts?
|
|
145
|
+
* CheckedUnchanged IndexUnchanged status determined yet?
|
|
146
|
+
* IndexUnchanged aminsert hint, cached for retail inserts
|
|
144
147
|
* Concurrent are we doing a concurrent index build?
|
|
145
148
|
* BrokenHotChain did we detect any broken HOT chains?
|
|
146
149
|
* ParallelWorkers # of workers requested (excludes leader)
|
|
@@ -170,7 +173,10 @@ typedef struct IndexInfo
|
|
|
170
173
|
uint16 *ii_UniqueStrats; /* array with one entry per column */
|
|
171
174
|
Datum *ii_OpclassOptions; /* array with one entry per column */
|
|
172
175
|
bool ii_Unique;
|
|
176
|
+
bool ii_NullsNotDistinct;
|
|
173
177
|
bool ii_ReadyForInserts;
|
|
178
|
+
bool ii_CheckedUnchanged;
|
|
179
|
+
bool ii_IndexUnchanged;
|
|
174
180
|
bool ii_Concurrent;
|
|
175
181
|
bool ii_BrokenHotChain;
|
|
176
182
|
int ii_ParallelWorkers;
|
|
@@ -357,10 +363,6 @@ typedef struct ProjectionInfo
|
|
|
357
363
|
* attribute numbers of the "original" tuple and the
|
|
358
364
|
* attribute numbers of the "clean" tuple.
|
|
359
365
|
* resultSlot: tuple slot used to hold cleaned tuple.
|
|
360
|
-
* junkAttNo: not used by junkfilter code. Can be used by caller
|
|
361
|
-
* to remember the attno of a specific junk attribute
|
|
362
|
-
* (nodeModifyTable.c keeps the "ctid" or "wholerow"
|
|
363
|
-
* attno here).
|
|
364
366
|
* ----------------
|
|
365
367
|
*/
|
|
366
368
|
typedef struct JunkFilter
|
|
@@ -370,7 +372,6 @@ typedef struct JunkFilter
|
|
|
370
372
|
TupleDesc jf_cleanTupType;
|
|
371
373
|
AttrNumber *jf_cleanMap;
|
|
372
374
|
TupleTableSlot *jf_resultSlot;
|
|
373
|
-
AttrNumber jf_junkAttNo;
|
|
374
375
|
} JunkFilter;
|
|
375
376
|
|
|
376
377
|
/*
|
|
@@ -388,6 +389,22 @@ typedef struct OnConflictSetState
|
|
|
388
389
|
ExprState *oc_WhereClause; /* state for the WHERE clause */
|
|
389
390
|
} OnConflictSetState;
|
|
390
391
|
|
|
392
|
+
/* ----------------
|
|
393
|
+
* MergeActionState information
|
|
394
|
+
*
|
|
395
|
+
* Executor state for a MERGE action.
|
|
396
|
+
* ----------------
|
|
397
|
+
*/
|
|
398
|
+
typedef struct MergeActionState
|
|
399
|
+
{
|
|
400
|
+
NodeTag type;
|
|
401
|
+
|
|
402
|
+
MergeAction *mas_action; /* associated MergeAction node */
|
|
403
|
+
ProjectionInfo *mas_proj; /* projection of the action's targetlist for
|
|
404
|
+
* this rel */
|
|
405
|
+
ExprState *mas_whenqual; /* WHEN [NOT] MATCHED AND conditions */
|
|
406
|
+
} MergeActionState;
|
|
407
|
+
|
|
391
408
|
/*
|
|
392
409
|
* ResultRelInfo
|
|
393
410
|
*
|
|
@@ -424,6 +441,21 @@ typedef struct ResultRelInfo
|
|
|
424
441
|
/* array of key/attr info for indices */
|
|
425
442
|
IndexInfo **ri_IndexRelationInfo;
|
|
426
443
|
|
|
444
|
+
/*
|
|
445
|
+
* For UPDATE/DELETE result relations, the attribute number of the row
|
|
446
|
+
* identity junk attribute in the source plan's output tuples
|
|
447
|
+
*/
|
|
448
|
+
AttrNumber ri_RowIdAttNo;
|
|
449
|
+
|
|
450
|
+
/* Projection to generate new tuple in an INSERT/UPDATE */
|
|
451
|
+
ProjectionInfo *ri_projectNew;
|
|
452
|
+
/* Slot to hold that tuple */
|
|
453
|
+
TupleTableSlot *ri_newTupleSlot;
|
|
454
|
+
/* Slot to hold the old tuple being updated */
|
|
455
|
+
TupleTableSlot *ri_oldTupleSlot;
|
|
456
|
+
/* Have the projection and the slots above been initialized? */
|
|
457
|
+
bool ri_projectNewInfoValid;
|
|
458
|
+
|
|
427
459
|
/* triggers to be fired, if any */
|
|
428
460
|
TriggerDesc *ri_TrigDesc;
|
|
429
461
|
|
|
@@ -450,6 +482,13 @@ typedef struct ResultRelInfo
|
|
|
450
482
|
/* true when modifying foreign table directly */
|
|
451
483
|
bool ri_usesFdwDirectModify;
|
|
452
484
|
|
|
485
|
+
/* batch insert stuff */
|
|
486
|
+
int ri_NumSlots; /* number of slots in the array */
|
|
487
|
+
int ri_NumSlotsInitialized; /* number of initialized slots */
|
|
488
|
+
int ri_BatchSize; /* max slots inserted in a single batch */
|
|
489
|
+
TupleTableSlot **ri_Slots; /* input tuples for batch insert */
|
|
490
|
+
TupleTableSlot **ri_PlanSlots;
|
|
491
|
+
|
|
453
492
|
/* list of WithCheckOption's to be checked */
|
|
454
493
|
List *ri_WithCheckOptions;
|
|
455
494
|
|
|
@@ -465,9 +504,6 @@ typedef struct ResultRelInfo
|
|
|
465
504
|
/* number of stored generated columns we need to compute */
|
|
466
505
|
int ri_NumGeneratedNeeded;
|
|
467
506
|
|
|
468
|
-
/* for removing junk attributes from tuples */
|
|
469
|
-
JunkFilter *ri_junkFilter;
|
|
470
|
-
|
|
471
507
|
/* list of RETURNING expressions */
|
|
472
508
|
List *ri_returningList;
|
|
473
509
|
|
|
@@ -480,31 +516,69 @@ typedef struct ResultRelInfo
|
|
|
480
516
|
/* ON CONFLICT evaluation state */
|
|
481
517
|
OnConflictSetState *ri_onConflict;
|
|
482
518
|
|
|
483
|
-
/*
|
|
484
|
-
List *
|
|
519
|
+
/* for MERGE, lists of MergeActionState */
|
|
520
|
+
List *ri_matchedMergeAction;
|
|
521
|
+
List *ri_notMatchedMergeAction;
|
|
485
522
|
|
|
486
|
-
/* partition check expression state */
|
|
523
|
+
/* partition check expression state (NULL if not set up yet) */
|
|
487
524
|
ExprState *ri_PartitionCheckExpr;
|
|
488
525
|
|
|
489
526
|
/*
|
|
527
|
+
* Information needed by tuple routing target relations
|
|
528
|
+
*
|
|
490
529
|
* RootResultRelInfo gives the target relation mentioned in the query, if
|
|
491
530
|
* it's a partitioned table. It is not set if the target relation
|
|
492
531
|
* mentioned in the query is an inherited table, nor when tuple routing is
|
|
493
532
|
* not needed.
|
|
533
|
+
*
|
|
534
|
+
* RootToPartitionMap and PartitionTupleSlot, initialized by
|
|
535
|
+
* ExecInitRoutingInfo, are non-NULL if partition has a different tuple
|
|
536
|
+
* format than the root table.
|
|
494
537
|
*/
|
|
495
538
|
struct ResultRelInfo *ri_RootResultRelInfo;
|
|
539
|
+
TupleConversionMap *ri_RootToPartitionMap;
|
|
540
|
+
TupleTableSlot *ri_PartitionTupleSlot;
|
|
496
541
|
|
|
497
|
-
/*
|
|
498
|
-
|
|
542
|
+
/*
|
|
543
|
+
* Map to convert child result relation tuples to the format of the table
|
|
544
|
+
* actually mentioned in the query (called "root"). Computed only if
|
|
545
|
+
* needed. A NULL map value indicates that no conversion is needed, so we
|
|
546
|
+
* must have a separate flag to show if the map has been computed.
|
|
547
|
+
*/
|
|
548
|
+
TupleConversionMap *ri_ChildToRootMap;
|
|
549
|
+
bool ri_ChildToRootMapValid;
|
|
499
550
|
|
|
500
|
-
/*
|
|
551
|
+
/* for use by copyfrom.c when performing multi-inserts */
|
|
501
552
|
struct CopyMultiInsertBuffer *ri_CopyMultiInsertBuffer;
|
|
553
|
+
|
|
554
|
+
/*
|
|
555
|
+
* Used when a leaf partition is involved in a cross-partition update of
|
|
556
|
+
* one of its ancestors; see ExecCrossPartitionUpdateForeignKey().
|
|
557
|
+
*/
|
|
558
|
+
List *ri_ancestorResultRels;
|
|
502
559
|
} ResultRelInfo;
|
|
503
560
|
|
|
561
|
+
/* ----------------
|
|
562
|
+
* AsyncRequest
|
|
563
|
+
*
|
|
564
|
+
* State for an asynchronous tuple request.
|
|
565
|
+
* ----------------
|
|
566
|
+
*/
|
|
567
|
+
typedef struct AsyncRequest
|
|
568
|
+
{
|
|
569
|
+
struct PlanState *requestor; /* Node that wants a tuple */
|
|
570
|
+
struct PlanState *requestee; /* Node from which a tuple is wanted */
|
|
571
|
+
int request_index; /* Scratch space for requestor */
|
|
572
|
+
bool callback_pending; /* Callback is needed */
|
|
573
|
+
bool request_complete; /* Request complete, result valid */
|
|
574
|
+
TupleTableSlot *result; /* Result (NULL or an empty slot if no more
|
|
575
|
+
* tuples) */
|
|
576
|
+
} AsyncRequest;
|
|
577
|
+
|
|
504
578
|
/* ----------------
|
|
505
579
|
* EState information
|
|
506
580
|
*
|
|
507
|
-
*
|
|
581
|
+
* Working state for an Executor invocation
|
|
508
582
|
* ----------------
|
|
509
583
|
*/
|
|
510
584
|
typedef struct EState
|
|
@@ -530,23 +604,18 @@ typedef struct EState
|
|
|
530
604
|
CommandId es_output_cid;
|
|
531
605
|
|
|
532
606
|
/* Info about target table(s) for insert/update/delete queries: */
|
|
533
|
-
ResultRelInfo
|
|
534
|
-
|
|
535
|
-
|
|
607
|
+
ResultRelInfo **es_result_relations; /* Array of per-range-table-entry
|
|
608
|
+
* ResultRelInfo pointers, or NULL
|
|
609
|
+
* if not a target table */
|
|
610
|
+
List *es_opened_result_relations; /* List of non-NULL entries in
|
|
611
|
+
* es_result_relations in no
|
|
612
|
+
* specific order */
|
|
536
613
|
|
|
537
|
-
/*
|
|
538
|
-
* Info about the partition root table(s) for insert/update/delete queries
|
|
539
|
-
* targeting partitioned tables. Only leaf partitions are mentioned in
|
|
540
|
-
* es_result_relations, but we need access to the roots for firing
|
|
541
|
-
* triggers and for runtime tuple routing.
|
|
542
|
-
*/
|
|
543
|
-
ResultRelInfo *es_root_result_relations; /* array of ResultRelInfos */
|
|
544
|
-
int es_num_root_result_relations; /* length of the array */
|
|
545
614
|
PartitionDirectory es_partition_directory; /* for PartitionDesc lookup */
|
|
546
615
|
|
|
547
616
|
/*
|
|
548
617
|
* The following list contains ResultRelInfos created by the tuple routing
|
|
549
|
-
* code for partitions that
|
|
618
|
+
* code for partitions that aren't found in the es_result_relations array.
|
|
550
619
|
*/
|
|
551
620
|
List *es_tuple_routing_result_relations;
|
|
552
621
|
|
|
@@ -652,10 +721,7 @@ typedef struct ExecRowMark
|
|
|
652
721
|
* Each LockRows and ModifyTable node keeps a list of the rowmarks it needs to
|
|
653
722
|
* deal with. In addition to a pointer to the related entry in es_rowmarks,
|
|
654
723
|
* this struct carries the column number(s) of the resjunk columns associated
|
|
655
|
-
* with the rowmark (see comments for PlanRowMark for more detail).
|
|
656
|
-
* case of ModifyTable, there has to be a separate ExecAuxRowMark list for
|
|
657
|
-
* each child plan, because the resjunk columns could be at different physical
|
|
658
|
-
* column positions in different subplans.
|
|
724
|
+
* with the rowmark (see comments for PlanRowMark for more detail).
|
|
659
725
|
*/
|
|
660
726
|
typedef struct ExecAuxRowMark
|
|
661
727
|
{
|
|
@@ -750,17 +816,6 @@ typedef tuplehash_iterator TupleHashIterator;
|
|
|
750
816
|
* ----------------------------------------------------------------
|
|
751
817
|
*/
|
|
752
818
|
|
|
753
|
-
/* ----------------
|
|
754
|
-
* AggrefExprState node
|
|
755
|
-
* ----------------
|
|
756
|
-
*/
|
|
757
|
-
typedef struct AggrefExprState
|
|
758
|
-
{
|
|
759
|
-
NodeTag type;
|
|
760
|
-
Aggref *aggref; /* expression plan node */
|
|
761
|
-
int aggno; /* ID number for agg within its plan node */
|
|
762
|
-
} AggrefExprState;
|
|
763
|
-
|
|
764
819
|
/* ----------------
|
|
765
820
|
* WindowFuncExprState node
|
|
766
821
|
* ----------------
|
|
@@ -888,18 +943,6 @@ typedef struct SubPlanState
|
|
|
888
943
|
ExprState *cur_eq_comp; /* equality comparator for LHS vs. table */
|
|
889
944
|
} SubPlanState;
|
|
890
945
|
|
|
891
|
-
/* ----------------
|
|
892
|
-
* AlternativeSubPlanState node
|
|
893
|
-
* ----------------
|
|
894
|
-
*/
|
|
895
|
-
typedef struct AlternativeSubPlanState
|
|
896
|
-
{
|
|
897
|
-
NodeTag type;
|
|
898
|
-
AlternativeSubPlan *subplan; /* expression plan node */
|
|
899
|
-
List *subplans; /* SubPlanStates of alternative subplans */
|
|
900
|
-
int active; /* list index of the one we're using */
|
|
901
|
-
} AlternativeSubPlanState;
|
|
902
|
-
|
|
903
946
|
/*
|
|
904
947
|
* DomainConstraintState - one item to check during CoerceToDomain
|
|
905
948
|
*
|
|
@@ -994,6 +1037,8 @@ typedef struct PlanState
|
|
|
994
1037
|
ExprContext *ps_ExprContext; /* node's expression-evaluation context */
|
|
995
1038
|
ProjectionInfo *ps_ProjInfo; /* info for doing tuple projection */
|
|
996
1039
|
|
|
1040
|
+
bool async_capable; /* true if node is async-capable */
|
|
1041
|
+
|
|
997
1042
|
/*
|
|
998
1043
|
* Scanslot's descriptor if known. This is a bit of a hack, but otherwise
|
|
999
1044
|
* it's hard for expression compilation to optimize based on the
|
|
@@ -1080,9 +1125,8 @@ typedef struct PlanState
|
|
|
1080
1125
|
* EvalPlanQualSlot), and/or found using the rowmark mechanism (non-locking
|
|
1081
1126
|
* rowmarks by the EPQ machinery itself, locking ones by the caller).
|
|
1082
1127
|
*
|
|
1083
|
-
* While the plan to be checked may be changed using EvalPlanQualSetPlan()
|
|
1084
|
-
*
|
|
1085
|
-
* plans need to share the same EState.
|
|
1128
|
+
* While the plan to be checked may be changed using EvalPlanQualSetPlan(),
|
|
1129
|
+
* all such plans need to share the same EState.
|
|
1086
1130
|
*/
|
|
1087
1131
|
typedef struct EPQState
|
|
1088
1132
|
{
|
|
@@ -1166,6 +1210,12 @@ typedef struct ProjectSetState
|
|
|
1166
1210
|
MemoryContext argcontext; /* context for SRF arguments */
|
|
1167
1211
|
} ProjectSetState;
|
|
1168
1212
|
|
|
1213
|
+
|
|
1214
|
+
/* flags for mt_merge_subcommands */
|
|
1215
|
+
#define MERGE_INSERT 0x01
|
|
1216
|
+
#define MERGE_UPDATE 0x02
|
|
1217
|
+
#define MERGE_DELETE 0x04
|
|
1218
|
+
|
|
1169
1219
|
/* ----------------
|
|
1170
1220
|
* ModifyTableState information
|
|
1171
1221
|
* ----------------
|
|
@@ -1173,21 +1223,34 @@ typedef struct ProjectSetState
|
|
|
1173
1223
|
typedef struct ModifyTableState
|
|
1174
1224
|
{
|
|
1175
1225
|
PlanState ps; /* its first field is NodeTag */
|
|
1176
|
-
CmdType operation; /* INSERT, UPDATE, or
|
|
1226
|
+
CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
|
|
1177
1227
|
bool canSetTag; /* do we set the command tag/es_processed? */
|
|
1178
1228
|
bool mt_done; /* are we done? */
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1229
|
+
int mt_nrels; /* number of entries in resultRelInfo[] */
|
|
1230
|
+
ResultRelInfo *resultRelInfo; /* info about target relation(s) */
|
|
1231
|
+
|
|
1232
|
+
/*
|
|
1233
|
+
* Target relation mentioned in the original statement, used to fire
|
|
1234
|
+
* statement-level triggers and as the root for tuple routing. (This
|
|
1235
|
+
* might point to one of the resultRelInfo[] entries, but it can also be a
|
|
1236
|
+
* distinct struct.)
|
|
1237
|
+
*/
|
|
1238
|
+
ResultRelInfo *rootResultRelInfo;
|
|
1239
|
+
|
|
1188
1240
|
EPQState mt_epqstate; /* for evaluating EvalPlanQual rechecks */
|
|
1189
1241
|
bool fireBSTriggers; /* do we need to fire stmt triggers? */
|
|
1190
1242
|
|
|
1243
|
+
/*
|
|
1244
|
+
* These fields are used for inherited UPDATE and DELETE, to track which
|
|
1245
|
+
* target relation a given tuple is from. If there are a lot of target
|
|
1246
|
+
* relations, we use a hash table to translate table OIDs to
|
|
1247
|
+
* resultRelInfo[] indexes; otherwise mt_resultOidHash is NULL.
|
|
1248
|
+
*/
|
|
1249
|
+
int mt_resultOidAttno; /* resno of "tableoid" junk attr */
|
|
1250
|
+
Oid mt_lastResultOid; /* last-seen value of tableoid */
|
|
1251
|
+
int mt_lastResultIndex; /* corresponding index in resultRelInfo[] */
|
|
1252
|
+
HTAB *mt_resultOidHash; /* optional hash table to speed lookups */
|
|
1253
|
+
|
|
1191
1254
|
/*
|
|
1192
1255
|
* Slot for storing tuples in the root partitioned table's rowtype during
|
|
1193
1256
|
* an UPDATE of a partitioned table.
|
|
@@ -1203,20 +1266,25 @@ typedef struct ModifyTableState
|
|
|
1203
1266
|
/* controls transition table population for INSERT...ON CONFLICT UPDATE */
|
|
1204
1267
|
struct TransitionCaptureState *mt_oc_transition_capture;
|
|
1205
1268
|
|
|
1206
|
-
/*
|
|
1207
|
-
|
|
1269
|
+
/* Flags showing which subcommands are present INS/UPD/DEL/DO NOTHING */
|
|
1270
|
+
int mt_merge_subcommands;
|
|
1271
|
+
|
|
1272
|
+
/* tuple counters for MERGE */
|
|
1273
|
+
double mt_merge_inserted;
|
|
1274
|
+
double mt_merge_updated;
|
|
1275
|
+
double mt_merge_deleted;
|
|
1208
1276
|
} ModifyTableState;
|
|
1209
1277
|
|
|
1210
1278
|
/* ----------------
|
|
1211
1279
|
* AppendState information
|
|
1212
1280
|
*
|
|
1213
1281
|
* nplans how many plans are in the array
|
|
1214
|
-
* whichplan which plan is being executed (0 .. n-1)
|
|
1215
|
-
* special negative value. See nodeAppend.c.
|
|
1282
|
+
* whichplan which synchronous plan is being executed (0 .. n-1)
|
|
1283
|
+
* or a special negative value. See nodeAppend.c.
|
|
1216
1284
|
* prune_state details required to allow partitions to be
|
|
1217
1285
|
* eliminated from the scan, or NULL if not possible.
|
|
1218
|
-
* valid_subplans for runtime pruning, valid appendplans
|
|
1219
|
-
* scan.
|
|
1286
|
+
* valid_subplans for runtime pruning, valid synchronous appendplans
|
|
1287
|
+
* indexes to scan.
|
|
1220
1288
|
* ----------------
|
|
1221
1289
|
*/
|
|
1222
1290
|
|
|
@@ -1232,12 +1300,25 @@ struct AppendState
|
|
|
1232
1300
|
PlanState **appendplans; /* array of PlanStates for my inputs */
|
|
1233
1301
|
int as_nplans;
|
|
1234
1302
|
int as_whichplan;
|
|
1303
|
+
bool as_begun; /* false means need to initialize */
|
|
1304
|
+
Bitmapset *as_asyncplans; /* asynchronous plans indexes */
|
|
1305
|
+
int as_nasyncplans; /* # of asynchronous plans */
|
|
1306
|
+
AsyncRequest **as_asyncrequests; /* array of AsyncRequests */
|
|
1307
|
+
TupleTableSlot **as_asyncresults; /* unreturned results of async plans */
|
|
1308
|
+
int as_nasyncresults; /* # of valid entries in as_asyncresults */
|
|
1309
|
+
bool as_syncdone; /* true if all synchronous plans done in
|
|
1310
|
+
* asynchronous mode, else false */
|
|
1311
|
+
int as_nasyncremain; /* # of remaining asynchronous plans */
|
|
1312
|
+
Bitmapset *as_needrequest; /* asynchronous plans needing a new request */
|
|
1313
|
+
struct WaitEventSet *as_eventset; /* WaitEventSet used to configure file
|
|
1314
|
+
* descriptor wait events */
|
|
1235
1315
|
int as_first_partial_plan; /* Index of 'appendplans' containing
|
|
1236
1316
|
* the first partial plan */
|
|
1237
1317
|
ParallelAppendState *as_pstate; /* parallel coordination info */
|
|
1238
1318
|
Size pstate_len; /* size of parallel coordination info */
|
|
1239
1319
|
struct PartitionPruneState *as_prune_state;
|
|
1240
1320
|
Bitmapset *as_valid_subplans;
|
|
1321
|
+
Bitmapset *as_valid_asyncplans; /* valid asynchronous plans indexes */
|
|
1241
1322
|
bool (*choose_next_subplan) (AppendState *);
|
|
1242
1323
|
};
|
|
1243
1324
|
|
|
@@ -1454,7 +1535,7 @@ typedef struct IndexScanState
|
|
|
1454
1535
|
/* ----------------
|
|
1455
1536
|
* IndexOnlyScanState information
|
|
1456
1537
|
*
|
|
1457
|
-
*
|
|
1538
|
+
* recheckqual execution state for recheckqual expressions
|
|
1458
1539
|
* ScanKeys Skey structures for index quals
|
|
1459
1540
|
* NumScanKeys number of ScanKeys
|
|
1460
1541
|
* OrderByKeys Skey structures for index ordering operators
|
|
@@ -1473,7 +1554,7 @@ typedef struct IndexScanState
|
|
|
1473
1554
|
typedef struct IndexOnlyScanState
|
|
1474
1555
|
{
|
|
1475
1556
|
ScanState ss; /* its first field is NodeTag */
|
|
1476
|
-
ExprState *
|
|
1557
|
+
ExprState *recheckqual;
|
|
1477
1558
|
struct ScanKeyData *ioss_ScanKeys;
|
|
1478
1559
|
int ioss_NumScanKeys;
|
|
1479
1560
|
struct ScanKeyData *ioss_OrderByKeys;
|
|
@@ -1636,6 +1717,24 @@ typedef struct TidScanState
|
|
|
1636
1717
|
HeapTupleData tss_htup;
|
|
1637
1718
|
} TidScanState;
|
|
1638
1719
|
|
|
1720
|
+
/* ----------------
|
|
1721
|
+
* TidRangeScanState information
|
|
1722
|
+
*
|
|
1723
|
+
* trss_tidexprs list of TidOpExpr structs (see nodeTidrangescan.c)
|
|
1724
|
+
* trss_mintid the lowest TID in the scan range
|
|
1725
|
+
* trss_maxtid the highest TID in the scan range
|
|
1726
|
+
* trss_inScan is a scan currently in progress?
|
|
1727
|
+
* ----------------
|
|
1728
|
+
*/
|
|
1729
|
+
typedef struct TidRangeScanState
|
|
1730
|
+
{
|
|
1731
|
+
ScanState ss; /* its first field is NodeTag */
|
|
1732
|
+
List *trss_tidexprs;
|
|
1733
|
+
ItemPointerData trss_mintid;
|
|
1734
|
+
ItemPointerData trss_maxtid;
|
|
1735
|
+
bool trss_inScan;
|
|
1736
|
+
} TidRangeScanState;
|
|
1737
|
+
|
|
1639
1738
|
/* ----------------
|
|
1640
1739
|
* SubqueryScanState information
|
|
1641
1740
|
*
|
|
@@ -1804,6 +1903,7 @@ typedef struct ForeignScanState
|
|
|
1804
1903
|
ScanState ss; /* its first field is NodeTag */
|
|
1805
1904
|
ExprState *fdw_recheck_quals; /* original quals not in ss.ps.qual */
|
|
1806
1905
|
Size pscan_len; /* size of parallel coordination information */
|
|
1906
|
+
ResultRelInfo *resultRelInfo; /* result rel info, if UPDATE or DELETE */
|
|
1807
1907
|
/* use struct pointer to avoid including fdwapi.h here */
|
|
1808
1908
|
struct FdwRoutine *fdwroutine;
|
|
1809
1909
|
void *fdw_state; /* foreign-data wrapper can keep state here */
|
|
@@ -1992,6 +2092,75 @@ typedef struct MaterialState
|
|
|
1992
2092
|
Tuplestorestate *tuplestorestate;
|
|
1993
2093
|
} MaterialState;
|
|
1994
2094
|
|
|
2095
|
+
struct MemoizeEntry;
|
|
2096
|
+
struct MemoizeTuple;
|
|
2097
|
+
struct MemoizeKey;
|
|
2098
|
+
|
|
2099
|
+
typedef struct MemoizeInstrumentation
|
|
2100
|
+
{
|
|
2101
|
+
uint64 cache_hits; /* number of rescans where we've found the
|
|
2102
|
+
* scan parameter values to be cached */
|
|
2103
|
+
uint64 cache_misses; /* number of rescans where we've not found the
|
|
2104
|
+
* scan parameter values to be cached. */
|
|
2105
|
+
uint64 cache_evictions; /* number of cache entries removed due to
|
|
2106
|
+
* the need to free memory */
|
|
2107
|
+
uint64 cache_overflows; /* number of times we've had to bypass the
|
|
2108
|
+
* cache when filling it due to not being
|
|
2109
|
+
* able to free enough space to store the
|
|
2110
|
+
* current scan's tuples. */
|
|
2111
|
+
uint64 mem_peak; /* peak memory usage in bytes */
|
|
2112
|
+
} MemoizeInstrumentation;
|
|
2113
|
+
|
|
2114
|
+
/* ----------------
|
|
2115
|
+
* Shared memory container for per-worker memoize information
|
|
2116
|
+
* ----------------
|
|
2117
|
+
*/
|
|
2118
|
+
typedef struct SharedMemoizeInfo
|
|
2119
|
+
{
|
|
2120
|
+
int num_workers;
|
|
2121
|
+
MemoizeInstrumentation sinstrument[FLEXIBLE_ARRAY_MEMBER];
|
|
2122
|
+
} SharedMemoizeInfo;
|
|
2123
|
+
|
|
2124
|
+
/* ----------------
|
|
2125
|
+
* MemoizeState information
|
|
2126
|
+
*
|
|
2127
|
+
* memoize nodes are used to cache recent and commonly seen results from
|
|
2128
|
+
* a parameterized scan.
|
|
2129
|
+
* ----------------
|
|
2130
|
+
*/
|
|
2131
|
+
typedef struct MemoizeState
|
|
2132
|
+
{
|
|
2133
|
+
ScanState ss; /* its first field is NodeTag */
|
|
2134
|
+
int mstatus; /* value of ExecMemoize state machine */
|
|
2135
|
+
int nkeys; /* number of cache keys */
|
|
2136
|
+
struct memoize_hash *hashtable; /* hash table for cache entries */
|
|
2137
|
+
TupleDesc hashkeydesc; /* tuple descriptor for cache keys */
|
|
2138
|
+
TupleTableSlot *tableslot; /* min tuple slot for existing cache entries */
|
|
2139
|
+
TupleTableSlot *probeslot; /* virtual slot used for hash lookups */
|
|
2140
|
+
ExprState *cache_eq_expr; /* Compare exec params to hash key */
|
|
2141
|
+
ExprState **param_exprs; /* exprs containing the parameters to this
|
|
2142
|
+
* node */
|
|
2143
|
+
FmgrInfo *hashfunctions; /* lookup data for hash funcs nkeys in size */
|
|
2144
|
+
Oid *collations; /* collation for comparisons nkeys in size */
|
|
2145
|
+
uint64 mem_used; /* bytes of memory used by cache */
|
|
2146
|
+
uint64 mem_limit; /* memory limit in bytes for the cache */
|
|
2147
|
+
MemoryContext tableContext; /* memory context to store cache data */
|
|
2148
|
+
dlist_head lru_list; /* least recently used entry list */
|
|
2149
|
+
struct MemoizeTuple *last_tuple; /* Used to point to the last tuple
|
|
2150
|
+
* returned during a cache hit and the
|
|
2151
|
+
* tuple we last stored when
|
|
2152
|
+
* populating the cache. */
|
|
2153
|
+
struct MemoizeEntry *entry; /* the entry that 'last_tuple' belongs to or
|
|
2154
|
+
* NULL if 'last_tuple' is NULL. */
|
|
2155
|
+
bool singlerow; /* true if the cache entry is to be marked as
|
|
2156
|
+
* complete after caching the first tuple. */
|
|
2157
|
+
bool binary_mode; /* true when cache key should be compared bit
|
|
2158
|
+
* by bit, false when using hash equality ops */
|
|
2159
|
+
MemoizeInstrumentation stats; /* execution statistics */
|
|
2160
|
+
SharedMemoizeInfo *shared_info; /* statistics for parallel workers */
|
|
2161
|
+
Bitmapset *keyparamids; /* Param->paramids of expressions belonging to
|
|
2162
|
+
* param_exprs */
|
|
2163
|
+
} MemoizeState;
|
|
1995
2164
|
|
|
1996
2165
|
/* ----------------
|
|
1997
2166
|
* When performing sorting by multiple keys, it's possible that the input
|
|
@@ -2032,6 +2201,7 @@ typedef struct SortState
|
|
|
2032
2201
|
int64 bound_Done; /* value of bound we did the sort with */
|
|
2033
2202
|
void *tuplesortstate; /* private state of tuplesort.c */
|
|
2034
2203
|
bool am_worker; /* are we a worker? */
|
|
2204
|
+
bool datumSort; /* Datum sort instead of tuple sort? */
|
|
2035
2205
|
SharedSortInfo *shared_info; /* one entry per worker */
|
|
2036
2206
|
} SortState;
|
|
2037
2207
|
|
|
@@ -2196,7 +2366,7 @@ typedef struct AggState
|
|
|
2196
2366
|
bool table_filled; /* hash table filled yet? */
|
|
2197
2367
|
int num_hashes;
|
|
2198
2368
|
MemoryContext hash_metacxt; /* memory for hash table itself */
|
|
2199
|
-
struct
|
|
2369
|
+
struct LogicalTapeSet *hash_tapeset; /* tape set for hash spill tapes */
|
|
2200
2370
|
struct HashAggSpill *hash_spills; /* HashAggSpill for each grouping set,
|
|
2201
2371
|
* exists only during first pass */
|
|
2202
2372
|
TupleTableSlot *hash_spill_rslot; /* for reading spill files */
|
|
@@ -2236,6 +2406,18 @@ typedef struct AggState
|
|
|
2236
2406
|
typedef struct WindowStatePerFuncData *WindowStatePerFunc;
|
|
2237
2407
|
typedef struct WindowStatePerAggData *WindowStatePerAgg;
|
|
2238
2408
|
|
|
2409
|
+
/*
|
|
2410
|
+
* WindowAggStatus -- Used to track the status of WindowAggState
|
|
2411
|
+
*/
|
|
2412
|
+
typedef enum WindowAggStatus
|
|
2413
|
+
{
|
|
2414
|
+
WINDOWAGG_DONE, /* No more processing to do */
|
|
2415
|
+
WINDOWAGG_RUN, /* Normal processing of window funcs */
|
|
2416
|
+
WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */
|
|
2417
|
+
WINDOWAGG_PASSTHROUGH_STRICT /* Pass-through plus don't store new
|
|
2418
|
+
* tuples during spool */
|
|
2419
|
+
} WindowAggStatus;
|
|
2420
|
+
|
|
2239
2421
|
typedef struct WindowAggState
|
|
2240
2422
|
{
|
|
2241
2423
|
ScanState ss; /* its first field is NodeTag */
|
|
@@ -2262,6 +2444,7 @@ typedef struct WindowAggState
|
|
|
2262
2444
|
struct WindowObjectData *agg_winobj; /* winobj for aggregate fetches */
|
|
2263
2445
|
int64 aggregatedbase; /* start row for current aggregates */
|
|
2264
2446
|
int64 aggregatedupto; /* rows before this one are aggregated */
|
|
2447
|
+
WindowAggStatus status; /* run status of WindowAggState */
|
|
2265
2448
|
|
|
2266
2449
|
int frameOptions; /* frame_clause options, see WindowDef */
|
|
2267
2450
|
ExprState *startOffset; /* expression for starting bound offset */
|
|
@@ -2288,8 +2471,17 @@ typedef struct WindowAggState
|
|
|
2288
2471
|
MemoryContext curaggcontext; /* current aggregate's working data */
|
|
2289
2472
|
ExprContext *tmpcontext; /* short-term evaluation context */
|
|
2290
2473
|
|
|
2474
|
+
ExprState *runcondition; /* Condition which must remain true otherwise
|
|
2475
|
+
* execution of the WindowAgg will finish or
|
|
2476
|
+
* go into pass-through mode. NULL when there
|
|
2477
|
+
* is no such condition. */
|
|
2478
|
+
|
|
2479
|
+
bool use_pass_through; /* When false, stop execution when
|
|
2480
|
+
* runcondition is no longer true. Else
|
|
2481
|
+
* just stop evaluating window funcs. */
|
|
2482
|
+
bool top_window; /* true if this is the top-most WindowAgg or
|
|
2483
|
+
* the only WindowAgg in this query level */
|
|
2291
2484
|
bool all_first; /* true if the scan is starting */
|
|
2292
|
-
bool all_done; /* true if the scan is finished */
|
|
2293
2485
|
bool partition_spooled; /* true if all tuples in current partition
|
|
2294
2486
|
* have been spooled into tuplestore */
|
|
2295
2487
|
bool more_partitions; /* true if there's more partitions after
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Definitions for extensible nodes and custom scans
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/nodes/extensible.h
|
|
@@ -76,10 +76,12 @@ extern const ExtensibleNodeMethods *GetExtensibleNodeMethods(const char *name,
|
|
|
76
76
|
|
|
77
77
|
/*
|
|
78
78
|
* Flags for custom paths, indicating what capabilities the resulting scan
|
|
79
|
-
* will have.
|
|
79
|
+
* will have. The flags fields of CustomPath and CustomScan nodes are
|
|
80
|
+
* bitmasks of these flags.
|
|
80
81
|
*/
|
|
81
82
|
#define CUSTOMPATH_SUPPORT_BACKWARD_SCAN 0x0001
|
|
82
83
|
#define CUSTOMPATH_SUPPORT_MARK_RESTORE 0x0002
|
|
84
|
+
#define CUSTOMPATH_SUPPORT_PROJECTION 0x0004
|
|
83
85
|
|
|
84
86
|
/*
|
|
85
87
|
* Custom path methods. Mostly, we just need to know how to convert a
|