pg_query 2.2.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 +25 -0
- data/README.md +59 -31
- data/Rakefile +2 -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 +3 -1
- data/ext/pg_query/include/access/xact.h +73 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +40 -13
- 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 +145 -39
- 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 +8 -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 +44 -14
- data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
- 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 +3 -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 +18 -15
- 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 -7
- 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 +55 -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 +3 -4
- 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 +2 -2
- data/ext/pg_query/include/commands/trigger.h +18 -16
- 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 +140 -15
- 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 +30 -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 +105 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +47 -41
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +270 -78
- 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 +322 -90
- data/ext/pg_query/include/nodes/pathnodes.h +243 -66
- data/ext/pg_query/include/nodes/pg_list.h +75 -69
- data/ext/pg_query/include/nodes/plannodes.h +111 -28
- 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 -17
- 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 +3 -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 +83 -41
- 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 +939 -113
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1238
- 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 +40 -10
- 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 +71 -46
- 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 +1419 -914
- 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 +259 -42
- data/ext/pg_query/include/replication/slot.h +22 -11
- 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 +11 -8
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +5 -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 +173 -59
- 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 +60 -21
- 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 +1 -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 +10 -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 +4 -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 +10 -12
- 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 -19
- data/ext/pg_query/include/utils/relcache.h +8 -5
- 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 +34 -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 +4302 -2304
- data/ext/pg_query/pg_query_deparse.c +1106 -373
- data/ext/pg_query/pg_query_fingerprint.c +30 -10
- data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
- data/ext/pg_query/pg_query_normalize.c +1 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +54 -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_readfuncs_protobuf.c +42 -8
- 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 +20 -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 +401 -76
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +74 -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 +33874 -31261
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +172 -209
- 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 +62 -23
- 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 +71 -5
- 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 +206 -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 +701 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
- 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 -31
- 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 +37 -13
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/filter_columns.rb +1 -1
- data/lib/pg_query/fingerprint.rb +5 -1
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +20 -8
- data/lib/pg_query/pg_query_pb.rb +1108 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +1 -1
- data/lib/pg_query/version.rb +1 -1
- metadata +27 -17
- 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/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
- 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 planner's internal data structures, especially Paths.
|
|
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/pathnodes.h
|
|
@@ -55,10 +55,6 @@ typedef struct QualCost
|
|
|
55
55
|
*/
|
|
56
56
|
typedef struct AggClauseCosts
|
|
57
57
|
{
|
|
58
|
-
int numAggs; /* total number of aggregate functions */
|
|
59
|
-
int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */
|
|
60
|
-
bool hasNonPartial; /* does any agg not support partial mode? */
|
|
61
|
-
bool hasNonSerial; /* is any partial agg non-serializable? */
|
|
62
58
|
QualCost transCost; /* total per-input-row execution costs */
|
|
63
59
|
QualCost finalCost; /* total per-aggregated-row costs */
|
|
64
60
|
Size transitionSpace; /* space for pass-by-ref transition data */
|
|
@@ -75,24 +71,13 @@ typedef enum UpperRelationKind
|
|
|
75
71
|
* any */
|
|
76
72
|
UPPERREL_GROUP_AGG, /* result of grouping/aggregation, if any */
|
|
77
73
|
UPPERREL_WINDOW, /* result of window functions, if any */
|
|
74
|
+
UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */
|
|
78
75
|
UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */
|
|
79
76
|
UPPERREL_ORDERED, /* result of ORDER BY, if any */
|
|
80
77
|
UPPERREL_FINAL /* result of any remaining top-level actions */
|
|
81
78
|
/* NB: UPPERREL_FINAL must be last enum entry; it's used to size arrays */
|
|
82
79
|
} UpperRelationKind;
|
|
83
80
|
|
|
84
|
-
/*
|
|
85
|
-
* This enum identifies which type of relation is being planned through the
|
|
86
|
-
* inheritance planner. INHKIND_NONE indicates the inheritance planner
|
|
87
|
-
* was not used.
|
|
88
|
-
*/
|
|
89
|
-
typedef enum InheritanceKind
|
|
90
|
-
{
|
|
91
|
-
INHKIND_NONE,
|
|
92
|
-
INHKIND_INHERITED,
|
|
93
|
-
INHKIND_PARTITIONED
|
|
94
|
-
} InheritanceKind;
|
|
95
|
-
|
|
96
81
|
/*----------
|
|
97
82
|
* PlannerGlobal
|
|
98
83
|
* Global information for planning/optimization
|
|
@@ -120,8 +105,6 @@ typedef struct PlannerGlobal
|
|
|
120
105
|
|
|
121
106
|
List *resultRelations; /* "flat" list of integer RT indexes */
|
|
122
107
|
|
|
123
|
-
List *rootResultRelations; /* "flat" list of integer RT indexes */
|
|
124
|
-
|
|
125
108
|
List *appendRelations; /* "flat" list of AppendRelInfos */
|
|
126
109
|
|
|
127
110
|
List *relationOids; /* OIDs of relations the plan depends on */
|
|
@@ -283,6 +266,17 @@ struct PlannerInfo
|
|
|
283
266
|
|
|
284
267
|
List *join_info_list; /* list of SpecialJoinInfos */
|
|
285
268
|
|
|
269
|
+
/*
|
|
270
|
+
* all_result_relids is empty for SELECT, otherwise it contains at least
|
|
271
|
+
* parse->resultRelation. For UPDATE/DELETE/MERGE across an inheritance
|
|
272
|
+
* or partitioning tree, the result rel's child relids are added. When
|
|
273
|
+
* using multi-level partitioning, intermediate partitioned rels are
|
|
274
|
+
* included. leaf_result_relids is similar except that only actual result
|
|
275
|
+
* tables, not partitioned tables, are included in it.
|
|
276
|
+
*/
|
|
277
|
+
Relids all_result_relids; /* set of all result relids */
|
|
278
|
+
Relids leaf_result_relids; /* set of all leaf relids */
|
|
279
|
+
|
|
286
280
|
/*
|
|
287
281
|
* Note: for AppendRelInfos describing partitions of a partitioned table,
|
|
288
282
|
* we guarantee that partitions that come earlier in the partitioned
|
|
@@ -290,6 +284,8 @@ struct PlannerInfo
|
|
|
290
284
|
*/
|
|
291
285
|
List *append_rel_list; /* list of AppendRelInfos */
|
|
292
286
|
|
|
287
|
+
List *row_identity_vars; /* list of RowIdentityVarInfos */
|
|
288
|
+
|
|
293
289
|
List *rowMarks; /* list of PlanRowMarks */
|
|
294
290
|
|
|
295
291
|
List *placeholder_list; /* list of PlaceHolderInfos */
|
|
@@ -316,40 +312,55 @@ struct PlannerInfo
|
|
|
316
312
|
|
|
317
313
|
/*
|
|
318
314
|
* The fully-processed targetlist is kept here. It differs from
|
|
319
|
-
* parse->targetList in that (for INSERT
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
315
|
+
* parse->targetList in that (for INSERT) it's been reordered to match the
|
|
316
|
+
* target table, and defaults have been filled in. Also, additional
|
|
317
|
+
* resjunk targets may be present. preprocess_targetlist() does most of
|
|
318
|
+
* that work, but note that more resjunk targets can get added during
|
|
319
|
+
* appendrel expansion. (Hence, upper_targets mustn't get set up till
|
|
320
|
+
* after that.)
|
|
325
321
|
*/
|
|
326
322
|
List *processed_tlist;
|
|
327
323
|
|
|
324
|
+
/*
|
|
325
|
+
* For UPDATE, this list contains the target table's attribute numbers to
|
|
326
|
+
* which the first N entries of processed_tlist are to be assigned. (Any
|
|
327
|
+
* additional entries in processed_tlist must be resjunk.) DO NOT use the
|
|
328
|
+
* resnos in processed_tlist to identify the UPDATE target columns.
|
|
329
|
+
*/
|
|
330
|
+
List *update_colnos;
|
|
331
|
+
|
|
328
332
|
/* Fields filled during create_plan() for use in setrefs.c */
|
|
329
333
|
AttrNumber *grouping_map; /* for GroupingFunc fixup */
|
|
330
334
|
List *minmax_aggs; /* List of MinMaxAggInfos */
|
|
331
335
|
|
|
332
336
|
MemoryContext planner_cxt; /* context holding PlannerInfo */
|
|
333
337
|
|
|
334
|
-
|
|
338
|
+
Cardinality total_table_pages; /* # of pages in all non-dummy tables of
|
|
335
339
|
* query */
|
|
336
340
|
|
|
337
|
-
|
|
338
|
-
|
|
341
|
+
Selectivity tuple_fraction; /* tuple_fraction passed to query_planner */
|
|
342
|
+
Cardinality limit_tuples; /* limit_tuples passed to query_planner */
|
|
339
343
|
|
|
340
344
|
Index qual_security_level; /* minimum security_level for quals */
|
|
341
345
|
/* Note: qual_security_level is zero if there are no securityQuals */
|
|
342
346
|
|
|
343
|
-
InheritanceKind inhTargetKind; /* indicates if the target relation is an
|
|
344
|
-
* inheritance child or partition or a
|
|
345
|
-
* partitioned table */
|
|
346
347
|
bool hasJoinRTEs; /* true if any RTEs are RTE_JOIN kind */
|
|
347
348
|
bool hasLateralRTEs; /* true if any RTEs are marked LATERAL */
|
|
348
349
|
bool hasHavingQual; /* true if havingQual was non-null */
|
|
349
350
|
bool hasPseudoConstantQuals; /* true if any RestrictInfo has
|
|
350
351
|
* pseudoconstant = true */
|
|
352
|
+
bool hasAlternativeSubPlans; /* true if we've made any of those */
|
|
351
353
|
bool hasRecursion; /* true if planning a recursive WITH item */
|
|
352
354
|
|
|
355
|
+
/*
|
|
356
|
+
* Information about aggregates. Filled by preprocess_aggrefs().
|
|
357
|
+
*/
|
|
358
|
+
List *agginfos; /* AggInfo structs */
|
|
359
|
+
List *aggtransinfos; /* AggTransInfo structs */
|
|
360
|
+
int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */
|
|
361
|
+
bool hasNonPartialAggs; /* does any agg not support partial mode? */
|
|
362
|
+
bool hasNonSerialAggs; /* is any partial agg non-serializable? */
|
|
363
|
+
|
|
353
364
|
/* These fields are used only when hasRecursion is true: */
|
|
354
365
|
int wt_param_id; /* PARAM_EXEC ID for the work table */
|
|
355
366
|
struct Path *non_recursive_path; /* a path for non-recursive term */
|
|
@@ -358,6 +369,10 @@ struct PlannerInfo
|
|
|
358
369
|
Relids curOuterRels; /* outer rels above current node */
|
|
359
370
|
List *curOuterParams; /* not-yet-assigned NestLoopParams */
|
|
360
371
|
|
|
372
|
+
/* These fields are workspace for setrefs.c */
|
|
373
|
+
bool *isAltSubplan; /* array corresponding to glob->subplans */
|
|
374
|
+
bool *isUsedSubplan; /* array corresponding to glob->subplans */
|
|
375
|
+
|
|
361
376
|
/* optional private data for join_search_hook, e.g., GEQO */
|
|
362
377
|
void *join_search_private;
|
|
363
378
|
|
|
@@ -603,9 +618,6 @@ typedef struct PartitionSchemeData *PartitionScheme;
|
|
|
603
618
|
* part_rels - RelOptInfos for each partition
|
|
604
619
|
* all_partrels - Relids set of all partition relids
|
|
605
620
|
* partexprs, nullable_partexprs - Partition key expressions
|
|
606
|
-
* partitioned_child_rels - RT indexes of unpruned partitions of
|
|
607
|
-
* this relation that are partitioned tables
|
|
608
|
-
* themselves, in hierarchical order
|
|
609
621
|
*
|
|
610
622
|
* The partexprs and nullable_partexprs arrays each contain
|
|
611
623
|
* part_scheme->partnatts elements. Each of the elements is a list of
|
|
@@ -621,6 +633,10 @@ typedef struct PartitionSchemeData *PartitionScheme;
|
|
|
621
633
|
* to simplify matching join clauses to those lists.
|
|
622
634
|
*----------
|
|
623
635
|
*/
|
|
636
|
+
|
|
637
|
+
/* Bitmask of flags supported by table AMs */
|
|
638
|
+
#define AMFLAG_HAS_TID_RANGE (1 << 0)
|
|
639
|
+
|
|
624
640
|
typedef enum RelOptKind
|
|
625
641
|
{
|
|
626
642
|
RELOPT_BASEREL,
|
|
@@ -666,7 +682,7 @@ typedef struct RelOptInfo
|
|
|
666
682
|
Relids relids; /* set of base relids (rangetable indexes) */
|
|
667
683
|
|
|
668
684
|
/* size estimates generated by planner */
|
|
669
|
-
|
|
685
|
+
Cardinality rows; /* estimated number of result tuples */
|
|
670
686
|
|
|
671
687
|
/* per-relation planner control flags */
|
|
672
688
|
bool consider_startup; /* keep cheap-startup-cost paths? */
|
|
@@ -703,13 +719,15 @@ typedef struct RelOptInfo
|
|
|
703
719
|
List *indexlist; /* list of IndexOptInfo */
|
|
704
720
|
List *statlist; /* list of StatisticExtInfo */
|
|
705
721
|
BlockNumber pages; /* size estimates derived from pg_class */
|
|
706
|
-
|
|
722
|
+
Cardinality tuples;
|
|
707
723
|
double allvisfrac;
|
|
708
724
|
Bitmapset *eclass_indexes; /* Indexes in PlannerInfo's eq_classes list of
|
|
709
725
|
* ECs that mention this rel */
|
|
710
726
|
PlannerInfo *subroot; /* if subquery */
|
|
711
727
|
List *subplan_params; /* if subquery */
|
|
712
728
|
int rel_parallel_workers; /* wanted number of parallel workers */
|
|
729
|
+
uint32 amflags; /* Bitmask of optional features supported by
|
|
730
|
+
* the table AM */
|
|
713
731
|
|
|
714
732
|
/* Information about foreign tables and foreign joins */
|
|
715
733
|
Oid serverid; /* identifies server for the table or join */
|
|
@@ -750,10 +768,12 @@ typedef struct RelOptInfo
|
|
|
750
768
|
List *partition_qual; /* Partition constraint, if not the root */
|
|
751
769
|
struct RelOptInfo **part_rels; /* Array of RelOptInfos of partitions,
|
|
752
770
|
* stored in the same order as bounds */
|
|
771
|
+
Bitmapset *live_parts; /* Bitmap with members acting as indexes into
|
|
772
|
+
* the part_rels[] array to indicate which
|
|
773
|
+
* partitions survived partition pruning. */
|
|
753
774
|
Relids all_partrels; /* Relids set of all partition relids */
|
|
754
775
|
List **partexprs; /* Non-nullable partition key expressions */
|
|
755
776
|
List **nullable_partexprs; /* Nullable partition key expressions */
|
|
756
|
-
List *partitioned_child_rels; /* List of RT indexes */
|
|
757
777
|
} RelOptInfo;
|
|
758
778
|
|
|
759
779
|
/*
|
|
@@ -822,7 +842,7 @@ struct IndexOptInfo
|
|
|
822
842
|
|
|
823
843
|
/* index-size statistics (from pg_class and elsewhere) */
|
|
824
844
|
BlockNumber pages; /* number of disk pages in index */
|
|
825
|
-
|
|
845
|
+
Cardinality tuples; /* number of index tuples in index */
|
|
826
846
|
int tree_height; /* index tree height, or -1 if unknown */
|
|
827
847
|
|
|
828
848
|
/* index descriptor information */
|
|
@@ -892,10 +912,13 @@ typedef struct ForeignKeyOptInfo
|
|
|
892
912
|
|
|
893
913
|
/* Derived info about whether FK's equality conditions match the query: */
|
|
894
914
|
int nmatched_ec; /* # of FK cols matched by ECs */
|
|
915
|
+
int nconst_ec; /* # of these ECs that are ec_has_const */
|
|
895
916
|
int nmatched_rcols; /* # of FK cols matched by non-EC rinfos */
|
|
896
917
|
int nmatched_ri; /* total # of non-EC rinfos matched to FK */
|
|
897
918
|
/* Pointer to eclass matching each column's condition, if there is one */
|
|
898
919
|
struct EquivalenceClass *eclass[INDEX_MAX_KEYS];
|
|
920
|
+
/* Pointer to eclass member for the referencing Var, if there is one */
|
|
921
|
+
struct EquivalenceMember *fk_eclass_member[INDEX_MAX_KEYS];
|
|
899
922
|
/* List of non-EC RestrictInfos matching each column's condition */
|
|
900
923
|
List *rinfos[INDEX_MAX_KEYS];
|
|
901
924
|
} ForeignKeyOptInfo;
|
|
@@ -912,9 +935,11 @@ typedef struct StatisticExtInfo
|
|
|
912
935
|
NodeTag type;
|
|
913
936
|
|
|
914
937
|
Oid statOid; /* OID of the statistics row */
|
|
938
|
+
bool inherit; /* includes child relations */
|
|
915
939
|
RelOptInfo *rel; /* back-link to statistic's table */
|
|
916
940
|
char kind; /* statistics kind of this entry */
|
|
917
941
|
Bitmapset *keys; /* attnums of the columns covered */
|
|
942
|
+
List *exprs; /* expressions */
|
|
918
943
|
} StatisticExtInfo;
|
|
919
944
|
|
|
920
945
|
/*
|
|
@@ -1046,6 +1071,17 @@ typedef struct PathKey
|
|
|
1046
1071
|
bool pk_nulls_first; /* do NULLs come before normal values? */
|
|
1047
1072
|
} PathKey;
|
|
1048
1073
|
|
|
1074
|
+
/*
|
|
1075
|
+
* VolatileFunctionStatus -- allows nodes to cache their
|
|
1076
|
+
* contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet
|
|
1077
|
+
* determined.
|
|
1078
|
+
*/
|
|
1079
|
+
typedef enum VolatileFunctionStatus
|
|
1080
|
+
{
|
|
1081
|
+
VOLATILITY_UNKNOWN = 0,
|
|
1082
|
+
VOLATILITY_VOLATILE,
|
|
1083
|
+
VOLATILITY_NOVOLATILE
|
|
1084
|
+
} VolatileFunctionStatus;
|
|
1049
1085
|
|
|
1050
1086
|
/*
|
|
1051
1087
|
* PathTarget
|
|
@@ -1077,6 +1113,8 @@ typedef struct PathTarget
|
|
|
1077
1113
|
Index *sortgrouprefs; /* corresponding sort/group refnos, or 0 */
|
|
1078
1114
|
QualCost cost; /* cost of evaluating the expressions */
|
|
1079
1115
|
int width; /* estimated avg width of result tuples */
|
|
1116
|
+
VolatileFunctionStatus has_volatile_expr; /* indicates if exprs contain
|
|
1117
|
+
* any volatile functions. */
|
|
1080
1118
|
} PathTarget;
|
|
1081
1119
|
|
|
1082
1120
|
/* Convenience macro to get a sort/group refno from a PathTarget */
|
|
@@ -1103,7 +1141,7 @@ typedef struct ParamPathInfo
|
|
|
1103
1141
|
NodeTag type;
|
|
1104
1142
|
|
|
1105
1143
|
Relids ppi_req_outer; /* rels supplying parameters used by path */
|
|
1106
|
-
|
|
1144
|
+
Cardinality ppi_rows; /* estimated number of result tuples */
|
|
1107
1145
|
List *ppi_clauses; /* join clauses available from outer rels */
|
|
1108
1146
|
} ParamPathInfo;
|
|
1109
1147
|
|
|
@@ -1153,7 +1191,7 @@ typedef struct Path
|
|
|
1153
1191
|
int parallel_workers; /* desired # of workers; 0 = not parallel */
|
|
1154
1192
|
|
|
1155
1193
|
/* estimated size/costs for path (see costsize.c for more info) */
|
|
1156
|
-
|
|
1194
|
+
Cardinality rows; /* estimated number of result tuples */
|
|
1157
1195
|
Cost startup_cost; /* cost expended before fetching any tuples */
|
|
1158
1196
|
Cost total_cost; /* total cost (assuming all tuples fetched) */
|
|
1159
1197
|
|
|
@@ -1321,6 +1359,18 @@ typedef struct TidPath
|
|
|
1321
1359
|
List *tidquals; /* qual(s) involving CTID = something */
|
|
1322
1360
|
} TidPath;
|
|
1323
1361
|
|
|
1362
|
+
/*
|
|
1363
|
+
* TidRangePath represents a scan by a contiguous range of TIDs
|
|
1364
|
+
*
|
|
1365
|
+
* tidrangequals is an implicitly AND'ed list of qual expressions of the form
|
|
1366
|
+
* "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
|
|
1367
|
+
*/
|
|
1368
|
+
typedef struct TidRangePath
|
|
1369
|
+
{
|
|
1370
|
+
Path path;
|
|
1371
|
+
List *tidrangequals;
|
|
1372
|
+
} TidRangePath;
|
|
1373
|
+
|
|
1324
1374
|
/*
|
|
1325
1375
|
* SubqueryScanPath represents a scan of an unflattened subquery-in-FROM
|
|
1326
1376
|
*
|
|
@@ -1401,12 +1451,10 @@ typedef struct CustomPath
|
|
|
1401
1451
|
typedef struct AppendPath
|
|
1402
1452
|
{
|
|
1403
1453
|
Path path;
|
|
1404
|
-
/* RT indexes of non-leaf tables in a partition tree */
|
|
1405
|
-
List *partitioned_rels;
|
|
1406
1454
|
List *subpaths; /* list of component Paths */
|
|
1407
1455
|
/* Index of first partial path in subpaths; list_length(subpaths) if none */
|
|
1408
1456
|
int first_partial_path;
|
|
1409
|
-
|
|
1457
|
+
Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
|
|
1410
1458
|
} AppendPath;
|
|
1411
1459
|
|
|
1412
1460
|
#define IS_DUMMY_APPEND(p) \
|
|
@@ -1427,10 +1475,8 @@ extern bool is_dummy_rel(RelOptInfo *rel);
|
|
|
1427
1475
|
typedef struct MergeAppendPath
|
|
1428
1476
|
{
|
|
1429
1477
|
Path path;
|
|
1430
|
-
/* RT indexes of non-leaf tables in a partition tree */
|
|
1431
|
-
List *partitioned_rels;
|
|
1432
1478
|
List *subpaths; /* list of component Paths */
|
|
1433
|
-
|
|
1479
|
+
Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
|
|
1434
1480
|
} MergeAppendPath;
|
|
1435
1481
|
|
|
1436
1482
|
/*
|
|
@@ -1458,6 +1504,27 @@ typedef struct MaterialPath
|
|
|
1458
1504
|
Path *subpath;
|
|
1459
1505
|
} MaterialPath;
|
|
1460
1506
|
|
|
1507
|
+
/*
|
|
1508
|
+
* MemoizePath represents a Memoize plan node, i.e., a cache that caches
|
|
1509
|
+
* tuples from parameterized paths to save the underlying node from having to
|
|
1510
|
+
* be rescanned for parameter values which are already cached.
|
|
1511
|
+
*/
|
|
1512
|
+
typedef struct MemoizePath
|
|
1513
|
+
{
|
|
1514
|
+
Path path;
|
|
1515
|
+
Path *subpath; /* outerpath to cache tuples from */
|
|
1516
|
+
List *hash_operators; /* hash operators for each key */
|
|
1517
|
+
List *param_exprs; /* cache keys */
|
|
1518
|
+
bool singlerow; /* true if the cache entry is to be marked as
|
|
1519
|
+
* complete after caching the first record. */
|
|
1520
|
+
bool binary_mode; /* true when cache key should be compared bit
|
|
1521
|
+
* by bit, false when using hash equality ops */
|
|
1522
|
+
Cardinality calls; /* expected number of rescans */
|
|
1523
|
+
uint32 est_entries; /* The maximum number of entries that the
|
|
1524
|
+
* planner expects will fit in the cache, or 0
|
|
1525
|
+
* if unknown */
|
|
1526
|
+
} MemoizePath;
|
|
1527
|
+
|
|
1461
1528
|
/*
|
|
1462
1529
|
* UniquePath represents elimination of distinct rows from the output of
|
|
1463
1530
|
* its subpath.
|
|
@@ -1470,7 +1537,7 @@ typedef struct MaterialPath
|
|
|
1470
1537
|
* it's convenient to have a UniquePath in the path tree to signal upper-level
|
|
1471
1538
|
* routines that the input is known distinct.)
|
|
1472
1539
|
*/
|
|
1473
|
-
typedef enum
|
|
1540
|
+
typedef enum UniquePathMethod
|
|
1474
1541
|
{
|
|
1475
1542
|
UNIQUE_PATH_NOOP, /* input is known unique already */
|
|
1476
1543
|
UNIQUE_PATH_HASH, /* use hashing */
|
|
@@ -1540,7 +1607,10 @@ typedef struct JoinPath
|
|
|
1540
1607
|
* A nested-loop path needs no special fields.
|
|
1541
1608
|
*/
|
|
1542
1609
|
|
|
1543
|
-
typedef
|
|
1610
|
+
typedef struct NestPath
|
|
1611
|
+
{
|
|
1612
|
+
JoinPath jpath;
|
|
1613
|
+
} NestPath;
|
|
1544
1614
|
|
|
1545
1615
|
/*
|
|
1546
1616
|
* A mergejoin path has these fields.
|
|
@@ -1601,7 +1671,7 @@ typedef struct HashPath
|
|
|
1601
1671
|
JoinPath jpath;
|
|
1602
1672
|
List *path_hashclauses; /* join clauses used for hashing */
|
|
1603
1673
|
int num_batches; /* number of batches expected */
|
|
1604
|
-
|
|
1674
|
+
Cardinality inner_rows_total; /* total inner rows expected */
|
|
1605
1675
|
} HashPath;
|
|
1606
1676
|
|
|
1607
1677
|
/*
|
|
@@ -1704,7 +1774,7 @@ typedef struct AggPath
|
|
|
1704
1774
|
Path *subpath; /* path representing input source */
|
|
1705
1775
|
AggStrategy aggstrategy; /* basic strategy, see nodes.h */
|
|
1706
1776
|
AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
|
|
1707
|
-
|
|
1777
|
+
Cardinality numGroups; /* estimated number of groups in input */
|
|
1708
1778
|
uint64 transitionSpace; /* for pass-by-ref transition data */
|
|
1709
1779
|
List *groupClause; /* a list of SortGroupClause's */
|
|
1710
1780
|
List *qual; /* quals (HAVING quals), if any */
|
|
@@ -1718,7 +1788,7 @@ typedef struct GroupingSetData
|
|
|
1718
1788
|
{
|
|
1719
1789
|
NodeTag type;
|
|
1720
1790
|
List *set; /* grouping set as list of sortgrouprefs */
|
|
1721
|
-
|
|
1791
|
+
Cardinality numGroups; /* est. number of result groups */
|
|
1722
1792
|
} GroupingSetData;
|
|
1723
1793
|
|
|
1724
1794
|
typedef struct RollupData
|
|
@@ -1727,7 +1797,7 @@ typedef struct RollupData
|
|
|
1727
1797
|
List *groupClause; /* applicable subset of parse->groupClause */
|
|
1728
1798
|
List *gsets; /* lists of integer indexes into groupClause */
|
|
1729
1799
|
List *gsets_data; /* list of GroupingSetData */
|
|
1730
|
-
|
|
1800
|
+
Cardinality numGroups; /* est. number of result groups */
|
|
1731
1801
|
bool hashable; /* can be hashed */
|
|
1732
1802
|
bool is_hashed; /* to be implemented as a hashagg */
|
|
1733
1803
|
} RollupData;
|
|
@@ -1764,6 +1834,9 @@ typedef struct WindowAggPath
|
|
|
1764
1834
|
Path path;
|
|
1765
1835
|
Path *subpath; /* path representing input source */
|
|
1766
1836
|
WindowClause *winclause; /* WindowClause we'll be using */
|
|
1837
|
+
List *qual; /* lower-level WindowAgg runconditions */
|
|
1838
|
+
bool topwindow; /* false for all apart from the WindowAgg
|
|
1839
|
+
* that's closest to the root of the plan */
|
|
1767
1840
|
} WindowAggPath;
|
|
1768
1841
|
|
|
1769
1842
|
/*
|
|
@@ -1778,7 +1851,7 @@ typedef struct SetOpPath
|
|
|
1778
1851
|
List *distinctList; /* SortGroupClauses identifying target cols */
|
|
1779
1852
|
AttrNumber flagColIdx; /* where is the flag column, if any */
|
|
1780
1853
|
int firstFlag; /* flag value for first input relation */
|
|
1781
|
-
|
|
1854
|
+
Cardinality numGroups; /* estimated number of groups in input */
|
|
1782
1855
|
} SetOpPath;
|
|
1783
1856
|
|
|
1784
1857
|
/*
|
|
@@ -1791,7 +1864,7 @@ typedef struct RecursiveUnionPath
|
|
|
1791
1864
|
Path *rightpath;
|
|
1792
1865
|
List *distinctList; /* SortGroupClauses identifying target cols */
|
|
1793
1866
|
int wtParam; /* ID of Param representing work table */
|
|
1794
|
-
|
|
1867
|
+
Cardinality numGroups; /* estimated number of groups in input */
|
|
1795
1868
|
} RecursiveUnionPath;
|
|
1796
1869
|
|
|
1797
1870
|
/*
|
|
@@ -1806,28 +1879,30 @@ typedef struct LockRowsPath
|
|
|
1806
1879
|
} LockRowsPath;
|
|
1807
1880
|
|
|
1808
1881
|
/*
|
|
1809
|
-
* ModifyTablePath represents performing INSERT/UPDATE/DELETE
|
|
1882
|
+
* ModifyTablePath represents performing INSERT/UPDATE/DELETE/MERGE
|
|
1810
1883
|
*
|
|
1811
1884
|
* We represent most things that will be in the ModifyTable plan node
|
|
1812
|
-
* literally, except we have child Path
|
|
1885
|
+
* literally, except we have a child Path not Plan. But analysis of the
|
|
1813
1886
|
* OnConflictExpr is deferred to createplan.c, as is collection of FDW data.
|
|
1814
1887
|
*/
|
|
1815
1888
|
typedef struct ModifyTablePath
|
|
1816
1889
|
{
|
|
1817
1890
|
Path path;
|
|
1818
|
-
|
|
1891
|
+
Path *subpath; /* Path producing source data */
|
|
1892
|
+
CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
|
|
1819
1893
|
bool canSetTag; /* do we set the command tag/es_processed? */
|
|
1820
1894
|
Index nominalRelation; /* Parent RT index for use of EXPLAIN */
|
|
1821
1895
|
Index rootRelation; /* Root RT index, if target is partitioned */
|
|
1822
|
-
bool partColsUpdated; /* some part key in hierarchy updated */
|
|
1896
|
+
bool partColsUpdated; /* some part key in hierarchy updated? */
|
|
1823
1897
|
List *resultRelations; /* integer list of RT indexes */
|
|
1824
|
-
List *
|
|
1825
|
-
List *subroots; /* per-target-table PlannerInfos */
|
|
1898
|
+
List *updateColnosLists; /* per-target-table update_colnos lists */
|
|
1826
1899
|
List *withCheckOptionLists; /* per-target-table WCO lists */
|
|
1827
1900
|
List *returningLists; /* per-target-table RETURNING tlists */
|
|
1828
1901
|
List *rowMarks; /* PlanRowMarks (non-locking only) */
|
|
1829
1902
|
OnConflictExpr *onconflict; /* ON CONFLICT clause, or NULL */
|
|
1830
1903
|
int epqParam; /* ID of Param for EvalPlanQual re-eval */
|
|
1904
|
+
List *mergeActionLists; /* per-target-table lists of actions for
|
|
1905
|
+
* MERGE */
|
|
1831
1906
|
} ModifyTablePath;
|
|
1832
1907
|
|
|
1833
1908
|
/*
|
|
@@ -1999,6 +2074,9 @@ typedef struct RestrictInfo
|
|
|
1999
2074
|
|
|
2000
2075
|
bool leakproof; /* true if known to contain no leaked Vars */
|
|
2001
2076
|
|
|
2077
|
+
VolatileFunctionStatus has_volatile; /* to indicate if clause contains
|
|
2078
|
+
* any volatile functions. */
|
|
2079
|
+
|
|
2002
2080
|
Index security_level; /* see comment above */
|
|
2003
2081
|
|
|
2004
2082
|
/* The set of relids (varnos) actually referenced in the clause: */
|
|
@@ -2052,6 +2130,10 @@ typedef struct RestrictInfo
|
|
|
2052
2130
|
Selectivity right_bucketsize; /* avg bucketsize of right side */
|
|
2053
2131
|
Selectivity left_mcvfreq; /* left side's most common val's freq */
|
|
2054
2132
|
Selectivity right_mcvfreq; /* right side's most common val's freq */
|
|
2133
|
+
|
|
2134
|
+
/* hash equality operators used for memoize nodes, else InvalidOid */
|
|
2135
|
+
Oid left_hasheqoperator;
|
|
2136
|
+
Oid right_hasheqoperator;
|
|
2055
2137
|
} RestrictInfo;
|
|
2056
2138
|
|
|
2057
2139
|
/*
|
|
@@ -2278,6 +2360,34 @@ typedef struct AppendRelInfo
|
|
|
2278
2360
|
Oid parent_reloid; /* OID of parent relation */
|
|
2279
2361
|
} AppendRelInfo;
|
|
2280
2362
|
|
|
2363
|
+
/*
|
|
2364
|
+
* Information about a row-identity "resjunk" column in UPDATE/DELETE/MERGE.
|
|
2365
|
+
*
|
|
2366
|
+
* In partitioned UPDATE/DELETE/MERGE it's important for child partitions to
|
|
2367
|
+
* share row-identity columns whenever possible, so as not to chew up too many
|
|
2368
|
+
* targetlist columns. We use these structs to track which identity columns
|
|
2369
|
+
* have been requested. In the finished plan, each of these will give rise
|
|
2370
|
+
* to one resjunk entry in the targetlist of the ModifyTable's subplan node.
|
|
2371
|
+
*
|
|
2372
|
+
* All the Vars stored in RowIdentityVarInfos must have varno ROWID_VAR, for
|
|
2373
|
+
* convenience of detecting duplicate requests. We'll replace that, in the
|
|
2374
|
+
* final plan, with the varno of the generating rel.
|
|
2375
|
+
*
|
|
2376
|
+
* Outside this list, a Var with varno ROWID_VAR and varattno k is a reference
|
|
2377
|
+
* to the k-th element of the row_identity_vars list (k counting from 1).
|
|
2378
|
+
* We add such a reference to root->processed_tlist when creating the entry,
|
|
2379
|
+
* and it propagates into the plan tree from there.
|
|
2380
|
+
*/
|
|
2381
|
+
typedef struct RowIdentityVarInfo
|
|
2382
|
+
{
|
|
2383
|
+
NodeTag type;
|
|
2384
|
+
|
|
2385
|
+
Var *rowidvar; /* Var to be evaluated (but varno=ROWID_VAR) */
|
|
2386
|
+
int32 rowidwidth; /* estimated average width */
|
|
2387
|
+
char *rowidname; /* name of the resjunk column */
|
|
2388
|
+
Relids rowidrels; /* RTE indexes of target rels using this */
|
|
2389
|
+
} RowIdentityVarInfo;
|
|
2390
|
+
|
|
2281
2391
|
/*
|
|
2282
2392
|
* For each distinct placeholder expression generated during planning, we
|
|
2283
2393
|
* store a PlaceHolderInfo node in the PlannerInfo node's placeholder_list.
|
|
@@ -2512,7 +2622,7 @@ typedef struct
|
|
|
2512
2622
|
typedef struct
|
|
2513
2623
|
{
|
|
2514
2624
|
bool limit_needed;
|
|
2515
|
-
|
|
2625
|
+
Cardinality limit_tuples;
|
|
2516
2626
|
int64 count_est;
|
|
2517
2627
|
int64 offset_est;
|
|
2518
2628
|
} FinalPathExtraData;
|
|
@@ -2543,15 +2653,82 @@ typedef struct JoinCostWorkspace
|
|
|
2543
2653
|
Cost inner_rescan_run_cost;
|
|
2544
2654
|
|
|
2545
2655
|
/* private for cost_mergejoin code */
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2656
|
+
Cardinality outer_rows;
|
|
2657
|
+
Cardinality inner_rows;
|
|
2658
|
+
Cardinality outer_skip_rows;
|
|
2659
|
+
Cardinality inner_skip_rows;
|
|
2550
2660
|
|
|
2551
2661
|
/* private for cost_hashjoin code */
|
|
2552
2662
|
int numbuckets;
|
|
2553
2663
|
int numbatches;
|
|
2554
|
-
|
|
2664
|
+
Cardinality inner_rows_total;
|
|
2555
2665
|
} JoinCostWorkspace;
|
|
2556
2666
|
|
|
2667
|
+
/*
|
|
2668
|
+
* AggInfo holds information about an aggregate that needs to be computed.
|
|
2669
|
+
* Multiple Aggrefs in a query can refer to the same AggInfo by having the
|
|
2670
|
+
* same 'aggno' value, so that the aggregate is computed only once.
|
|
2671
|
+
*/
|
|
2672
|
+
typedef struct AggInfo
|
|
2673
|
+
{
|
|
2674
|
+
/*
|
|
2675
|
+
* Link to an Aggref expr this state value is for.
|
|
2676
|
+
*
|
|
2677
|
+
* There can be multiple identical Aggref's sharing the same per-agg. This
|
|
2678
|
+
* points to the first one of them.
|
|
2679
|
+
*/
|
|
2680
|
+
Aggref *representative_aggref;
|
|
2681
|
+
|
|
2682
|
+
int transno;
|
|
2683
|
+
|
|
2684
|
+
/*
|
|
2685
|
+
* "shareable" is false if this agg cannot share state values with other
|
|
2686
|
+
* aggregates because the final function is read-write.
|
|
2687
|
+
*/
|
|
2688
|
+
bool shareable;
|
|
2689
|
+
|
|
2690
|
+
/* Oid of the final function or InvalidOid */
|
|
2691
|
+
Oid finalfn_oid;
|
|
2692
|
+
|
|
2693
|
+
} AggInfo;
|
|
2694
|
+
|
|
2695
|
+
/*
|
|
2696
|
+
* AggTransInfo holds information about transition state that is used by one
|
|
2697
|
+
* or more aggregates in the query. Multiple aggregates can share the same
|
|
2698
|
+
* transition state, if they have the same inputs and the same transition
|
|
2699
|
+
* function. Aggrefs that share the same transition info have the same
|
|
2700
|
+
* 'aggtransno' value.
|
|
2701
|
+
*/
|
|
2702
|
+
typedef struct AggTransInfo
|
|
2703
|
+
{
|
|
2704
|
+
List *args;
|
|
2705
|
+
Expr *aggfilter;
|
|
2706
|
+
|
|
2707
|
+
/* Oid of the state transition function */
|
|
2708
|
+
Oid transfn_oid;
|
|
2709
|
+
|
|
2710
|
+
/* Oid of the serialization function or InvalidOid */
|
|
2711
|
+
Oid serialfn_oid;
|
|
2712
|
+
|
|
2713
|
+
/* Oid of the deserialization function or InvalidOid */
|
|
2714
|
+
Oid deserialfn_oid;
|
|
2715
|
+
|
|
2716
|
+
/* Oid of the combine function or InvalidOid */
|
|
2717
|
+
Oid combinefn_oid;
|
|
2718
|
+
|
|
2719
|
+
/* Oid of state value's datatype */
|
|
2720
|
+
Oid aggtranstype;
|
|
2721
|
+
int32 aggtranstypmod;
|
|
2722
|
+
int transtypeLen;
|
|
2723
|
+
bool transtypeByVal;
|
|
2724
|
+
int32 aggtransspace;
|
|
2725
|
+
|
|
2726
|
+
/*
|
|
2727
|
+
* initial value from pg_aggregate entry
|
|
2728
|
+
*/
|
|
2729
|
+
Datum initValue;
|
|
2730
|
+
bool initValueIsNull;
|
|
2731
|
+
|
|
2732
|
+
} AggTransInfo;
|
|
2733
|
+
|
|
2557
2734
|
#endif /* PATHNODES_H */
|