pg_query 5.0.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/README.md +1 -1
- data/Rakefile +3 -4
- data/ext/pg_query/extconf.rb +14 -4
- data/ext/pg_query/include/pg_query.h +4 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +2901 -1794
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +211 -24
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +272 -53
- data/ext/pg_query/include/postgres/access/amapi.h +299 -0
- data/ext/pg_query/include/postgres/access/attmap.h +54 -0
- data/ext/pg_query/include/postgres/access/attnum.h +64 -0
- data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
- data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
- data/ext/pg_query/include/postgres/access/clog.h +62 -0
- data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
- data/ext/pg_query/include/postgres/access/detoast.h +82 -0
- data/ext/pg_query/include/postgres/access/genam.h +237 -0
- data/ext/pg_query/include/postgres/access/gin.h +91 -0
- data/ext/pg_query/include/postgres/access/htup.h +89 -0
- data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
- data/ext/pg_query/include/postgres/access/itup.h +170 -0
- data/ext/pg_query/include/postgres/access/parallel.h +81 -0
- data/ext/pg_query/include/postgres/access/printtup.h +35 -0
- data/ext/pg_query/include/postgres/access/relation.h +28 -0
- data/ext/pg_query/include/postgres/access/relscan.h +191 -0
- data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/postgres/access/sdir.h +67 -0
- data/ext/pg_query/include/postgres/access/skey.h +151 -0
- data/ext/pg_query/include/postgres/access/slru.h +221 -0
- data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
- data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
- data/ext/pg_query/include/postgres/access/table.h +28 -0
- data/ext/pg_query/include/postgres/access/tableam.h +2109 -0
- data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
- data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
- data/ext/pg_query/include/postgres/access/transam.h +375 -0
- data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
- data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
- data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
- data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
- data/ext/pg_query/include/postgres/access/twophase.h +65 -0
- data/ext/pg_query/include/postgres/access/xact.h +530 -0
- data/ext/pg_query/include/postgres/access/xlog.h +310 -0
- data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
- data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
- data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
- data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
- data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
- data/ext/pg_query/include/postgres/c.h +1374 -0
- data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
- data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
- data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
- data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
- data/ext/pg_query/include/postgres/catalog/index.h +218 -0
- data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
- data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
- data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
- data/ext/pg_query/include/postgres/catalog/objectaddress.h +89 -0
- data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
- data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
- data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
- data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
- data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
- data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
- data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
- data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
- data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
- data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
- data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
- data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
- data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
- data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
- data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
- data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
- data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
- data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
- data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
- data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
- data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
- data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
- data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
- data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
- data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
- data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
- data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
- data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
- data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
- data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
- data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
- data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
- data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
- data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
- data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
- data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
- data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
- data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
- data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
- data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
- data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
- data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
- data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
- data/ext/pg_query/include/postgres/commands/async.h +49 -0
- data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
- data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
- data/ext/pg_query/include/postgres/commands/event_trigger.h +91 -0
- data/ext/pg_query/include/postgres/commands/explain.h +145 -0
- data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
- data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
- data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
- data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
- data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
- data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
- data/ext/pg_query/include/postgres/common/hashfn_unstable.h +453 -0
- data/ext/pg_query/include/postgres/common/int.h +512 -0
- data/ext/pg_query/include/postgres/common/keywords.h +29 -0
- data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
- data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
- data/ext/pg_query/include/postgres/common/relpath.h +97 -0
- data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
- data/ext/pg_query/include/postgres/common/sha2.h +32 -0
- data/ext/pg_query/include/postgres/common/string.h +44 -0
- data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
- data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
- data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
- data/ext/pg_query/include/postgres/executor/executor.h +681 -0
- data/ext/pg_query/include/postgres/executor/functions.h +56 -0
- data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
- data/ext/pg_query/include/postgres/executor/spi.h +207 -0
- data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
- data/ext/pg_query/include/postgres/fmgr.h +800 -0
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/postgres/funcapi.h +360 -0
- data/ext/pg_query/include/postgres/gram.h +1168 -0
- data/ext/pg_query/include/postgres/gramparse.h +75 -0
- data/ext/pg_query/include/postgres/jit/jit.h +106 -0
- data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
- data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
- data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
- data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
- data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
- data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
- data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
- data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
- data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
- data/ext/pg_query/include/postgres/libpq/libpq-be.h +358 -0
- data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
- data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
- data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
- data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
- data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
- data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
- data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
- data/ext/pg_query/include/postgres/mb/pg_wchar.h +792 -0
- data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/postgres/miscadmin.h +519 -0
- data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
- data/ext/pg_query/include/postgres/nodes/execnodes.h +2852 -0
- data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
- data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
- data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
- data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
- data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
- data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
- data/ext/pg_query/include/postgres/nodes/params.h +170 -0
- data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
- data/ext/pg_query/include/postgres/nodes/pathnodes.h +3435 -0
- data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
- data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
- data/ext/pg_query/include/postgres/nodes/primnodes.h +2335 -0
- data/ext/pg_query/include/postgres/nodes/print.h +34 -0
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
- data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
- data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/postgres/nodes/value.h +90 -0
- data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
- data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
- data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
- data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
- data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
- data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
- data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
- data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
- data/ext/pg_query/include/postgres/parser/parse_coerce.h +102 -0
- data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
- data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
- data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
- data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
- data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
- data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
- data/ext/pg_query/include/postgres/parser/parser.h +68 -0
- data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
- data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
- data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
- data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/postgres/pg_config.h +977 -0
- data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
- data/ext/pg_query/include/postgres/pg_trace.h +17 -0
- data/ext/pg_query/include/postgres/pgstat.h +780 -0
- data/ext/pg_query/include/postgres/pgtime.h +94 -0
- data/ext/pg_query/include/postgres/pl_gram.h +385 -0
- data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
- data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
- data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
- data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
- data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
- data/ext/pg_query/include/postgres/port/atomics.h +606 -0
- data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
- data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
- data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
- data/ext/pg_query/include/postgres/port/simd.h +422 -0
- data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
- data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
- data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
- data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
- data/ext/pg_query/include/postgres/port/win32.h +59 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
- data/ext/pg_query/include/postgres/port/win32_port.h +584 -0
- data/ext/pg_query/include/postgres/port.h +524 -0
- data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
- data/ext/pg_query/include/postgres/postgres.h +579 -0
- data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
- data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
- data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
- data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
- data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
- data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
- data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
- data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
- data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
- data/ext/pg_query/include/postgres/regex/regex.h +272 -0
- data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
- data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
- data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
- data/ext/pg_query/include/postgres/replication/origin.h +73 -0
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +743 -0
- data/ext/pg_query/include/postgres/replication/slot.h +285 -0
- data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
- data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
- data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
- data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
- data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
- data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/postgres/storage/block.h +108 -0
- data/ext/pg_query/include/postgres/storage/buf.h +46 -0
- data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
- data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
- data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
- data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
- data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
- data/ext/pg_query/include/postgres/storage/fd.h +219 -0
- data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
- data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
- data/ext/pg_query/include/postgres/storage/item.h +19 -0
- data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
- data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
- data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
- data/ext/pg_query/include/postgres/storage/latch.h +196 -0
- data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
- data/ext/pg_query/include/postgres/storage/lock.h +624 -0
- data/ext/pg_query/include/postgres/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
- data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
- data/ext/pg_query/include/postgres/storage/off.h +57 -0
- data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
- data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
- data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
- data/ext/pg_query/include/postgres/storage/proc.h +491 -0
- data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
- data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
- data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
- data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
- data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
- data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
- data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
- data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
- data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
- data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
- data/ext/pg_query/include/postgres/storage/smgr.h +127 -0
- data/ext/pg_query/include/postgres/storage/spin.h +77 -0
- data/ext/pg_query/include/postgres/storage/standby.h +109 -0
- data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/postgres/storage/sync.h +66 -0
- data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
- data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
- data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
- data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
- data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
- data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
- data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
- data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
- data/ext/pg_query/include/postgres/utils/acl.h +290 -0
- data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/postgres/utils/array.h +481 -0
- data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
- data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
- data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
- data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
- data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
- data/ext/pg_query/include/postgres/utils/catcache.h +230 -0
- data/ext/pg_query/include/postgres/utils/date.h +118 -0
- data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
- data/ext/pg_query/include/postgres/utils/datum.h +76 -0
- data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
- data/ext/pg_query/include/postgres/utils/elog.h +540 -0
- data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
- data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
- data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
- data/ext/pg_query/include/postgres/utils/float.h +357 -0
- data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
- data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
- data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
- data/ext/pg_query/include/postgres/utils/guc.h +456 -0
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
- data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
- data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
- data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
- data/ext/pg_query/include/postgres/utils/inval.h +68 -0
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
- data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
- data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
- data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
- data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
- data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
- data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +808 -0
- data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
- data/ext/pg_query/include/postgres/utils/portal.h +252 -0
- data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
- data/ext/pg_query/include/postgres/utils/rel.h +711 -0
- data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
- data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
- data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
- data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
- data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
- data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
- data/ext/pg_query/include/postgres/utils/syscache.h +131 -0
- data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
- data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
- data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
- data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
- data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
- data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
- data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
- data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
- data/ext/pg_query/include/postgres/utils/xml.h +94 -0
- data/ext/pg_query/include/postgres/varatt.h +358 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
- data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
- data/ext/pg_query/pg_query.c +9 -0
- data/ext/pg_query/pg_query.pb-c.c +6598 -3739
- data/ext/pg_query/pg_query_fingerprint.c +4 -5
- data/ext/pg_query/pg_query_normalize.c +42 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +1 -0
- data/ext/pg_query/pg_query_parse.c +1 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +18 -17
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +3 -2
- data/ext/pg_query/pg_query_ruby.c +5 -0
- data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -1
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/pg_query_split.c +1 -1
- data/ext/pg_query/postgres_deparse.c +409 -21
- data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
- data/ext/pg_query/src_backend_commands_define.c +2 -3
- data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +3 -7
- data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +34490 -32135
- data/ext/pg_query/src_backend_parser_parser.c +8 -8
- data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
- data/ext/pg_query/src_backend_parser_scansup.c +2 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
- data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
- data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
- data/ext/pg_query/src_backend_utils_error_elog.c +60 -190
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
- data/ext/pg_query/src_backend_utils_init_globals.c +16 -4
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +19 -81
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -8
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
- data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
- data/ext/pg_query/src_common_encnames.c +43 -44
- data/ext/pg_query/src_common_hashfn.c +1 -1
- data/ext/pg_query/src_common_keywords.c +1 -1
- data/ext/pg_query/src_common_kwlist_d.h +511 -466
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +3 -3
- data/ext/pg_query/src_common_stringinfo.c +18 -1
- data/ext/pg_query/src_common_wchar.c +45 -108
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
- 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 +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
- data/ext/pg_query/src_port_pg_bitutils.c +251 -32
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +4 -4
- data/ext/pg_query/src_port_strerror.c +1 -3
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/fingerprint.rb +2 -3
- data/lib/pg_query/node.rb +16 -11
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +26 -3
- data/lib/pg_query/treewalker.rb +52 -12
- data/lib/pg_query/truncate.rb +1 -1
- data/lib/pg_query/version.rb +1 -1
- metadata +444 -400
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +0 -292
- data/ext/pg_query/include/access/attmap.h +0 -54
- data/ext/pg_query/include/access/attnum.h +0 -64
- data/ext/pg_query/include/access/clog.h +0 -63
- data/ext/pg_query/include/access/commit_ts.h +0 -74
- data/ext/pg_query/include/access/detoast.h +0 -82
- data/ext/pg_query/include/access/genam.h +0 -233
- data/ext/pg_query/include/access/gin.h +0 -91
- data/ext/pg_query/include/access/htup.h +0 -89
- data/ext/pg_query/include/access/htup_details.h +0 -811
- data/ext/pg_query/include/access/itup.h +0 -170
- data/ext/pg_query/include/access/parallel.h +0 -82
- data/ext/pg_query/include/access/printtup.h +0 -35
- data/ext/pg_query/include/access/relation.h +0 -28
- data/ext/pg_query/include/access/relscan.h +0 -191
- data/ext/pg_query/include/access/rmgrlist.h +0 -49
- data/ext/pg_query/include/access/sdir.h +0 -67
- data/ext/pg_query/include/access/skey.h +0 -151
- data/ext/pg_query/include/access/stratnum.h +0 -85
- data/ext/pg_query/include/access/sysattr.h +0 -29
- data/ext/pg_query/include/access/table.h +0 -28
- data/ext/pg_query/include/access/tableam.h +0 -2100
- data/ext/pg_query/include/access/toast_compression.h +0 -73
- data/ext/pg_query/include/access/transam.h +0 -375
- data/ext/pg_query/include/access/tsmapi.h +0 -82
- data/ext/pg_query/include/access/tupconvert.h +0 -54
- data/ext/pg_query/include/access/tupdesc.h +0 -154
- data/ext/pg_query/include/access/tupmacs.h +0 -207
- data/ext/pg_query/include/access/twophase.h +0 -65
- data/ext/pg_query/include/access/xact.h +0 -530
- data/ext/pg_query/include/access/xlog.h +0 -302
- data/ext/pg_query/include/access/xlog_internal.h +0 -404
- data/ext/pg_query/include/access/xlogbackup.h +0 -41
- data/ext/pg_query/include/access/xlogdefs.h +0 -82
- data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
- data/ext/pg_query/include/access/xlogreader.h +0 -444
- data/ext/pg_query/include/access/xlogrecord.h +0 -248
- data/ext/pg_query/include/access/xlogrecovery.h +0 -158
- data/ext/pg_query/include/archive/archive_module.h +0 -59
- data/ext/pg_query/include/c.h +0 -1379
- data/ext/pg_query/include/catalog/catalog.h +0 -45
- data/ext/pg_query/include/catalog/catversion.h +0 -62
- data/ext/pg_query/include/catalog/dependency.h +0 -270
- data/ext/pg_query/include/catalog/genbki.h +0 -143
- data/ext/pg_query/include/catalog/index.h +0 -214
- data/ext/pg_query/include/catalog/indexing.h +0 -54
- data/ext/pg_query/include/catalog/namespace.h +0 -190
- data/ext/pg_query/include/catalog/objectaccess.h +0 -267
- data/ext/pg_query/include/catalog/objectaddress.h +0 -89
- data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
- data/ext/pg_query/include/catalog/pg_am.h +0 -63
- data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
- data/ext/pg_query/include/catalog/pg_attribute.h +0 -223
- data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
- data/ext/pg_query/include/catalog/pg_authid.h +0 -63
- data/ext/pg_query/include/catalog/pg_authid_d.h +0 -59
- data/ext/pg_query/include/catalog/pg_class.h +0 -230
- data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
- data/ext/pg_query/include/catalog/pg_collation.h +0 -100
- data/ext/pg_query/include/catalog/pg_collation_d.h +0 -63
- data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
- data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
- data/ext/pg_query/include/catalog/pg_control.h +0 -258
- data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
- data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
- data/ext/pg_query/include/catalog/pg_database.h +0 -124
- data/ext/pg_query/include/catalog/pg_database_d.h +0 -52
- data/ext/pg_query/include/catalog/pg_depend.h +0 -77
- data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_index.h +0 -90
- data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
- data/ext/pg_query/include/catalog/pg_language.h +0 -72
- data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
- data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
- data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
- data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
- data/ext/pg_query/include/catalog/pg_operator.h +0 -107
- data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
- data/ext/pg_query/include/catalog/pg_opfamily.h +0 -64
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -51
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
- data/ext/pg_query/include/catalog/pg_proc.h +0 -220
- data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
- data/ext/pg_query/include/catalog/pg_publication.h +0 -158
- data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
- data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
- data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
- data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
- data/ext/pg_query/include/catalog/pg_transform.h +0 -48
- data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
- data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
- data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
- data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
- data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
- data/ext/pg_query/include/catalog/pg_type.h +0 -404
- data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
- data/ext/pg_query/include/catalog/storage.h +0 -50
- data/ext/pg_query/include/commands/async.h +0 -53
- data/ext/pg_query/include/commands/dbcommands.h +0 -37
- data/ext/pg_query/include/commands/defrem.h +0 -161
- data/ext/pg_query/include/commands/event_trigger.h +0 -88
- data/ext/pg_query/include/commands/explain.h +0 -129
- data/ext/pg_query/include/commands/prepare.h +0 -61
- data/ext/pg_query/include/commands/tablespace.h +0 -69
- data/ext/pg_query/include/commands/trigger.h +0 -288
- data/ext/pg_query/include/commands/vacuum.h +0 -386
- data/ext/pg_query/include/common/cryptohash.h +0 -39
- data/ext/pg_query/include/common/file_perm.h +0 -56
- data/ext/pg_query/include/common/hashfn.h +0 -104
- data/ext/pg_query/include/common/int.h +0 -437
- data/ext/pg_query/include/common/ip.h +0 -33
- data/ext/pg_query/include/common/keywords.h +0 -29
- data/ext/pg_query/include/common/kwlookup.h +0 -44
- data/ext/pg_query/include/common/pg_prng.h +0 -61
- data/ext/pg_query/include/common/relpath.h +0 -97
- data/ext/pg_query/include/common/scram-common.h +0 -70
- data/ext/pg_query/include/common/sha2.h +0 -32
- data/ext/pg_query/include/common/string.h +0 -44
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
- data/ext/pg_query/include/copyfuncs.funcs.c +0 -5013
- data/ext/pg_query/include/copyfuncs.switch.c +0 -938
- data/ext/pg_query/include/datatype/timestamp.h +0 -243
- data/ext/pg_query/include/equalfuncs.funcs.c +0 -3097
- data/ext/pg_query/include/equalfuncs.switch.c +0 -785
- data/ext/pg_query/include/executor/execdesc.h +0 -70
- data/ext/pg_query/include/executor/executor.h +0 -680
- data/ext/pg_query/include/executor/functions.h +0 -55
- data/ext/pg_query/include/executor/instrument.h +0 -118
- data/ext/pg_query/include/executor/spi.h +0 -213
- data/ext/pg_query/include/executor/tablefunc.h +0 -67
- data/ext/pg_query/include/executor/tuptable.h +0 -494
- data/ext/pg_query/include/fmgr.h +0 -800
- data/ext/pg_query/include/foreign/fdwapi.h +0 -294
- data/ext/pg_query/include/funcapi.h +0 -360
- data/ext/pg_query/include/gram.h +0 -1127
- data/ext/pg_query/include/gramparse.h +0 -75
- data/ext/pg_query/include/jit/jit.h +0 -105
- data/ext/pg_query/include/kwlist_d.h +0 -1119
- data/ext/pg_query/include/lib/dshash.h +0 -115
- data/ext/pg_query/include/lib/ilist.h +0 -1159
- data/ext/pg_query/include/lib/pairingheap.h +0 -102
- data/ext/pg_query/include/lib/simplehash.h +0 -1184
- data/ext/pg_query/include/lib/sort_template.h +0 -432
- data/ext/pg_query/include/lib/stringinfo.h +0 -161
- data/ext/pg_query/include/libpq/auth.h +0 -37
- data/ext/pg_query/include/libpq/crypt.h +0 -47
- data/ext/pg_query/include/libpq/hba.h +0 -186
- data/ext/pg_query/include/libpq/libpq-be.h +0 -354
- data/ext/pg_query/include/libpq/libpq.h +0 -144
- data/ext/pg_query/include/libpq/pqcomm.h +0 -163
- data/ext/pg_query/include/libpq/pqformat.h +0 -210
- data/ext/pg_query/include/libpq/pqsignal.h +0 -54
- data/ext/pg_query/include/libpq/sasl.h +0 -136
- data/ext/pg_query/include/libpq/scram.h +0 -37
- data/ext/pg_query/include/mb/pg_wchar.h +0 -772
- data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
- data/ext/pg_query/include/miscadmin.h +0 -507
- data/ext/pg_query/include/nodes/bitmapset.h +0 -126
- data/ext/pg_query/include/nodes/execnodes.h +0 -2768
- data/ext/pg_query/include/nodes/extensible.h +0 -164
- data/ext/pg_query/include/nodes/lockoptions.h +0 -61
- data/ext/pg_query/include/nodes/makefuncs.h +0 -121
- data/ext/pg_query/include/nodes/memnodes.h +0 -113
- data/ext/pg_query/include/nodes/miscnodes.h +0 -56
- data/ext/pg_query/include/nodes/nodeFuncs.h +0 -222
- data/ext/pg_query/include/nodes/nodes.h +0 -446
- data/ext/pg_query/include/nodes/nodetags.h +0 -471
- data/ext/pg_query/include/nodes/params.h +0 -170
- data/ext/pg_query/include/nodes/parsenodes.h +0 -4050
- data/ext/pg_query/include/nodes/pathnodes.h +0 -3384
- data/ext/pg_query/include/nodes/pg_list.h +0 -635
- data/ext/pg_query/include/nodes/plannodes.h +0 -1592
- data/ext/pg_query/include/nodes/primnodes.h +0 -2041
- data/ext/pg_query/include/nodes/print.h +0 -34
- data/ext/pg_query/include/nodes/queryjumble.h +0 -86
- data/ext/pg_query/include/nodes/replnodes.h +0 -111
- data/ext/pg_query/include/nodes/supportnodes.h +0 -346
- data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
- data/ext/pg_query/include/nodes/value.h +0 -90
- data/ext/pg_query/include/optimizer/cost.h +0 -215
- data/ext/pg_query/include/optimizer/geqo.h +0 -90
- data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
- data/ext/pg_query/include/optimizer/optimizer.h +0 -202
- data/ext/pg_query/include/optimizer/paths.h +0 -266
- data/ext/pg_query/include/optimizer/planmain.h +0 -117
- data/ext/pg_query/include/parser/analyze.h +0 -64
- data/ext/pg_query/include/parser/kwlist.h +0 -498
- data/ext/pg_query/include/parser/parse_agg.h +0 -65
- data/ext/pg_query/include/parser/parse_coerce.h +0 -102
- data/ext/pg_query/include/parser/parse_expr.h +0 -25
- data/ext/pg_query/include/parser/parse_func.h +0 -74
- data/ext/pg_query/include/parser/parse_node.h +0 -357
- data/ext/pg_query/include/parser/parse_oper.h +0 -65
- data/ext/pg_query/include/parser/parse_relation.h +0 -129
- data/ext/pg_query/include/parser/parse_type.h +0 -61
- data/ext/pg_query/include/parser/parser.h +0 -68
- data/ext/pg_query/include/parser/parsetree.h +0 -61
- data/ext/pg_query/include/parser/scanner.h +0 -152
- data/ext/pg_query/include/parser/scansup.h +0 -27
- data/ext/pg_query/include/partitioning/partdefs.h +0 -26
- data/ext/pg_query/include/pg_config.h +0 -843
- data/ext/pg_query/include/pg_config_manual.h +0 -372
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/pg_getopt.h +0 -56
- data/ext/pg_query/include/pg_trace.h +0 -17
- data/ext/pg_query/include/pgstat.h +0 -778
- data/ext/pg_query/include/pgtime.h +0 -94
- data/ext/pg_query/include/pl_gram.h +0 -385
- data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
- data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -112
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -246
- data/ext/pg_query/include/plerrcodes.h +0 -998
- data/ext/pg_query/include/plpgsql.h +0 -1340
- data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
- data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
- data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
- data/ext/pg_query/include/port/atomics/fallback.h +0 -170
- data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
- data/ext/pg_query/include/port/atomics/generic.h +0 -401
- data/ext/pg_query/include/port/atomics.h +0 -519
- data/ext/pg_query/include/port/pg_bitutils.h +0 -339
- data/ext/pg_query/include/port/pg_bswap.h +0 -161
- data/ext/pg_query/include/port/pg_crc32c.h +0 -101
- data/ext/pg_query/include/port/simd.h +0 -375
- data/ext/pg_query/include/port.h +0 -520
- data/ext/pg_query/include/portability/instr_time.h +0 -197
- data/ext/pg_query/include/postgres.h +0 -579
- data/ext/pg_query/include/postmaster/autovacuum.h +0 -80
- data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
- data/ext/pg_query/include/postmaster/bgworker.h +0 -162
- data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
- data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/postmaster/interrupt.h +0 -32
- data/ext/pg_query/include/postmaster/pgarch.h +0 -36
- data/ext/pg_query/include/postmaster/postmaster.h +0 -81
- data/ext/pg_query/include/postmaster/startup.h +0 -41
- data/ext/pg_query/include/postmaster/syslogger.h +0 -103
- data/ext/pg_query/include/postmaster/walwriter.h +0 -23
- data/ext/pg_query/include/regex/regex.h +0 -189
- data/ext/pg_query/include/replication/logicallauncher.h +0 -34
- data/ext/pg_query/include/replication/logicalproto.h +0 -274
- data/ext/pg_query/include/replication/logicalworker.h +0 -32
- data/ext/pg_query/include/replication/origin.h +0 -73
- data/ext/pg_query/include/replication/reorderbuffer.h +0 -753
- data/ext/pg_query/include/replication/slot.h +0 -249
- data/ext/pg_query/include/replication/syncrep.h +0 -109
- data/ext/pg_query/include/replication/walreceiver.h +0 -478
- data/ext/pg_query/include/replication/walsender.h +0 -74
- data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
- data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -35
- data/ext/pg_query/include/rewrite/rewriteManip.h +0 -96
- data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
- data/ext/pg_query/include/src_backend_nodes_copyfuncs.funcs.c +0 -5321
- data/ext/pg_query/include/src_backend_nodes_equalfuncs.funcs.c +0 -3354
- data/ext/pg_query/include/storage/backendid.h +0 -37
- data/ext/pg_query/include/storage/block.h +0 -108
- data/ext/pg_query/include/storage/buf.h +0 -46
- data/ext/pg_query/include/storage/bufmgr.h +0 -393
- data/ext/pg_query/include/storage/bufpage.h +0 -510
- data/ext/pg_query/include/storage/condition_variable.h +0 -73
- data/ext/pg_query/include/storage/dsm.h +0 -61
- data/ext/pg_query/include/storage/dsm_impl.h +0 -79
- data/ext/pg_query/include/storage/fd.h +0 -202
- data/ext/pg_query/include/storage/fileset.h +0 -40
- data/ext/pg_query/include/storage/ipc.h +0 -84
- data/ext/pg_query/include/storage/item.h +0 -19
- data/ext/pg_query/include/storage/itemid.h +0 -184
- data/ext/pg_query/include/storage/itemptr.h +0 -245
- data/ext/pg_query/include/storage/large_object.h +0 -100
- data/ext/pg_query/include/storage/latch.h +0 -194
- data/ext/pg_query/include/storage/lmgr.h +0 -120
- data/ext/pg_query/include/storage/lock.h +0 -624
- data/ext/pg_query/include/storage/lockdefs.h +0 -59
- data/ext/pg_query/include/storage/lwlock.h +0 -220
- data/ext/pg_query/include/storage/lwlocknames.h +0 -50
- data/ext/pg_query/include/storage/off.h +0 -57
- data/ext/pg_query/include/storage/pg_sema.h +0 -61
- data/ext/pg_query/include/storage/pg_shmem.h +0 -92
- data/ext/pg_query/include/storage/pmsignal.h +0 -105
- data/ext/pg_query/include/storage/predicate.h +0 -87
- data/ext/pg_query/include/storage/proc.h +0 -466
- data/ext/pg_query/include/storage/procarray.h +0 -99
- data/ext/pg_query/include/storage/proclist_types.h +0 -51
- data/ext/pg_query/include/storage/procsignal.h +0 -73
- data/ext/pg_query/include/storage/relfilelocator.h +0 -99
- data/ext/pg_query/include/storage/s_lock.h +0 -867
- data/ext/pg_query/include/storage/sharedfileset.h +0 -37
- data/ext/pg_query/include/storage/shm_mq.h +0 -86
- data/ext/pg_query/include/storage/shm_toc.h +0 -58
- data/ext/pg_query/include/storage/shmem.h +0 -59
- data/ext/pg_query/include/storage/sinval.h +0 -153
- data/ext/pg_query/include/storage/sinvaladt.h +0 -45
- data/ext/pg_query/include/storage/smgr.h +0 -113
- data/ext/pg_query/include/storage/spin.h +0 -77
- data/ext/pg_query/include/storage/standby.h +0 -99
- data/ext/pg_query/include/storage/standbydefs.h +0 -74
- data/ext/pg_query/include/storage/sync.h +0 -66
- data/ext/pg_query/include/tcop/cmdtag.h +0 -63
- data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
- data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
- data/ext/pg_query/include/tcop/dest.h +0 -147
- data/ext/pg_query/include/tcop/fastpath.h +0 -20
- data/ext/pg_query/include/tcop/pquery.h +0 -51
- data/ext/pg_query/include/tcop/tcopprot.h +0 -94
- data/ext/pg_query/include/tcop/utility.h +0 -112
- data/ext/pg_query/include/tsearch/ts_cache.h +0 -96
- data/ext/pg_query/include/utils/acl.h +0 -278
- data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
- data/ext/pg_query/include/utils/array.h +0 -482
- data/ext/pg_query/include/utils/backend_progress.h +0 -45
- data/ext/pg_query/include/utils/backend_status.h +0 -342
- data/ext/pg_query/include/utils/builtins.h +0 -136
- data/ext/pg_query/include/utils/bytea.h +0 -28
- data/ext/pg_query/include/utils/catcache.h +0 -231
- data/ext/pg_query/include/utils/date.h +0 -118
- data/ext/pg_query/include/utils/datetime.h +0 -364
- data/ext/pg_query/include/utils/datum.h +0 -76
- data/ext/pg_query/include/utils/dsa.h +0 -127
- data/ext/pg_query/include/utils/elog.h +0 -545
- data/ext/pg_query/include/utils/errcodes.h +0 -354
- data/ext/pg_query/include/utils/expandeddatum.h +0 -170
- data/ext/pg_query/include/utils/expandedrecord.h +0 -241
- data/ext/pg_query/include/utils/float.h +0 -357
- data/ext/pg_query/include/utils/fmgroids.h +0 -3314
- data/ext/pg_query/include/utils/fmgrprotos.h +0 -2871
- data/ext/pg_query/include/utils/fmgrtab.h +0 -49
- data/ext/pg_query/include/utils/guc.h +0 -442
- data/ext/pg_query/include/utils/guc_hooks.h +0 -163
- data/ext/pg_query/include/utils/guc_tables.h +0 -322
- data/ext/pg_query/include/utils/hsearch.h +0 -153
- data/ext/pg_query/include/utils/inval.h +0 -68
- data/ext/pg_query/include/utils/logtape.h +0 -77
- data/ext/pg_query/include/utils/lsyscache.h +0 -212
- data/ext/pg_query/include/utils/memdebug.h +0 -82
- data/ext/pg_query/include/utils/memutils.h +0 -186
- data/ext/pg_query/include/utils/memutils_internal.h +0 -136
- data/ext/pg_query/include/utils/memutils_memorychunk.h +0 -237
- data/ext/pg_query/include/utils/numeric.h +0 -105
- data/ext/pg_query/include/utils/palloc.h +0 -165
- data/ext/pg_query/include/utils/partcache.h +0 -103
- data/ext/pg_query/include/utils/pg_locale.h +0 -135
- data/ext/pg_query/include/utils/pgstat_internal.h +0 -814
- data/ext/pg_query/include/utils/pidfile.h +0 -56
- data/ext/pg_query/include/utils/plancache.h +0 -236
- data/ext/pg_query/include/utils/portal.h +0 -252
- data/ext/pg_query/include/utils/queryenvironment.h +0 -74
- data/ext/pg_query/include/utils/regproc.h +0 -39
- data/ext/pg_query/include/utils/rel.h +0 -712
- data/ext/pg_query/include/utils/relcache.h +0 -158
- data/ext/pg_query/include/utils/reltrigger.h +0 -81
- data/ext/pg_query/include/utils/resowner.h +0 -86
- data/ext/pg_query/include/utils/ruleutils.h +0 -52
- data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
- data/ext/pg_query/include/utils/snapmgr.h +0 -181
- data/ext/pg_query/include/utils/snapshot.h +0 -219
- data/ext/pg_query/include/utils/sortsupport.h +0 -391
- data/ext/pg_query/include/utils/syscache.h +0 -227
- data/ext/pg_query/include/utils/timeout.h +0 -95
- data/ext/pg_query/include/utils/timestamp.h +0 -147
- data/ext/pg_query/include/utils/tuplesort.h +0 -445
- data/ext/pg_query/include/utils/tuplestore.h +0 -91
- data/ext/pg_query/include/utils/typcache.h +0 -209
- data/ext/pg_query/include/utils/varlena.h +0 -53
- data/ext/pg_query/include/utils/wait_event.h +0 -294
- data/ext/pg_query/include/utils/xml.h +0 -94
- data/ext/pg_query/include/varatt.h +0 -358
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2220
- data/ext/pg_query/src_port_strnlen.c +0 -39
- /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
- /data/ext/pg_query/include/{commands → postgres/commands}/user.h +0 -0
- /data/ext/pg_query/include/{common → postgres/common}/unicode_nonspacing_table.h +0 -0
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
- /data/ext/pg_query/include/{postgres_ext.h → postgres/postgres_ext.h} +0 -0
- /data/ext/pg_query/include/{utils → postgres/utils}/probes.h +0 -0
- /data/ext/pg_query/include/{utils → postgres/utils}/ps_status.h +0 -0
@@ -1,3384 +0,0 @@
|
|
1
|
-
/*-------------------------------------------------------------------------
|
2
|
-
*
|
3
|
-
* pathnodes.h
|
4
|
-
* Definitions for planner's internal data structures, especially Paths.
|
5
|
-
*
|
6
|
-
* We don't support copying RelOptInfo, IndexOptInfo, or Path nodes.
|
7
|
-
* There are some subsidiary structs that are useful to copy, though.
|
8
|
-
*
|
9
|
-
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
10
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
11
|
-
*
|
12
|
-
* src/include/nodes/pathnodes.h
|
13
|
-
*
|
14
|
-
*-------------------------------------------------------------------------
|
15
|
-
*/
|
16
|
-
#ifndef PATHNODES_H
|
17
|
-
#define PATHNODES_H
|
18
|
-
|
19
|
-
#include "access/sdir.h"
|
20
|
-
#include "lib/stringinfo.h"
|
21
|
-
#include "nodes/params.h"
|
22
|
-
#include "nodes/parsenodes.h"
|
23
|
-
#include "storage/block.h"
|
24
|
-
|
25
|
-
|
26
|
-
/*
|
27
|
-
* Relids
|
28
|
-
* Set of relation identifiers (indexes into the rangetable).
|
29
|
-
*/
|
30
|
-
typedef Bitmapset *Relids;
|
31
|
-
|
32
|
-
/*
|
33
|
-
* When looking for a "cheapest path", this enum specifies whether we want
|
34
|
-
* cheapest startup cost or cheapest total cost.
|
35
|
-
*/
|
36
|
-
typedef enum CostSelector
|
37
|
-
{
|
38
|
-
STARTUP_COST, TOTAL_COST
|
39
|
-
} CostSelector;
|
40
|
-
|
41
|
-
/*
|
42
|
-
* The cost estimate produced by cost_qual_eval() includes both a one-time
|
43
|
-
* (startup) cost, and a per-tuple cost.
|
44
|
-
*/
|
45
|
-
typedef struct QualCost
|
46
|
-
{
|
47
|
-
Cost startup; /* one-time cost */
|
48
|
-
Cost per_tuple; /* per-evaluation cost */
|
49
|
-
} QualCost;
|
50
|
-
|
51
|
-
/*
|
52
|
-
* Costing aggregate function execution requires these statistics about
|
53
|
-
* the aggregates to be executed by a given Agg node. Note that the costs
|
54
|
-
* include the execution costs of the aggregates' argument expressions as
|
55
|
-
* well as the aggregate functions themselves. Also, the fields must be
|
56
|
-
* defined so that initializing the struct to zeroes with memset is correct.
|
57
|
-
*/
|
58
|
-
typedef struct AggClauseCosts
|
59
|
-
{
|
60
|
-
QualCost transCost; /* total per-input-row execution costs */
|
61
|
-
QualCost finalCost; /* total per-aggregated-row costs */
|
62
|
-
Size transitionSpace; /* space for pass-by-ref transition data */
|
63
|
-
} AggClauseCosts;
|
64
|
-
|
65
|
-
/*
|
66
|
-
* This enum identifies the different types of "upper" (post-scan/join)
|
67
|
-
* relations that we might deal with during planning.
|
68
|
-
*/
|
69
|
-
typedef enum UpperRelationKind
|
70
|
-
{
|
71
|
-
UPPERREL_SETOP, /* result of UNION/INTERSECT/EXCEPT, if any */
|
72
|
-
UPPERREL_PARTIAL_GROUP_AGG, /* result of partial grouping/aggregation, if
|
73
|
-
* any */
|
74
|
-
UPPERREL_GROUP_AGG, /* result of grouping/aggregation, if any */
|
75
|
-
UPPERREL_WINDOW, /* result of window functions, if any */
|
76
|
-
UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */
|
77
|
-
UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */
|
78
|
-
UPPERREL_ORDERED, /* result of ORDER BY, if any */
|
79
|
-
UPPERREL_FINAL /* result of any remaining top-level actions */
|
80
|
-
/* NB: UPPERREL_FINAL must be last enum entry; it's used to size arrays */
|
81
|
-
} UpperRelationKind;
|
82
|
-
|
83
|
-
/*----------
|
84
|
-
* PlannerGlobal
|
85
|
-
* Global information for planning/optimization
|
86
|
-
*
|
87
|
-
* PlannerGlobal holds state for an entire planner invocation; this state
|
88
|
-
* is shared across all levels of sub-Queries that exist in the command being
|
89
|
-
* planned.
|
90
|
-
*
|
91
|
-
* Not all fields are printed. (In some cases, there is no print support for
|
92
|
-
* the field type; in others, doing so would lead to infinite recursion.)
|
93
|
-
*----------
|
94
|
-
*/
|
95
|
-
typedef struct PlannerGlobal
|
96
|
-
{
|
97
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
98
|
-
|
99
|
-
NodeTag type;
|
100
|
-
|
101
|
-
/* Param values provided to planner() */
|
102
|
-
ParamListInfo boundParams pg_node_attr(read_write_ignore);
|
103
|
-
|
104
|
-
/* Plans for SubPlan nodes */
|
105
|
-
List *subplans;
|
106
|
-
|
107
|
-
/* PlannerInfos for SubPlan nodes */
|
108
|
-
List *subroots pg_node_attr(read_write_ignore);
|
109
|
-
|
110
|
-
/* indices of subplans that require REWIND */
|
111
|
-
Bitmapset *rewindPlanIDs;
|
112
|
-
|
113
|
-
/* "flat" rangetable for executor */
|
114
|
-
List *finalrtable;
|
115
|
-
|
116
|
-
/* "flat" list of RTEPermissionInfos */
|
117
|
-
List *finalrteperminfos;
|
118
|
-
|
119
|
-
/* "flat" list of PlanRowMarks */
|
120
|
-
List *finalrowmarks;
|
121
|
-
|
122
|
-
/* "flat" list of integer RT indexes */
|
123
|
-
List *resultRelations;
|
124
|
-
|
125
|
-
/* "flat" list of AppendRelInfos */
|
126
|
-
List *appendRelations;
|
127
|
-
|
128
|
-
/* OIDs of relations the plan depends on */
|
129
|
-
List *relationOids;
|
130
|
-
|
131
|
-
/* other dependencies, as PlanInvalItems */
|
132
|
-
List *invalItems;
|
133
|
-
|
134
|
-
/* type OIDs for PARAM_EXEC Params */
|
135
|
-
List *paramExecTypes;
|
136
|
-
|
137
|
-
/* highest PlaceHolderVar ID assigned */
|
138
|
-
Index lastPHId;
|
139
|
-
|
140
|
-
/* highest PlanRowMark ID assigned */
|
141
|
-
Index lastRowMarkId;
|
142
|
-
|
143
|
-
/* highest plan node ID assigned */
|
144
|
-
int lastPlanNodeId;
|
145
|
-
|
146
|
-
/* redo plan when TransactionXmin changes? */
|
147
|
-
bool transientPlan;
|
148
|
-
|
149
|
-
/* is plan specific to current role? */
|
150
|
-
bool dependsOnRole;
|
151
|
-
|
152
|
-
/* parallel mode potentially OK? */
|
153
|
-
bool parallelModeOK;
|
154
|
-
|
155
|
-
/* parallel mode actually required? */
|
156
|
-
bool parallelModeNeeded;
|
157
|
-
|
158
|
-
/* worst PROPARALLEL hazard level */
|
159
|
-
char maxParallelHazard;
|
160
|
-
|
161
|
-
/* partition descriptors */
|
162
|
-
PartitionDirectory partition_directory pg_node_attr(read_write_ignore);
|
163
|
-
} PlannerGlobal;
|
164
|
-
|
165
|
-
/* macro for fetching the Plan associated with a SubPlan node */
|
166
|
-
#define planner_subplan_get_plan(root, subplan) \
|
167
|
-
((Plan *) list_nth((root)->glob->subplans, (subplan)->plan_id - 1))
|
168
|
-
|
169
|
-
|
170
|
-
/*----------
|
171
|
-
* PlannerInfo
|
172
|
-
* Per-query information for planning/optimization
|
173
|
-
*
|
174
|
-
* This struct is conventionally called "root" in all the planner routines.
|
175
|
-
* It holds links to all of the planner's working state, in addition to the
|
176
|
-
* original Query. Note that at present the planner extensively modifies
|
177
|
-
* the passed-in Query data structure; someday that should stop.
|
178
|
-
*
|
179
|
-
* For reasons explained in optimizer/optimizer.h, we define the typedef
|
180
|
-
* either here or in that header, whichever is read first.
|
181
|
-
*
|
182
|
-
* Not all fields are printed. (In some cases, there is no print support for
|
183
|
-
* the field type; in others, doing so would lead to infinite recursion or
|
184
|
-
* bloat dump output more than seems useful.)
|
185
|
-
*----------
|
186
|
-
*/
|
187
|
-
#ifndef HAVE_PLANNERINFO_TYPEDEF
|
188
|
-
typedef struct PlannerInfo PlannerInfo;
|
189
|
-
#define HAVE_PLANNERINFO_TYPEDEF 1
|
190
|
-
#endif
|
191
|
-
|
192
|
-
struct PlannerInfo
|
193
|
-
{
|
194
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
195
|
-
|
196
|
-
NodeTag type;
|
197
|
-
|
198
|
-
/* the Query being planned */
|
199
|
-
Query *parse;
|
200
|
-
|
201
|
-
/* global info for current planner run */
|
202
|
-
PlannerGlobal *glob;
|
203
|
-
|
204
|
-
/* 1 at the outermost Query */
|
205
|
-
Index query_level;
|
206
|
-
|
207
|
-
/* NULL at outermost Query */
|
208
|
-
PlannerInfo *parent_root pg_node_attr(read_write_ignore);
|
209
|
-
|
210
|
-
/*
|
211
|
-
* plan_params contains the expressions that this query level needs to
|
212
|
-
* make available to a lower query level that is currently being planned.
|
213
|
-
* outer_params contains the paramIds of PARAM_EXEC Params that outer
|
214
|
-
* query levels will make available to this query level.
|
215
|
-
*/
|
216
|
-
/* list of PlannerParamItems, see below */
|
217
|
-
List *plan_params;
|
218
|
-
Bitmapset *outer_params;
|
219
|
-
|
220
|
-
/*
|
221
|
-
* simple_rel_array holds pointers to "base rels" and "other rels" (see
|
222
|
-
* comments for RelOptInfo for more info). It is indexed by rangetable
|
223
|
-
* index (so entry 0 is always wasted). Entries can be NULL when an RTE
|
224
|
-
* does not correspond to a base relation, such as a join RTE or an
|
225
|
-
* unreferenced view RTE; or if the RelOptInfo hasn't been made yet.
|
226
|
-
*/
|
227
|
-
struct RelOptInfo **simple_rel_array pg_node_attr(array_size(simple_rel_array_size));
|
228
|
-
/* allocated size of array */
|
229
|
-
int simple_rel_array_size;
|
230
|
-
|
231
|
-
/*
|
232
|
-
* simple_rte_array is the same length as simple_rel_array and holds
|
233
|
-
* pointers to the associated rangetable entries. Using this is a shade
|
234
|
-
* faster than using rt_fetch(), mostly due to fewer indirections. (Not
|
235
|
-
* printed because it'd be redundant with parse->rtable.)
|
236
|
-
*/
|
237
|
-
RangeTblEntry **simple_rte_array pg_node_attr(read_write_ignore);
|
238
|
-
|
239
|
-
/*
|
240
|
-
* append_rel_array is the same length as the above arrays, and holds
|
241
|
-
* pointers to the corresponding AppendRelInfo entry indexed by
|
242
|
-
* child_relid, or NULL if the rel is not an appendrel child. The array
|
243
|
-
* itself is not allocated if append_rel_list is empty. (Not printed
|
244
|
-
* because it'd be redundant with append_rel_list.)
|
245
|
-
*/
|
246
|
-
struct AppendRelInfo **append_rel_array pg_node_attr(read_write_ignore);
|
247
|
-
|
248
|
-
/*
|
249
|
-
* all_baserels is a Relids set of all base relids (but not joins or
|
250
|
-
* "other" rels) in the query. This is computed in deconstruct_jointree.
|
251
|
-
*/
|
252
|
-
Relids all_baserels;
|
253
|
-
|
254
|
-
/*
|
255
|
-
* outer_join_rels is a Relids set of all outer-join relids in the query.
|
256
|
-
* This is computed in deconstruct_jointree.
|
257
|
-
*/
|
258
|
-
Relids outer_join_rels;
|
259
|
-
|
260
|
-
/*
|
261
|
-
* all_query_rels is a Relids set of all base relids and outer join relids
|
262
|
-
* (but not "other" relids) in the query. This is the Relids identifier
|
263
|
-
* of the final join we need to form. This is computed in
|
264
|
-
* deconstruct_jointree.
|
265
|
-
*/
|
266
|
-
Relids all_query_rels;
|
267
|
-
|
268
|
-
/*
|
269
|
-
* join_rel_list is a list of all join-relation RelOptInfos we have
|
270
|
-
* considered in this planning run. For small problems we just scan the
|
271
|
-
* list to do lookups, but when there are many join relations we build a
|
272
|
-
* hash table for faster lookups. The hash table is present and valid
|
273
|
-
* when join_rel_hash is not NULL. Note that we still maintain the list
|
274
|
-
* even when using the hash table for lookups; this simplifies life for
|
275
|
-
* GEQO.
|
276
|
-
*/
|
277
|
-
List *join_rel_list;
|
278
|
-
struct HTAB *join_rel_hash pg_node_attr(read_write_ignore);
|
279
|
-
|
280
|
-
/*
|
281
|
-
* When doing a dynamic-programming-style join search, join_rel_level[k]
|
282
|
-
* is a list of all join-relation RelOptInfos of level k, and
|
283
|
-
* join_cur_level is the current level. New join-relation RelOptInfos are
|
284
|
-
* automatically added to the join_rel_level[join_cur_level] list.
|
285
|
-
* join_rel_level is NULL if not in use.
|
286
|
-
*
|
287
|
-
* Note: we've already printed all baserel and joinrel RelOptInfos above,
|
288
|
-
* so we don't dump join_rel_level or other lists of RelOptInfos.
|
289
|
-
*/
|
290
|
-
/* lists of join-relation RelOptInfos */
|
291
|
-
List **join_rel_level pg_node_attr(read_write_ignore);
|
292
|
-
/* index of list being extended */
|
293
|
-
int join_cur_level;
|
294
|
-
|
295
|
-
/* init SubPlans for query */
|
296
|
-
List *init_plans;
|
297
|
-
|
298
|
-
/*
|
299
|
-
* per-CTE-item list of subplan IDs (or -1 if no subplan was made for that
|
300
|
-
* CTE)
|
301
|
-
*/
|
302
|
-
List *cte_plan_ids;
|
303
|
-
|
304
|
-
/* List of Lists of Params for MULTIEXPR subquery outputs */
|
305
|
-
List *multiexpr_params;
|
306
|
-
|
307
|
-
/* list of JoinDomains used in the query (higher ones first) */
|
308
|
-
List *join_domains;
|
309
|
-
|
310
|
-
/* list of active EquivalenceClasses */
|
311
|
-
List *eq_classes;
|
312
|
-
|
313
|
-
/* set true once ECs are canonical */
|
314
|
-
bool ec_merging_done;
|
315
|
-
|
316
|
-
/* list of "canonical" PathKeys */
|
317
|
-
List *canon_pathkeys;
|
318
|
-
|
319
|
-
/*
|
320
|
-
* list of OuterJoinClauseInfos for mergejoinable outer join clauses
|
321
|
-
* w/nonnullable var on left
|
322
|
-
*/
|
323
|
-
List *left_join_clauses;
|
324
|
-
|
325
|
-
/*
|
326
|
-
* list of OuterJoinClauseInfos for mergejoinable outer join clauses
|
327
|
-
* w/nonnullable var on right
|
328
|
-
*/
|
329
|
-
List *right_join_clauses;
|
330
|
-
|
331
|
-
/*
|
332
|
-
* list of OuterJoinClauseInfos for mergejoinable full join clauses
|
333
|
-
*/
|
334
|
-
List *full_join_clauses;
|
335
|
-
|
336
|
-
/* list of SpecialJoinInfos */
|
337
|
-
List *join_info_list;
|
338
|
-
|
339
|
-
/* counter for assigning RestrictInfo serial numbers */
|
340
|
-
int last_rinfo_serial;
|
341
|
-
|
342
|
-
/*
|
343
|
-
* all_result_relids is empty for SELECT, otherwise it contains at least
|
344
|
-
* parse->resultRelation. For UPDATE/DELETE/MERGE across an inheritance
|
345
|
-
* or partitioning tree, the result rel's child relids are added. When
|
346
|
-
* using multi-level partitioning, intermediate partitioned rels are
|
347
|
-
* included. leaf_result_relids is similar except that only actual result
|
348
|
-
* tables, not partitioned tables, are included in it.
|
349
|
-
*/
|
350
|
-
/* set of all result relids */
|
351
|
-
Relids all_result_relids;
|
352
|
-
/* set of all leaf relids */
|
353
|
-
Relids leaf_result_relids;
|
354
|
-
|
355
|
-
/*
|
356
|
-
* list of AppendRelInfos
|
357
|
-
*
|
358
|
-
* Note: for AppendRelInfos describing partitions of a partitioned table,
|
359
|
-
* we guarantee that partitions that come earlier in the partitioned
|
360
|
-
* table's PartitionDesc will appear earlier in append_rel_list.
|
361
|
-
*/
|
362
|
-
List *append_rel_list;
|
363
|
-
|
364
|
-
/* list of RowIdentityVarInfos */
|
365
|
-
List *row_identity_vars;
|
366
|
-
|
367
|
-
/* list of PlanRowMarks */
|
368
|
-
List *rowMarks;
|
369
|
-
|
370
|
-
/* list of PlaceHolderInfos */
|
371
|
-
List *placeholder_list;
|
372
|
-
|
373
|
-
/* array of PlaceHolderInfos indexed by phid */
|
374
|
-
struct PlaceHolderInfo **placeholder_array pg_node_attr(read_write_ignore, array_size(placeholder_array_size));
|
375
|
-
/* allocated size of array */
|
376
|
-
int placeholder_array_size pg_node_attr(read_write_ignore);
|
377
|
-
|
378
|
-
/* list of ForeignKeyOptInfos */
|
379
|
-
List *fkey_list;
|
380
|
-
|
381
|
-
/* desired pathkeys for query_planner() */
|
382
|
-
List *query_pathkeys;
|
383
|
-
|
384
|
-
/* groupClause pathkeys, if any */
|
385
|
-
List *group_pathkeys;
|
386
|
-
|
387
|
-
/*
|
388
|
-
* The number of elements in the group_pathkeys list which belong to the
|
389
|
-
* GROUP BY clause. Additional ones belong to ORDER BY / DISTINCT
|
390
|
-
* aggregates.
|
391
|
-
*/
|
392
|
-
int num_groupby_pathkeys;
|
393
|
-
|
394
|
-
/* pathkeys of bottom window, if any */
|
395
|
-
List *window_pathkeys;
|
396
|
-
/* distinctClause pathkeys, if any */
|
397
|
-
List *distinct_pathkeys;
|
398
|
-
/* sortClause pathkeys, if any */
|
399
|
-
List *sort_pathkeys;
|
400
|
-
|
401
|
-
/* Canonicalised partition schemes used in the query. */
|
402
|
-
List *part_schemes pg_node_attr(read_write_ignore);
|
403
|
-
|
404
|
-
/* RelOptInfos we are now trying to join */
|
405
|
-
List *initial_rels pg_node_attr(read_write_ignore);
|
406
|
-
|
407
|
-
/*
|
408
|
-
* Upper-rel RelOptInfos. Use fetch_upper_rel() to get any particular
|
409
|
-
* upper rel.
|
410
|
-
*/
|
411
|
-
List *upper_rels[UPPERREL_FINAL + 1] pg_node_attr(read_write_ignore);
|
412
|
-
|
413
|
-
/* Result tlists chosen by grouping_planner for upper-stage processing */
|
414
|
-
struct PathTarget *upper_targets[UPPERREL_FINAL + 1] pg_node_attr(read_write_ignore);
|
415
|
-
|
416
|
-
/*
|
417
|
-
* The fully-processed groupClause is kept here. It differs from
|
418
|
-
* parse->groupClause in that we remove any items that we can prove
|
419
|
-
* redundant, so that only the columns named here actually need to be
|
420
|
-
* compared to determine grouping. Note that it's possible for *all* the
|
421
|
-
* items to be proven redundant, implying that there is only one group
|
422
|
-
* containing all the query's rows. Hence, if you want to check whether
|
423
|
-
* GROUP BY was specified, test for nonempty parse->groupClause, not for
|
424
|
-
* nonempty processed_groupClause.
|
425
|
-
*
|
426
|
-
* Currently, when grouping sets are specified we do not attempt to
|
427
|
-
* optimize the groupClause, so that processed_groupClause will be
|
428
|
-
* identical to parse->groupClause.
|
429
|
-
*/
|
430
|
-
List *processed_groupClause;
|
431
|
-
|
432
|
-
/*
|
433
|
-
* The fully-processed distinctClause is kept here. It differs from
|
434
|
-
* parse->distinctClause in that we remove any items that we can prove
|
435
|
-
* redundant, so that only the columns named here actually need to be
|
436
|
-
* compared to determine uniqueness. Note that it's possible for *all*
|
437
|
-
* the items to be proven redundant, implying that there should be only
|
438
|
-
* one output row. Hence, if you want to check whether DISTINCT was
|
439
|
-
* specified, test for nonempty parse->distinctClause, not for nonempty
|
440
|
-
* processed_distinctClause.
|
441
|
-
*/
|
442
|
-
List *processed_distinctClause;
|
443
|
-
|
444
|
-
/*
|
445
|
-
* The fully-processed targetlist is kept here. It differs from
|
446
|
-
* parse->targetList in that (for INSERT) it's been reordered to match the
|
447
|
-
* target table, and defaults have been filled in. Also, additional
|
448
|
-
* resjunk targets may be present. preprocess_targetlist() does most of
|
449
|
-
* that work, but note that more resjunk targets can get added during
|
450
|
-
* appendrel expansion. (Hence, upper_targets mustn't get set up till
|
451
|
-
* after that.)
|
452
|
-
*/
|
453
|
-
List *processed_tlist;
|
454
|
-
|
455
|
-
/*
|
456
|
-
* For UPDATE, this list contains the target table's attribute numbers to
|
457
|
-
* which the first N entries of processed_tlist are to be assigned. (Any
|
458
|
-
* additional entries in processed_tlist must be resjunk.) DO NOT use the
|
459
|
-
* resnos in processed_tlist to identify the UPDATE target columns.
|
460
|
-
*/
|
461
|
-
List *update_colnos;
|
462
|
-
|
463
|
-
/*
|
464
|
-
* Fields filled during create_plan() for use in setrefs.c
|
465
|
-
*/
|
466
|
-
/* for GroupingFunc fixup (can't print: array length not known here) */
|
467
|
-
AttrNumber *grouping_map pg_node_attr(read_write_ignore);
|
468
|
-
/* List of MinMaxAggInfos */
|
469
|
-
List *minmax_aggs;
|
470
|
-
|
471
|
-
/* context holding PlannerInfo */
|
472
|
-
MemoryContext planner_cxt pg_node_attr(read_write_ignore);
|
473
|
-
|
474
|
-
/* # of pages in all non-dummy tables of query */
|
475
|
-
Cardinality total_table_pages;
|
476
|
-
|
477
|
-
/* tuple_fraction passed to query_planner */
|
478
|
-
Selectivity tuple_fraction;
|
479
|
-
/* limit_tuples passed to query_planner */
|
480
|
-
Cardinality limit_tuples;
|
481
|
-
|
482
|
-
/*
|
483
|
-
* Minimum security_level for quals. Note: qual_security_level is zero if
|
484
|
-
* there are no securityQuals.
|
485
|
-
*/
|
486
|
-
Index qual_security_level;
|
487
|
-
|
488
|
-
/* true if any RTEs are RTE_JOIN kind */
|
489
|
-
bool hasJoinRTEs;
|
490
|
-
/* true if any RTEs are marked LATERAL */
|
491
|
-
bool hasLateralRTEs;
|
492
|
-
/* true if havingQual was non-null */
|
493
|
-
bool hasHavingQual;
|
494
|
-
/* true if any RestrictInfo has pseudoconstant = true */
|
495
|
-
bool hasPseudoConstantQuals;
|
496
|
-
/* true if we've made any of those */
|
497
|
-
bool hasAlternativeSubPlans;
|
498
|
-
/* true once we're no longer allowed to add PlaceHolderInfos */
|
499
|
-
bool placeholdersFrozen;
|
500
|
-
/* true if planning a recursive WITH item */
|
501
|
-
bool hasRecursion;
|
502
|
-
|
503
|
-
/*
|
504
|
-
* Information about aggregates. Filled by preprocess_aggrefs().
|
505
|
-
*/
|
506
|
-
/* AggInfo structs */
|
507
|
-
List *agginfos;
|
508
|
-
/* AggTransInfo structs */
|
509
|
-
List *aggtransinfos;
|
510
|
-
/* number of aggs with DISTINCT/ORDER BY/WITHIN GROUP */
|
511
|
-
int numOrderedAggs;
|
512
|
-
/* does any agg not support partial mode? */
|
513
|
-
bool hasNonPartialAggs;
|
514
|
-
/* is any partial agg non-serializable? */
|
515
|
-
bool hasNonSerialAggs;
|
516
|
-
|
517
|
-
/*
|
518
|
-
* These fields are used only when hasRecursion is true:
|
519
|
-
*/
|
520
|
-
/* PARAM_EXEC ID for the work table */
|
521
|
-
int wt_param_id;
|
522
|
-
/* a path for non-recursive term */
|
523
|
-
struct Path *non_recursive_path;
|
524
|
-
|
525
|
-
/*
|
526
|
-
* These fields are workspace for createplan.c
|
527
|
-
*/
|
528
|
-
/* outer rels above current node */
|
529
|
-
Relids curOuterRels;
|
530
|
-
/* not-yet-assigned NestLoopParams */
|
531
|
-
List *curOuterParams;
|
532
|
-
|
533
|
-
/*
|
534
|
-
* These fields are workspace for setrefs.c. Each is an array
|
535
|
-
* corresponding to glob->subplans. (We could probably teach
|
536
|
-
* gen_node_support.pl how to determine the array length, but it doesn't
|
537
|
-
* seem worth the trouble, so just mark them read_write_ignore.)
|
538
|
-
*/
|
539
|
-
bool *isAltSubplan pg_node_attr(read_write_ignore);
|
540
|
-
bool *isUsedSubplan pg_node_attr(read_write_ignore);
|
541
|
-
|
542
|
-
/* optional private data for join_search_hook, e.g., GEQO */
|
543
|
-
void *join_search_private pg_node_attr(read_write_ignore);
|
544
|
-
|
545
|
-
/* Does this query modify any partition key columns? */
|
546
|
-
bool partColsUpdated;
|
547
|
-
};
|
548
|
-
|
549
|
-
|
550
|
-
/*
|
551
|
-
* In places where it's known that simple_rte_array[] must have been prepared
|
552
|
-
* already, we just index into it to fetch RTEs. In code that might be
|
553
|
-
* executed before or after entering query_planner(), use this macro.
|
554
|
-
*/
|
555
|
-
#define planner_rt_fetch(rti, root) \
|
556
|
-
((root)->simple_rte_array ? (root)->simple_rte_array[rti] : \
|
557
|
-
rt_fetch(rti, (root)->parse->rtable))
|
558
|
-
|
559
|
-
/*
|
560
|
-
* If multiple relations are partitioned the same way, all such partitions
|
561
|
-
* will have a pointer to the same PartitionScheme. A list of PartitionScheme
|
562
|
-
* objects is attached to the PlannerInfo. By design, the partition scheme
|
563
|
-
* incorporates only the general properties of the partition method (LIST vs.
|
564
|
-
* RANGE, number of partitioning columns and the type information for each)
|
565
|
-
* and not the specific bounds.
|
566
|
-
*
|
567
|
-
* We store the opclass-declared input data types instead of the partition key
|
568
|
-
* datatypes since the former rather than the latter are used to compare
|
569
|
-
* partition bounds. Since partition key data types and the opclass declared
|
570
|
-
* input data types are expected to be binary compatible (per ResolveOpClass),
|
571
|
-
* both of those should have same byval and length properties.
|
572
|
-
*/
|
573
|
-
typedef struct PartitionSchemeData
|
574
|
-
{
|
575
|
-
char strategy; /* partition strategy */
|
576
|
-
int16 partnatts; /* number of partition attributes */
|
577
|
-
Oid *partopfamily; /* OIDs of operator families */
|
578
|
-
Oid *partopcintype; /* OIDs of opclass declared input data types */
|
579
|
-
Oid *partcollation; /* OIDs of partitioning collations */
|
580
|
-
|
581
|
-
/* Cached information about partition key data types. */
|
582
|
-
int16 *parttyplen;
|
583
|
-
bool *parttypbyval;
|
584
|
-
|
585
|
-
/* Cached information about partition comparison functions. */
|
586
|
-
struct FmgrInfo *partsupfunc;
|
587
|
-
} PartitionSchemeData;
|
588
|
-
|
589
|
-
typedef struct PartitionSchemeData *PartitionScheme;
|
590
|
-
|
591
|
-
/*----------
|
592
|
-
* RelOptInfo
|
593
|
-
* Per-relation information for planning/optimization
|
594
|
-
*
|
595
|
-
* For planning purposes, a "base rel" is either a plain relation (a table)
|
596
|
-
* or the output of a sub-SELECT or function that appears in the range table.
|
597
|
-
* In either case it is uniquely identified by an RT index. A "joinrel"
|
598
|
-
* is the joining of two or more base rels. A joinrel is identified by
|
599
|
-
* the set of RT indexes for its component baserels, along with RT indexes
|
600
|
-
* for any outer joins it has computed. We create RelOptInfo nodes for each
|
601
|
-
* baserel and joinrel, and store them in the PlannerInfo's simple_rel_array
|
602
|
-
* and join_rel_list respectively.
|
603
|
-
*
|
604
|
-
* Note that there is only one joinrel for any given set of component
|
605
|
-
* baserels, no matter what order we assemble them in; so an unordered
|
606
|
-
* set is the right datatype to identify it with.
|
607
|
-
*
|
608
|
-
* We also have "other rels", which are like base rels in that they refer to
|
609
|
-
* single RT indexes; but they are not part of the join tree, and are given
|
610
|
-
* a different RelOptKind to identify them.
|
611
|
-
* Currently the only kind of otherrels are those made for member relations
|
612
|
-
* of an "append relation", that is an inheritance set or UNION ALL subquery.
|
613
|
-
* An append relation has a parent RTE that is a base rel, which represents
|
614
|
-
* the entire append relation. The member RTEs are otherrels. The parent
|
615
|
-
* is present in the query join tree but the members are not. The member
|
616
|
-
* RTEs and otherrels are used to plan the scans of the individual tables or
|
617
|
-
* subqueries of the append set; then the parent baserel is given Append
|
618
|
-
* and/or MergeAppend paths comprising the best paths for the individual
|
619
|
-
* member rels. (See comments for AppendRelInfo for more information.)
|
620
|
-
*
|
621
|
-
* At one time we also made otherrels to represent join RTEs, for use in
|
622
|
-
* handling join alias Vars. Currently this is not needed because all join
|
623
|
-
* alias Vars are expanded to non-aliased form during preprocess_expression.
|
624
|
-
*
|
625
|
-
* We also have relations representing joins between child relations of
|
626
|
-
* different partitioned tables. These relations are not added to
|
627
|
-
* join_rel_level lists as they are not joined directly by the dynamic
|
628
|
-
* programming algorithm.
|
629
|
-
*
|
630
|
-
* There is also a RelOptKind for "upper" relations, which are RelOptInfos
|
631
|
-
* that describe post-scan/join processing steps, such as aggregation.
|
632
|
-
* Many of the fields in these RelOptInfos are meaningless, but their Path
|
633
|
-
* fields always hold Paths showing ways to do that processing step.
|
634
|
-
*
|
635
|
-
* Parts of this data structure are specific to various scan and join
|
636
|
-
* mechanisms. It didn't seem worth creating new node types for them.
|
637
|
-
*
|
638
|
-
* relids - Set of relation identifiers (RT indexes). This is a base
|
639
|
-
* relation if there is just one, a join relation if more;
|
640
|
-
* in the join case, RT indexes of any outer joins formed
|
641
|
-
* at or below this join are included along with baserels
|
642
|
-
* rows - estimated number of tuples in the relation after restriction
|
643
|
-
* clauses have been applied (ie, output rows of a plan for it)
|
644
|
-
* consider_startup - true if there is any value in keeping plain paths for
|
645
|
-
* this rel on the basis of having cheap startup cost
|
646
|
-
* consider_param_startup - the same for parameterized paths
|
647
|
-
* reltarget - Default Path output tlist for this rel; normally contains
|
648
|
-
* Var and PlaceHolderVar nodes for the values we need to
|
649
|
-
* output from this relation.
|
650
|
-
* List is in no particular order, but all rels of an
|
651
|
-
* appendrel set must use corresponding orders.
|
652
|
-
* NOTE: in an appendrel child relation, may contain
|
653
|
-
* arbitrary expressions pulled up from a subquery!
|
654
|
-
* pathlist - List of Path nodes, one for each potentially useful
|
655
|
-
* method of generating the relation
|
656
|
-
* ppilist - ParamPathInfo nodes for parameterized Paths, if any
|
657
|
-
* cheapest_startup_path - the pathlist member with lowest startup cost
|
658
|
-
* (regardless of ordering) among the unparameterized paths;
|
659
|
-
* or NULL if there is no unparameterized path
|
660
|
-
* cheapest_total_path - the pathlist member with lowest total cost
|
661
|
-
* (regardless of ordering) among the unparameterized paths;
|
662
|
-
* or if there is no unparameterized path, the path with lowest
|
663
|
-
* total cost among the paths with minimum parameterization
|
664
|
-
* cheapest_unique_path - for caching cheapest path to produce unique
|
665
|
-
* (no duplicates) output from relation; NULL if not yet requested
|
666
|
-
* cheapest_parameterized_paths - best paths for their parameterizations;
|
667
|
-
* always includes cheapest_total_path, even if that's unparameterized
|
668
|
-
* direct_lateral_relids - rels this rel has direct LATERAL references to
|
669
|
-
* lateral_relids - required outer rels for LATERAL, as a Relids set
|
670
|
-
* (includes both direct and indirect lateral references)
|
671
|
-
*
|
672
|
-
* If the relation is a base relation it will have these fields set:
|
673
|
-
*
|
674
|
-
* relid - RTE index (this is redundant with the relids field, but
|
675
|
-
* is provided for convenience of access)
|
676
|
-
* rtekind - copy of RTE's rtekind field
|
677
|
-
* min_attr, max_attr - range of valid AttrNumbers for rel
|
678
|
-
* attr_needed - array of bitmapsets indicating the highest joinrel
|
679
|
-
* in which each attribute is needed; if bit 0 is set then
|
680
|
-
* the attribute is needed as part of final targetlist
|
681
|
-
* attr_widths - cache space for per-attribute width estimates;
|
682
|
-
* zero means not computed yet
|
683
|
-
* nulling_relids - relids of outer joins that can null this rel
|
684
|
-
* lateral_vars - lateral cross-references of rel, if any (list of
|
685
|
-
* Vars and PlaceHolderVars)
|
686
|
-
* lateral_referencers - relids of rels that reference this one laterally
|
687
|
-
* (includes both direct and indirect lateral references)
|
688
|
-
* indexlist - list of IndexOptInfo nodes for relation's indexes
|
689
|
-
* (always NIL if it's not a table or partitioned table)
|
690
|
-
* pages - number of disk pages in relation (zero if not a table)
|
691
|
-
* tuples - number of tuples in relation (not considering restrictions)
|
692
|
-
* allvisfrac - fraction of disk pages that are marked all-visible
|
693
|
-
* eclass_indexes - EquivalenceClasses that mention this rel (filled
|
694
|
-
* only after EC merging is complete)
|
695
|
-
* subroot - PlannerInfo for subquery (NULL if it's not a subquery)
|
696
|
-
* subplan_params - list of PlannerParamItems to be passed to subquery
|
697
|
-
*
|
698
|
-
* Note: for a subquery, tuples and subroot are not set immediately
|
699
|
-
* upon creation of the RelOptInfo object; they are filled in when
|
700
|
-
* set_subquery_pathlist processes the object.
|
701
|
-
*
|
702
|
-
* For otherrels that are appendrel members, these fields are filled
|
703
|
-
* in just as for a baserel, except we don't bother with lateral_vars.
|
704
|
-
*
|
705
|
-
* If the relation is either a foreign table or a join of foreign tables that
|
706
|
-
* all belong to the same foreign server and are assigned to the same user to
|
707
|
-
* check access permissions as (cf checkAsUser), these fields will be set:
|
708
|
-
*
|
709
|
-
* serverid - OID of foreign server, if foreign table (else InvalidOid)
|
710
|
-
* userid - OID of user to check access as (InvalidOid means current user)
|
711
|
-
* useridiscurrent - we've assumed that userid equals current user
|
712
|
-
* fdwroutine - function hooks for FDW, if foreign table (else NULL)
|
713
|
-
* fdw_private - private state for FDW, if foreign table (else NULL)
|
714
|
-
*
|
715
|
-
* Two fields are used to cache knowledge acquired during the join search
|
716
|
-
* about whether this rel is provably unique when being joined to given other
|
717
|
-
* relation(s), ie, it can have at most one row matching any given row from
|
718
|
-
* that join relation. Currently we only attempt such proofs, and thus only
|
719
|
-
* populate these fields, for base rels; but someday they might be used for
|
720
|
-
* join rels too:
|
721
|
-
*
|
722
|
-
* unique_for_rels - list of Relid sets, each one being a set of other
|
723
|
-
* rels for which this one has been proven unique
|
724
|
-
* non_unique_for_rels - list of Relid sets, each one being a set of
|
725
|
-
* other rels for which we have tried and failed to prove
|
726
|
-
* this one unique
|
727
|
-
*
|
728
|
-
* The presence of the following fields depends on the restrictions
|
729
|
-
* and joins that the relation participates in:
|
730
|
-
*
|
731
|
-
* baserestrictinfo - List of RestrictInfo nodes, containing info about
|
732
|
-
* each non-join qualification clause in which this relation
|
733
|
-
* participates (only used for base rels)
|
734
|
-
* baserestrictcost - Estimated cost of evaluating the baserestrictinfo
|
735
|
-
* clauses at a single tuple (only used for base rels)
|
736
|
-
* baserestrict_min_security - Smallest security_level found among
|
737
|
-
* clauses in baserestrictinfo
|
738
|
-
* joininfo - List of RestrictInfo nodes, containing info about each
|
739
|
-
* join clause in which this relation participates (but
|
740
|
-
* note this excludes clauses that might be derivable from
|
741
|
-
* EquivalenceClasses)
|
742
|
-
* has_eclass_joins - flag that EquivalenceClass joins are possible
|
743
|
-
*
|
744
|
-
* Note: Keeping a restrictinfo list in the RelOptInfo is useful only for
|
745
|
-
* base rels, because for a join rel the set of clauses that are treated as
|
746
|
-
* restrict clauses varies depending on which sub-relations we choose to join.
|
747
|
-
* (For example, in a 3-base-rel join, a clause relating rels 1 and 2 must be
|
748
|
-
* treated as a restrictclause if we join {1} and {2 3} to make {1 2 3}; but
|
749
|
-
* if we join {1 2} and {3} then that clause will be a restrictclause in {1 2}
|
750
|
-
* and should not be processed again at the level of {1 2 3}.) Therefore,
|
751
|
-
* the restrictinfo list in the join case appears in individual JoinPaths
|
752
|
-
* (field joinrestrictinfo), not in the parent relation. But it's OK for
|
753
|
-
* the RelOptInfo to store the joininfo list, because that is the same
|
754
|
-
* for a given rel no matter how we form it.
|
755
|
-
*
|
756
|
-
* We store baserestrictcost in the RelOptInfo (for base relations) because
|
757
|
-
* we know we will need it at least once (to price the sequential scan)
|
758
|
-
* and may need it multiple times to price index scans.
|
759
|
-
*
|
760
|
-
* A join relation is considered to be partitioned if it is formed from a
|
761
|
-
* join of two relations that are partitioned, have matching partitioning
|
762
|
-
* schemes, and are joined on an equijoin of the partitioning columns.
|
763
|
-
* Under those conditions we can consider the join relation to be partitioned
|
764
|
-
* by either relation's partitioning keys, though some care is needed if
|
765
|
-
* either relation can be forced to null by outer-joining. For example, an
|
766
|
-
* outer join like (A LEFT JOIN B ON A.a = B.b) may produce rows with B.b
|
767
|
-
* NULL. These rows may not fit the partitioning conditions imposed on B.
|
768
|
-
* Hence, strictly speaking, the join is not partitioned by B.b and thus
|
769
|
-
* partition keys of an outer join should include partition key expressions
|
770
|
-
* from the non-nullable side only. However, if a subsequent join uses
|
771
|
-
* strict comparison operators (and all commonly-used equijoin operators are
|
772
|
-
* strict), the presence of nulls doesn't cause a problem: such rows couldn't
|
773
|
-
* match anything on the other side and thus they don't create a need to do
|
774
|
-
* any cross-partition sub-joins. Hence we can treat such values as still
|
775
|
-
* partitioning the join output for the purpose of additional partitionwise
|
776
|
-
* joining, so long as a strict join operator is used by the next join.
|
777
|
-
*
|
778
|
-
* If the relation is partitioned, these fields will be set:
|
779
|
-
*
|
780
|
-
* part_scheme - Partitioning scheme of the relation
|
781
|
-
* nparts - Number of partitions
|
782
|
-
* boundinfo - Partition bounds
|
783
|
-
* partbounds_merged - true if partition bounds are merged ones
|
784
|
-
* partition_qual - Partition constraint if not the root
|
785
|
-
* part_rels - RelOptInfos for each partition
|
786
|
-
* all_partrels - Relids set of all partition relids
|
787
|
-
* partexprs, nullable_partexprs - Partition key expressions
|
788
|
-
*
|
789
|
-
* The partexprs and nullable_partexprs arrays each contain
|
790
|
-
* part_scheme->partnatts elements. Each of the elements is a list of
|
791
|
-
* partition key expressions. For partitioned base relations, there is one
|
792
|
-
* expression in each partexprs element, and nullable_partexprs is empty.
|
793
|
-
* For partitioned join relations, each base relation within the join
|
794
|
-
* contributes one partition key expression per partitioning column;
|
795
|
-
* that expression goes in the partexprs[i] list if the base relation
|
796
|
-
* is not nullable by this join or any lower outer join, or in the
|
797
|
-
* nullable_partexprs[i] list if the base relation is nullable.
|
798
|
-
* Furthermore, FULL JOINs add extra nullable_partexprs expressions
|
799
|
-
* corresponding to COALESCE expressions of the left and right join columns,
|
800
|
-
* to simplify matching join clauses to those lists.
|
801
|
-
*
|
802
|
-
* Not all fields are printed. (In some cases, there is no print support for
|
803
|
-
* the field type.)
|
804
|
-
*----------
|
805
|
-
*/
|
806
|
-
|
807
|
-
/* Bitmask of flags supported by table AMs */
|
808
|
-
#define AMFLAG_HAS_TID_RANGE (1 << 0)
|
809
|
-
|
810
|
-
typedef enum RelOptKind
|
811
|
-
{
|
812
|
-
RELOPT_BASEREL,
|
813
|
-
RELOPT_JOINREL,
|
814
|
-
RELOPT_OTHER_MEMBER_REL,
|
815
|
-
RELOPT_OTHER_JOINREL,
|
816
|
-
RELOPT_UPPER_REL,
|
817
|
-
RELOPT_OTHER_UPPER_REL
|
818
|
-
} RelOptKind;
|
819
|
-
|
820
|
-
/*
|
821
|
-
* Is the given relation a simple relation i.e a base or "other" member
|
822
|
-
* relation?
|
823
|
-
*/
|
824
|
-
#define IS_SIMPLE_REL(rel) \
|
825
|
-
((rel)->reloptkind == RELOPT_BASEREL || \
|
826
|
-
(rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)
|
827
|
-
|
828
|
-
/* Is the given relation a join relation? */
|
829
|
-
#define IS_JOIN_REL(rel) \
|
830
|
-
((rel)->reloptkind == RELOPT_JOINREL || \
|
831
|
-
(rel)->reloptkind == RELOPT_OTHER_JOINREL)
|
832
|
-
|
833
|
-
/* Is the given relation an upper relation? */
|
834
|
-
#define IS_UPPER_REL(rel) \
|
835
|
-
((rel)->reloptkind == RELOPT_UPPER_REL || \
|
836
|
-
(rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
|
837
|
-
|
838
|
-
/* Is the given relation an "other" relation? */
|
839
|
-
#define IS_OTHER_REL(rel) \
|
840
|
-
((rel)->reloptkind == RELOPT_OTHER_MEMBER_REL || \
|
841
|
-
(rel)->reloptkind == RELOPT_OTHER_JOINREL || \
|
842
|
-
(rel)->reloptkind == RELOPT_OTHER_UPPER_REL)
|
843
|
-
|
844
|
-
typedef struct RelOptInfo
|
845
|
-
{
|
846
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
847
|
-
|
848
|
-
NodeTag type;
|
849
|
-
|
850
|
-
RelOptKind reloptkind;
|
851
|
-
|
852
|
-
/*
|
853
|
-
* all relations included in this RelOptInfo; set of base + OJ relids
|
854
|
-
* (rangetable indexes)
|
855
|
-
*/
|
856
|
-
Relids relids;
|
857
|
-
|
858
|
-
/*
|
859
|
-
* size estimates generated by planner
|
860
|
-
*/
|
861
|
-
/* estimated number of result tuples */
|
862
|
-
Cardinality rows;
|
863
|
-
|
864
|
-
/*
|
865
|
-
* per-relation planner control flags
|
866
|
-
*/
|
867
|
-
/* keep cheap-startup-cost paths? */
|
868
|
-
bool consider_startup;
|
869
|
-
/* ditto, for parameterized paths? */
|
870
|
-
bool consider_param_startup;
|
871
|
-
/* consider parallel paths? */
|
872
|
-
bool consider_parallel;
|
873
|
-
|
874
|
-
/*
|
875
|
-
* default result targetlist for Paths scanning this relation; list of
|
876
|
-
* Vars/Exprs, cost, width
|
877
|
-
*/
|
878
|
-
struct PathTarget *reltarget;
|
879
|
-
|
880
|
-
/*
|
881
|
-
* materialization information
|
882
|
-
*/
|
883
|
-
List *pathlist; /* Path structures */
|
884
|
-
List *ppilist; /* ParamPathInfos used in pathlist */
|
885
|
-
List *partial_pathlist; /* partial Paths */
|
886
|
-
struct Path *cheapest_startup_path;
|
887
|
-
struct Path *cheapest_total_path;
|
888
|
-
struct Path *cheapest_unique_path;
|
889
|
-
List *cheapest_parameterized_paths;
|
890
|
-
|
891
|
-
/*
|
892
|
-
* parameterization information needed for both base rels and join rels
|
893
|
-
* (see also lateral_vars and lateral_referencers)
|
894
|
-
*/
|
895
|
-
/* rels directly laterally referenced */
|
896
|
-
Relids direct_lateral_relids;
|
897
|
-
/* minimum parameterization of rel */
|
898
|
-
Relids lateral_relids;
|
899
|
-
|
900
|
-
/*
|
901
|
-
* information about a base rel (not set for join rels!)
|
902
|
-
*/
|
903
|
-
Index relid;
|
904
|
-
/* containing tablespace */
|
905
|
-
Oid reltablespace;
|
906
|
-
/* RELATION, SUBQUERY, FUNCTION, etc */
|
907
|
-
RTEKind rtekind;
|
908
|
-
/* smallest attrno of rel (often <0) */
|
909
|
-
AttrNumber min_attr;
|
910
|
-
/* largest attrno of rel */
|
911
|
-
AttrNumber max_attr;
|
912
|
-
/* array indexed [min_attr .. max_attr] */
|
913
|
-
Relids *attr_needed pg_node_attr(read_write_ignore);
|
914
|
-
/* array indexed [min_attr .. max_attr] */
|
915
|
-
int32 *attr_widths pg_node_attr(read_write_ignore);
|
916
|
-
/* relids of outer joins that can null this baserel */
|
917
|
-
Relids nulling_relids;
|
918
|
-
/* LATERAL Vars and PHVs referenced by rel */
|
919
|
-
List *lateral_vars;
|
920
|
-
/* rels that reference this baserel laterally */
|
921
|
-
Relids lateral_referencers;
|
922
|
-
/* list of IndexOptInfo */
|
923
|
-
List *indexlist;
|
924
|
-
/* list of StatisticExtInfo */
|
925
|
-
List *statlist;
|
926
|
-
/* size estimates derived from pg_class */
|
927
|
-
BlockNumber pages;
|
928
|
-
Cardinality tuples;
|
929
|
-
double allvisfrac;
|
930
|
-
/* indexes in PlannerInfo's eq_classes list of ECs that mention this rel */
|
931
|
-
Bitmapset *eclass_indexes;
|
932
|
-
PlannerInfo *subroot; /* if subquery */
|
933
|
-
List *subplan_params; /* if subquery */
|
934
|
-
/* wanted number of parallel workers */
|
935
|
-
int rel_parallel_workers;
|
936
|
-
/* Bitmask of optional features supported by the table AM */
|
937
|
-
uint32 amflags;
|
938
|
-
|
939
|
-
/*
|
940
|
-
* Information about foreign tables and foreign joins
|
941
|
-
*/
|
942
|
-
/* identifies server for the table or join */
|
943
|
-
Oid serverid;
|
944
|
-
/* identifies user to check access as; 0 means to check as current user */
|
945
|
-
Oid userid;
|
946
|
-
/* join is only valid for current user */
|
947
|
-
bool useridiscurrent;
|
948
|
-
/* use "struct FdwRoutine" to avoid including fdwapi.h here */
|
949
|
-
struct FdwRoutine *fdwroutine pg_node_attr(read_write_ignore);
|
950
|
-
void *fdw_private pg_node_attr(read_write_ignore);
|
951
|
-
|
952
|
-
/*
|
953
|
-
* cache space for remembering if we have proven this relation unique
|
954
|
-
*/
|
955
|
-
/* known unique for these other relid set(s) */
|
956
|
-
List *unique_for_rels;
|
957
|
-
/* known not unique for these set(s) */
|
958
|
-
List *non_unique_for_rels;
|
959
|
-
|
960
|
-
/*
|
961
|
-
* used by various scans and joins:
|
962
|
-
*/
|
963
|
-
/* RestrictInfo structures (if base rel) */
|
964
|
-
List *baserestrictinfo;
|
965
|
-
/* cost of evaluating the above */
|
966
|
-
QualCost baserestrictcost;
|
967
|
-
/* min security_level found in baserestrictinfo */
|
968
|
-
Index baserestrict_min_security;
|
969
|
-
/* RestrictInfo structures for join clauses involving this rel */
|
970
|
-
List *joininfo;
|
971
|
-
/* T means joininfo is incomplete */
|
972
|
-
bool has_eclass_joins;
|
973
|
-
|
974
|
-
/*
|
975
|
-
* used by partitionwise joins:
|
976
|
-
*/
|
977
|
-
/* consider partitionwise join paths? (if partitioned rel) */
|
978
|
-
bool consider_partitionwise_join;
|
979
|
-
|
980
|
-
/*
|
981
|
-
* inheritance links, if this is an otherrel (otherwise NULL):
|
982
|
-
*/
|
983
|
-
/* Immediate parent relation (dumping it would be too verbose) */
|
984
|
-
struct RelOptInfo *parent pg_node_attr(read_write_ignore);
|
985
|
-
/* Topmost parent relation (dumping it would be too verbose) */
|
986
|
-
struct RelOptInfo *top_parent pg_node_attr(read_write_ignore);
|
987
|
-
/* Relids of topmost parent (redundant, but handy) */
|
988
|
-
Relids top_parent_relids;
|
989
|
-
|
990
|
-
/*
|
991
|
-
* used for partitioned relations:
|
992
|
-
*/
|
993
|
-
/* Partitioning scheme */
|
994
|
-
PartitionScheme part_scheme pg_node_attr(read_write_ignore);
|
995
|
-
|
996
|
-
/*
|
997
|
-
* Number of partitions; -1 if not yet set; in case of a join relation 0
|
998
|
-
* means it's considered unpartitioned
|
999
|
-
*/
|
1000
|
-
int nparts;
|
1001
|
-
/* Partition bounds */
|
1002
|
-
struct PartitionBoundInfoData *boundinfo pg_node_attr(read_write_ignore);
|
1003
|
-
/* True if partition bounds were created by partition_bounds_merge() */
|
1004
|
-
bool partbounds_merged;
|
1005
|
-
/* Partition constraint, if not the root */
|
1006
|
-
List *partition_qual;
|
1007
|
-
|
1008
|
-
/*
|
1009
|
-
* Array of RelOptInfos of partitions, stored in the same order as bounds
|
1010
|
-
* (don't print, too bulky and duplicative)
|
1011
|
-
*/
|
1012
|
-
struct RelOptInfo **part_rels pg_node_attr(read_write_ignore);
|
1013
|
-
|
1014
|
-
/*
|
1015
|
-
* Bitmap with members acting as indexes into the part_rels[] array to
|
1016
|
-
* indicate which partitions survived partition pruning.
|
1017
|
-
*/
|
1018
|
-
Bitmapset *live_parts;
|
1019
|
-
/* Relids set of all partition relids */
|
1020
|
-
Relids all_partrels;
|
1021
|
-
|
1022
|
-
/*
|
1023
|
-
* These arrays are of length partkey->partnatts, which we don't have at
|
1024
|
-
* hand, so don't try to print
|
1025
|
-
*/
|
1026
|
-
|
1027
|
-
/* Non-nullable partition key expressions */
|
1028
|
-
List **partexprs pg_node_attr(read_write_ignore);
|
1029
|
-
/* Nullable partition key expressions */
|
1030
|
-
List **nullable_partexprs pg_node_attr(read_write_ignore);
|
1031
|
-
} RelOptInfo;
|
1032
|
-
|
1033
|
-
/*
|
1034
|
-
* Is given relation partitioned?
|
1035
|
-
*
|
1036
|
-
* It's not enough to test whether rel->part_scheme is set, because it might
|
1037
|
-
* be that the basic partitioning properties of the input relations matched
|
1038
|
-
* but the partition bounds did not. Also, if we are able to prove a rel
|
1039
|
-
* dummy (empty), we should henceforth treat it as unpartitioned.
|
1040
|
-
*/
|
1041
|
-
#define IS_PARTITIONED_REL(rel) \
|
1042
|
-
((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
|
1043
|
-
(rel)->part_rels && !IS_DUMMY_REL(rel))
|
1044
|
-
|
1045
|
-
/*
|
1046
|
-
* Convenience macro to make sure that a partitioned relation has all the
|
1047
|
-
* required members set.
|
1048
|
-
*/
|
1049
|
-
#define REL_HAS_ALL_PART_PROPS(rel) \
|
1050
|
-
((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
|
1051
|
-
(rel)->part_rels && (rel)->partexprs && (rel)->nullable_partexprs)
|
1052
|
-
|
1053
|
-
/*
|
1054
|
-
* IndexOptInfo
|
1055
|
-
* Per-index information for planning/optimization
|
1056
|
-
*
|
1057
|
-
* indexkeys[], indexcollations[] each have ncolumns entries.
|
1058
|
-
* opfamily[], and opcintype[] each have nkeycolumns entries. They do
|
1059
|
-
* not contain any information about included attributes.
|
1060
|
-
*
|
1061
|
-
* sortopfamily[], reverse_sort[], and nulls_first[] have
|
1062
|
-
* nkeycolumns entries, if the index is ordered; but if it is unordered,
|
1063
|
-
* those pointers are NULL.
|
1064
|
-
*
|
1065
|
-
* Zeroes in the indexkeys[] array indicate index columns that are
|
1066
|
-
* expressions; there is one element in indexprs for each such column.
|
1067
|
-
*
|
1068
|
-
* For an ordered index, reverse_sort[] and nulls_first[] describe the
|
1069
|
-
* sort ordering of a forward indexscan; we can also consider a backward
|
1070
|
-
* indexscan, which will generate the reverse ordering.
|
1071
|
-
*
|
1072
|
-
* The indexprs and indpred expressions have been run through
|
1073
|
-
* prepqual.c and eval_const_expressions() for ease of matching to
|
1074
|
-
* WHERE clauses. indpred is in implicit-AND form.
|
1075
|
-
*
|
1076
|
-
* indextlist is a TargetEntry list representing the index columns.
|
1077
|
-
* It provides an equivalent base-relation Var for each simple column,
|
1078
|
-
* and links to the matching indexprs element for each expression column.
|
1079
|
-
*
|
1080
|
-
* While most of these fields are filled when the IndexOptInfo is created
|
1081
|
-
* (by plancat.c), indrestrictinfo and predOK are set later, in
|
1082
|
-
* check_index_predicates().
|
1083
|
-
*/
|
1084
|
-
#ifndef HAVE_INDEXOPTINFO_TYPEDEF
|
1085
|
-
typedef struct IndexOptInfo IndexOptInfo;
|
1086
|
-
#define HAVE_INDEXOPTINFO_TYPEDEF 1
|
1087
|
-
#endif
|
1088
|
-
|
1089
|
-
struct IndexOptInfo
|
1090
|
-
{
|
1091
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1092
|
-
|
1093
|
-
NodeTag type;
|
1094
|
-
|
1095
|
-
/* OID of the index relation */
|
1096
|
-
Oid indexoid;
|
1097
|
-
/* tablespace of index (not table) */
|
1098
|
-
Oid reltablespace;
|
1099
|
-
/* back-link to index's table; don't print, else infinite recursion */
|
1100
|
-
RelOptInfo *rel pg_node_attr(read_write_ignore);
|
1101
|
-
|
1102
|
-
/*
|
1103
|
-
* index-size statistics (from pg_class and elsewhere)
|
1104
|
-
*/
|
1105
|
-
/* number of disk pages in index */
|
1106
|
-
BlockNumber pages;
|
1107
|
-
/* number of index tuples in index */
|
1108
|
-
Cardinality tuples;
|
1109
|
-
/* index tree height, or -1 if unknown */
|
1110
|
-
int tree_height;
|
1111
|
-
|
1112
|
-
/*
|
1113
|
-
* index descriptor information
|
1114
|
-
*/
|
1115
|
-
/* number of columns in index */
|
1116
|
-
int ncolumns;
|
1117
|
-
/* number of key columns in index */
|
1118
|
-
int nkeycolumns;
|
1119
|
-
|
1120
|
-
/*
|
1121
|
-
* table column numbers of index's columns (both key and included
|
1122
|
-
* columns), or 0 for expression columns
|
1123
|
-
*/
|
1124
|
-
int *indexkeys pg_node_attr(array_size(ncolumns));
|
1125
|
-
/* OIDs of collations of index columns */
|
1126
|
-
Oid *indexcollations pg_node_attr(array_size(nkeycolumns));
|
1127
|
-
/* OIDs of operator families for columns */
|
1128
|
-
Oid *opfamily pg_node_attr(array_size(nkeycolumns));
|
1129
|
-
/* OIDs of opclass declared input data types */
|
1130
|
-
Oid *opcintype pg_node_attr(array_size(nkeycolumns));
|
1131
|
-
/* OIDs of btree opfamilies, if orderable. NULL if partitioned index */
|
1132
|
-
Oid *sortopfamily pg_node_attr(array_size(nkeycolumns));
|
1133
|
-
/* is sort order descending? or NULL if partitioned index */
|
1134
|
-
bool *reverse_sort pg_node_attr(array_size(nkeycolumns));
|
1135
|
-
/* do NULLs come first in the sort order? or NULL if partitioned index */
|
1136
|
-
bool *nulls_first pg_node_attr(array_size(nkeycolumns));
|
1137
|
-
/* opclass-specific options for columns */
|
1138
|
-
bytea **opclassoptions pg_node_attr(read_write_ignore);
|
1139
|
-
/* which index cols can be returned in an index-only scan? */
|
1140
|
-
bool *canreturn pg_node_attr(array_size(ncolumns));
|
1141
|
-
/* OID of the access method (in pg_am) */
|
1142
|
-
Oid relam;
|
1143
|
-
|
1144
|
-
/*
|
1145
|
-
* expressions for non-simple index columns; redundant to print since we
|
1146
|
-
* print indextlist
|
1147
|
-
*/
|
1148
|
-
List *indexprs pg_node_attr(read_write_ignore);
|
1149
|
-
/* predicate if a partial index, else NIL */
|
1150
|
-
List *indpred;
|
1151
|
-
|
1152
|
-
/* targetlist representing index columns */
|
1153
|
-
List *indextlist;
|
1154
|
-
|
1155
|
-
/*
|
1156
|
-
* parent relation's baserestrictinfo list, less any conditions implied by
|
1157
|
-
* the index's predicate (unless it's a target rel, see comments in
|
1158
|
-
* check_index_predicates())
|
1159
|
-
*/
|
1160
|
-
List *indrestrictinfo;
|
1161
|
-
|
1162
|
-
/* true if index predicate matches query */
|
1163
|
-
bool predOK;
|
1164
|
-
/* true if a unique index */
|
1165
|
-
bool unique;
|
1166
|
-
/* is uniqueness enforced immediately? */
|
1167
|
-
bool immediate;
|
1168
|
-
/* true if index doesn't really exist */
|
1169
|
-
bool hypothetical;
|
1170
|
-
|
1171
|
-
/*
|
1172
|
-
* Remaining fields are copied from the index AM's API struct
|
1173
|
-
* (IndexAmRoutine). These fields are not set for partitioned indexes.
|
1174
|
-
*/
|
1175
|
-
bool amcanorderbyop;
|
1176
|
-
bool amoptionalkey;
|
1177
|
-
bool amsearcharray;
|
1178
|
-
bool amsearchnulls;
|
1179
|
-
/* does AM have amgettuple interface? */
|
1180
|
-
bool amhasgettuple;
|
1181
|
-
/* does AM have amgetbitmap interface? */
|
1182
|
-
bool amhasgetbitmap;
|
1183
|
-
bool amcanparallel;
|
1184
|
-
/* does AM have ammarkpos interface? */
|
1185
|
-
bool amcanmarkpos;
|
1186
|
-
/* AM's cost estimator */
|
1187
|
-
/* Rather than include amapi.h here, we declare amcostestimate like this */
|
1188
|
-
void (*amcostestimate) () pg_node_attr(read_write_ignore);
|
1189
|
-
};
|
1190
|
-
|
1191
|
-
/*
|
1192
|
-
* ForeignKeyOptInfo
|
1193
|
-
* Per-foreign-key information for planning/optimization
|
1194
|
-
*
|
1195
|
-
* The per-FK-column arrays can be fixed-size because we allow at most
|
1196
|
-
* INDEX_MAX_KEYS columns in a foreign key constraint. Each array has
|
1197
|
-
* nkeys valid entries.
|
1198
|
-
*/
|
1199
|
-
typedef struct ForeignKeyOptInfo
|
1200
|
-
{
|
1201
|
-
pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
|
1202
|
-
|
1203
|
-
NodeTag type;
|
1204
|
-
|
1205
|
-
/*
|
1206
|
-
* Basic data about the foreign key (fetched from catalogs):
|
1207
|
-
*/
|
1208
|
-
|
1209
|
-
/* RT index of the referencing table */
|
1210
|
-
Index con_relid;
|
1211
|
-
/* RT index of the referenced table */
|
1212
|
-
Index ref_relid;
|
1213
|
-
/* number of columns in the foreign key */
|
1214
|
-
int nkeys;
|
1215
|
-
/* cols in referencing table */
|
1216
|
-
AttrNumber conkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
|
1217
|
-
/* cols in referenced table */
|
1218
|
-
AttrNumber confkey[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
|
1219
|
-
/* PK = FK operator OIDs */
|
1220
|
-
Oid conpfeqop[INDEX_MAX_KEYS] pg_node_attr(array_size(nkeys));
|
1221
|
-
|
1222
|
-
/*
|
1223
|
-
* Derived info about whether FK's equality conditions match the query:
|
1224
|
-
*/
|
1225
|
-
|
1226
|
-
/* # of FK cols matched by ECs */
|
1227
|
-
int nmatched_ec;
|
1228
|
-
/* # of these ECs that are ec_has_const */
|
1229
|
-
int nconst_ec;
|
1230
|
-
/* # of FK cols matched by non-EC rinfos */
|
1231
|
-
int nmatched_rcols;
|
1232
|
-
/* total # of non-EC rinfos matched to FK */
|
1233
|
-
int nmatched_ri;
|
1234
|
-
/* Pointer to eclass matching each column's condition, if there is one */
|
1235
|
-
struct EquivalenceClass *eclass[INDEX_MAX_KEYS];
|
1236
|
-
/* Pointer to eclass member for the referencing Var, if there is one */
|
1237
|
-
struct EquivalenceMember *fk_eclass_member[INDEX_MAX_KEYS];
|
1238
|
-
/* List of non-EC RestrictInfos matching each column's condition */
|
1239
|
-
List *rinfos[INDEX_MAX_KEYS];
|
1240
|
-
} ForeignKeyOptInfo;
|
1241
|
-
|
1242
|
-
/*
|
1243
|
-
* StatisticExtInfo
|
1244
|
-
* Information about extended statistics for planning/optimization
|
1245
|
-
*
|
1246
|
-
* Each pg_statistic_ext row is represented by one or more nodes of this
|
1247
|
-
* type, or even zero if ANALYZE has not computed them.
|
1248
|
-
*/
|
1249
|
-
typedef struct StatisticExtInfo
|
1250
|
-
{
|
1251
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1252
|
-
|
1253
|
-
NodeTag type;
|
1254
|
-
|
1255
|
-
/* OID of the statistics row */
|
1256
|
-
Oid statOid;
|
1257
|
-
|
1258
|
-
/* includes child relations */
|
1259
|
-
bool inherit;
|
1260
|
-
|
1261
|
-
/* back-link to statistic's table; don't print, else infinite recursion */
|
1262
|
-
RelOptInfo *rel pg_node_attr(read_write_ignore);
|
1263
|
-
|
1264
|
-
/* statistics kind of this entry */
|
1265
|
-
char kind;
|
1266
|
-
|
1267
|
-
/* attnums of the columns covered */
|
1268
|
-
Bitmapset *keys;
|
1269
|
-
|
1270
|
-
/* expressions */
|
1271
|
-
List *exprs;
|
1272
|
-
} StatisticExtInfo;
|
1273
|
-
|
1274
|
-
/*
|
1275
|
-
* JoinDomains
|
1276
|
-
*
|
1277
|
-
* A "join domain" defines the scope of applicability of deductions made via
|
1278
|
-
* the EquivalenceClass mechanism. Roughly speaking, a join domain is a set
|
1279
|
-
* of base+OJ relations that are inner-joined together. More precisely, it is
|
1280
|
-
* the set of relations at which equalities deduced from an EquivalenceClass
|
1281
|
-
* can be enforced or should be expected to hold. The topmost JoinDomain
|
1282
|
-
* covers the whole query (so its jd_relids should equal all_query_rels).
|
1283
|
-
* An outer join creates a new JoinDomain that includes all base+OJ relids
|
1284
|
-
* within its nullable side, but (by convention) not the OJ's own relid.
|
1285
|
-
* A FULL join creates two new JoinDomains, one for each side.
|
1286
|
-
*
|
1287
|
-
* Notice that a rel that is below outer join(s) will thus appear to belong
|
1288
|
-
* to multiple join domains. However, any of its Vars that appear in
|
1289
|
-
* EquivalenceClasses belonging to higher join domains will have nullingrel
|
1290
|
-
* bits preventing them from being evaluated at the rel's scan level, so that
|
1291
|
-
* we will not be able to derive enforceable-at-the-rel-scan-level clauses
|
1292
|
-
* from such ECs. We define the join domain relid sets this way so that
|
1293
|
-
* domains can be said to be "higher" or "lower" when one domain relid set
|
1294
|
-
* includes another.
|
1295
|
-
*
|
1296
|
-
* The JoinDomains for a query are computed in deconstruct_jointree.
|
1297
|
-
* We do not copy JoinDomain structs once made, so they can be compared
|
1298
|
-
* for equality by simple pointer equality.
|
1299
|
-
*/
|
1300
|
-
typedef struct JoinDomain
|
1301
|
-
{
|
1302
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1303
|
-
|
1304
|
-
NodeTag type;
|
1305
|
-
|
1306
|
-
Relids jd_relids; /* all relids contained within the domain */
|
1307
|
-
} JoinDomain;
|
1308
|
-
|
1309
|
-
/*
|
1310
|
-
* EquivalenceClasses
|
1311
|
-
*
|
1312
|
-
* Whenever we identify a mergejoinable equality clause A = B that is
|
1313
|
-
* not an outer-join clause, we create an EquivalenceClass containing
|
1314
|
-
* the expressions A and B to record this knowledge. If we later find another
|
1315
|
-
* equivalence B = C, we add C to the existing EquivalenceClass; this may
|
1316
|
-
* require merging two existing EquivalenceClasses. At the end of the qual
|
1317
|
-
* distribution process, we have sets of values that are known all transitively
|
1318
|
-
* equal to each other, where "equal" is according to the rules of the btree
|
1319
|
-
* operator family(s) shown in ec_opfamilies, as well as the collation shown
|
1320
|
-
* by ec_collation. (We restrict an EC to contain only equalities whose
|
1321
|
-
* operators belong to the same set of opfamilies. This could probably be
|
1322
|
-
* relaxed, but for now it's not worth the trouble, since nearly all equality
|
1323
|
-
* operators belong to only one btree opclass anyway. Similarly, we suppose
|
1324
|
-
* that all or none of the input datatypes are collatable, so that a single
|
1325
|
-
* collation value is sufficient.)
|
1326
|
-
*
|
1327
|
-
* Strictly speaking, deductions from an EquivalenceClass hold only within
|
1328
|
-
* a "join domain", that is a set of relations that are innerjoined together
|
1329
|
-
* (see JoinDomain above). For the most part we don't need to account for
|
1330
|
-
* this explicitly, because equality clauses from different join domains
|
1331
|
-
* will contain Vars that are not equal() because they have different
|
1332
|
-
* nullingrel sets, and thus we will never falsely merge ECs from different
|
1333
|
-
* join domains. But Var-free (pseudoconstant) expressions lack that safety
|
1334
|
-
* feature. We handle that by marking "const" EC members with the JoinDomain
|
1335
|
-
* of the clause they came from; two nominally-equal const members will be
|
1336
|
-
* considered different if they came from different JoinDomains. This ensures
|
1337
|
-
* no false EquivalenceClass merges will occur.
|
1338
|
-
*
|
1339
|
-
* We also use EquivalenceClasses as the base structure for PathKeys, letting
|
1340
|
-
* us represent knowledge about different sort orderings being equivalent.
|
1341
|
-
* Since every PathKey must reference an EquivalenceClass, we will end up
|
1342
|
-
* with single-member EquivalenceClasses whenever a sort key expression has
|
1343
|
-
* not been equivalenced to anything else. It is also possible that such an
|
1344
|
-
* EquivalenceClass will contain a volatile expression ("ORDER BY random()"),
|
1345
|
-
* which is a case that can't arise otherwise since clauses containing
|
1346
|
-
* volatile functions are never considered mergejoinable. We mark such
|
1347
|
-
* EquivalenceClasses specially to prevent them from being merged with
|
1348
|
-
* ordinary EquivalenceClasses. Also, for volatile expressions we have
|
1349
|
-
* to be careful to match the EquivalenceClass to the correct targetlist
|
1350
|
-
* entry: consider SELECT random() AS a, random() AS b ... ORDER BY b,a.
|
1351
|
-
* So we record the SortGroupRef of the originating sort clause.
|
1352
|
-
*
|
1353
|
-
* NB: if ec_merged isn't NULL, this class has been merged into another, and
|
1354
|
-
* should be ignored in favor of using the pointed-to class.
|
1355
|
-
*
|
1356
|
-
* NB: EquivalenceClasses are never copied after creation. Therefore,
|
1357
|
-
* copyObject() copies pointers to them as pointers, and equal() compares
|
1358
|
-
* pointers to EquivalenceClasses via pointer equality. This is implemented
|
1359
|
-
* by putting copy_as_scalar and equal_as_scalar attributes on fields that
|
1360
|
-
* are pointers to EquivalenceClasses. The same goes for EquivalenceMembers.
|
1361
|
-
*/
|
1362
|
-
typedef struct EquivalenceClass
|
1363
|
-
{
|
1364
|
-
pg_node_attr(custom_read_write, no_copy_equal, no_read, no_query_jumble)
|
1365
|
-
|
1366
|
-
NodeTag type;
|
1367
|
-
|
1368
|
-
List *ec_opfamilies; /* btree operator family OIDs */
|
1369
|
-
Oid ec_collation; /* collation, if datatypes are collatable */
|
1370
|
-
List *ec_members; /* list of EquivalenceMembers */
|
1371
|
-
List *ec_sources; /* list of generating RestrictInfos */
|
1372
|
-
List *ec_derives; /* list of derived RestrictInfos */
|
1373
|
-
Relids ec_relids; /* all relids appearing in ec_members, except
|
1374
|
-
* for child members (see below) */
|
1375
|
-
bool ec_has_const; /* any pseudoconstants in ec_members? */
|
1376
|
-
bool ec_has_volatile; /* the (sole) member is a volatile expr */
|
1377
|
-
bool ec_broken; /* failed to generate needed clauses? */
|
1378
|
-
Index ec_sortref; /* originating sortclause label, or 0 */
|
1379
|
-
Index ec_min_security; /* minimum security_level in ec_sources */
|
1380
|
-
Index ec_max_security; /* maximum security_level in ec_sources */
|
1381
|
-
struct EquivalenceClass *ec_merged; /* set if merged into another EC */
|
1382
|
-
} EquivalenceClass;
|
1383
|
-
|
1384
|
-
/*
|
1385
|
-
* If an EC contains a constant, any PathKey depending on it must be
|
1386
|
-
* redundant, since there's only one possible value of the key.
|
1387
|
-
*/
|
1388
|
-
#define EC_MUST_BE_REDUNDANT(eclass) \
|
1389
|
-
((eclass)->ec_has_const)
|
1390
|
-
|
1391
|
-
/*
|
1392
|
-
* EquivalenceMember - one member expression of an EquivalenceClass
|
1393
|
-
*
|
1394
|
-
* em_is_child signifies that this element was built by transposing a member
|
1395
|
-
* for an appendrel parent relation to represent the corresponding expression
|
1396
|
-
* for an appendrel child. These members are used for determining the
|
1397
|
-
* pathkeys of scans on the child relation and for explicitly sorting the
|
1398
|
-
* child when necessary to build a MergeAppend path for the whole appendrel
|
1399
|
-
* tree. An em_is_child member has no impact on the properties of the EC as a
|
1400
|
-
* whole; in particular the EC's ec_relids field does NOT include the child
|
1401
|
-
* relation. An em_is_child member should never be marked em_is_const nor
|
1402
|
-
* cause ec_has_const or ec_has_volatile to be set, either. Thus, em_is_child
|
1403
|
-
* members are not really full-fledged members of the EC, but just reflections
|
1404
|
-
* or doppelgangers of real members. Most operations on EquivalenceClasses
|
1405
|
-
* should ignore em_is_child members, and those that don't should test
|
1406
|
-
* em_relids to make sure they only consider relevant members.
|
1407
|
-
*
|
1408
|
-
* em_datatype is usually the same as exprType(em_expr), but can be
|
1409
|
-
* different when dealing with a binary-compatible opfamily; in particular
|
1410
|
-
* anyarray_ops would never work without this. Use em_datatype when
|
1411
|
-
* looking up a specific btree operator to work with this expression.
|
1412
|
-
*/
|
1413
|
-
typedef struct EquivalenceMember
|
1414
|
-
{
|
1415
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1416
|
-
|
1417
|
-
NodeTag type;
|
1418
|
-
|
1419
|
-
Expr *em_expr; /* the expression represented */
|
1420
|
-
Relids em_relids; /* all relids appearing in em_expr */
|
1421
|
-
bool em_is_const; /* expression is pseudoconstant? */
|
1422
|
-
bool em_is_child; /* derived version for a child relation? */
|
1423
|
-
Oid em_datatype; /* the "nominal type" used by the opfamily */
|
1424
|
-
JoinDomain *em_jdomain; /* join domain containing the source clause */
|
1425
|
-
/* if em_is_child is true, this links to corresponding EM for top parent */
|
1426
|
-
struct EquivalenceMember *em_parent pg_node_attr(read_write_ignore);
|
1427
|
-
} EquivalenceMember;
|
1428
|
-
|
1429
|
-
/*
|
1430
|
-
* PathKeys
|
1431
|
-
*
|
1432
|
-
* The sort ordering of a path is represented by a list of PathKey nodes.
|
1433
|
-
* An empty list implies no known ordering. Otherwise the first item
|
1434
|
-
* represents the primary sort key, the second the first secondary sort key,
|
1435
|
-
* etc. The value being sorted is represented by linking to an
|
1436
|
-
* EquivalenceClass containing that value and including pk_opfamily among its
|
1437
|
-
* ec_opfamilies. The EquivalenceClass tells which collation to use, too.
|
1438
|
-
* This is a convenient method because it makes it trivial to detect
|
1439
|
-
* equivalent and closely-related orderings. (See optimizer/README for more
|
1440
|
-
* information.)
|
1441
|
-
*
|
1442
|
-
* Note: pk_strategy is either BTLessStrategyNumber (for ASC) or
|
1443
|
-
* BTGreaterStrategyNumber (for DESC). We assume that all ordering-capable
|
1444
|
-
* index types will use btree-compatible strategy numbers.
|
1445
|
-
*/
|
1446
|
-
typedef struct PathKey
|
1447
|
-
{
|
1448
|
-
pg_node_attr(no_read, no_query_jumble)
|
1449
|
-
|
1450
|
-
NodeTag type;
|
1451
|
-
|
1452
|
-
/* the value that is ordered */
|
1453
|
-
EquivalenceClass *pk_eclass pg_node_attr(copy_as_scalar, equal_as_scalar);
|
1454
|
-
Oid pk_opfamily; /* btree opfamily defining the ordering */
|
1455
|
-
int pk_strategy; /* sort direction (ASC or DESC) */
|
1456
|
-
bool pk_nulls_first; /* do NULLs come before normal values? */
|
1457
|
-
} PathKey;
|
1458
|
-
|
1459
|
-
/*
|
1460
|
-
* VolatileFunctionStatus -- allows nodes to cache their
|
1461
|
-
* contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet
|
1462
|
-
* determined.
|
1463
|
-
*/
|
1464
|
-
typedef enum VolatileFunctionStatus
|
1465
|
-
{
|
1466
|
-
VOLATILITY_UNKNOWN = 0,
|
1467
|
-
VOLATILITY_VOLATILE,
|
1468
|
-
VOLATILITY_NOVOLATILE
|
1469
|
-
} VolatileFunctionStatus;
|
1470
|
-
|
1471
|
-
/*
|
1472
|
-
* PathTarget
|
1473
|
-
*
|
1474
|
-
* This struct contains what we need to know during planning about the
|
1475
|
-
* targetlist (output columns) that a Path will compute. Each RelOptInfo
|
1476
|
-
* includes a default PathTarget, which its individual Paths may simply
|
1477
|
-
* reference. However, in some cases a Path may compute outputs different
|
1478
|
-
* from other Paths, and in that case we make a custom PathTarget for it.
|
1479
|
-
* For example, an indexscan might return index expressions that would
|
1480
|
-
* otherwise need to be explicitly calculated. (Note also that "upper"
|
1481
|
-
* relations generally don't have useful default PathTargets.)
|
1482
|
-
*
|
1483
|
-
* exprs contains bare expressions; they do not have TargetEntry nodes on top,
|
1484
|
-
* though those will appear in finished Plans.
|
1485
|
-
*
|
1486
|
-
* sortgrouprefs[] is an array of the same length as exprs, containing the
|
1487
|
-
* corresponding sort/group refnos, or zeroes for expressions not referenced
|
1488
|
-
* by sort/group clauses. If sortgrouprefs is NULL (which it generally is in
|
1489
|
-
* RelOptInfo.reltarget targets; only upper-level Paths contain this info),
|
1490
|
-
* we have not identified sort/group columns in this tlist. This allows us to
|
1491
|
-
* deal with sort/group refnos when needed with less expense than including
|
1492
|
-
* TargetEntry nodes in the exprs list.
|
1493
|
-
*/
|
1494
|
-
typedef struct PathTarget
|
1495
|
-
{
|
1496
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1497
|
-
|
1498
|
-
NodeTag type;
|
1499
|
-
|
1500
|
-
/* list of expressions to be computed */
|
1501
|
-
List *exprs;
|
1502
|
-
|
1503
|
-
/* corresponding sort/group refnos, or 0 */
|
1504
|
-
Index *sortgrouprefs pg_node_attr(array_size(exprs));
|
1505
|
-
|
1506
|
-
/* cost of evaluating the expressions */
|
1507
|
-
QualCost cost;
|
1508
|
-
|
1509
|
-
/* estimated avg width of result tuples */
|
1510
|
-
int width;
|
1511
|
-
|
1512
|
-
/* indicates if exprs contain any volatile functions */
|
1513
|
-
VolatileFunctionStatus has_volatile_expr;
|
1514
|
-
} PathTarget;
|
1515
|
-
|
1516
|
-
/* Convenience macro to get a sort/group refno from a PathTarget */
|
1517
|
-
#define get_pathtarget_sortgroupref(target, colno) \
|
1518
|
-
((target)->sortgrouprefs ? (target)->sortgrouprefs[colno] : (Index) 0)
|
1519
|
-
|
1520
|
-
|
1521
|
-
/*
|
1522
|
-
* ParamPathInfo
|
1523
|
-
*
|
1524
|
-
* All parameterized paths for a given relation with given required outer rels
|
1525
|
-
* link to a single ParamPathInfo, which stores common information such as
|
1526
|
-
* the estimated rowcount for this parameterization. We do this partly to
|
1527
|
-
* avoid recalculations, but mostly to ensure that the estimated rowcount
|
1528
|
-
* is in fact the same for every such path.
|
1529
|
-
*
|
1530
|
-
* Note: ppi_clauses is only used in ParamPathInfos for base relation paths;
|
1531
|
-
* in join cases it's NIL because the set of relevant clauses varies depending
|
1532
|
-
* on how the join is formed. The relevant clauses will appear in each
|
1533
|
-
* parameterized join path's joinrestrictinfo list, instead. ParamPathInfos
|
1534
|
-
* for append relations don't bother with this, either.
|
1535
|
-
*
|
1536
|
-
* ppi_serials is the set of rinfo_serial numbers for quals that are enforced
|
1537
|
-
* by this path. As with ppi_clauses, it's only maintained for baserels.
|
1538
|
-
* (We could construct it on-the-fly from ppi_clauses, but it seems better
|
1539
|
-
* to materialize a copy.)
|
1540
|
-
*/
|
1541
|
-
typedef struct ParamPathInfo
|
1542
|
-
{
|
1543
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1544
|
-
|
1545
|
-
NodeTag type;
|
1546
|
-
|
1547
|
-
Relids ppi_req_outer; /* rels supplying parameters used by path */
|
1548
|
-
Cardinality ppi_rows; /* estimated number of result tuples */
|
1549
|
-
List *ppi_clauses; /* join clauses available from outer rels */
|
1550
|
-
Bitmapset *ppi_serials; /* set of rinfo_serial for enforced quals */
|
1551
|
-
} ParamPathInfo;
|
1552
|
-
|
1553
|
-
|
1554
|
-
/*
|
1555
|
-
* Type "Path" is used as-is for sequential-scan paths, as well as some other
|
1556
|
-
* simple plan types that we don't need any extra information in the path for.
|
1557
|
-
* For other path types it is the first component of a larger struct.
|
1558
|
-
*
|
1559
|
-
* "pathtype" is the NodeTag of the Plan node we could build from this Path.
|
1560
|
-
* It is partially redundant with the Path's NodeTag, but allows us to use
|
1561
|
-
* the same Path type for multiple Plan types when there is no need to
|
1562
|
-
* distinguish the Plan type during path processing.
|
1563
|
-
*
|
1564
|
-
* "parent" identifies the relation this Path scans, and "pathtarget"
|
1565
|
-
* describes the precise set of output columns the Path would compute.
|
1566
|
-
* In simple cases all Paths for a given rel share the same targetlist,
|
1567
|
-
* which we represent by having path->pathtarget equal to parent->reltarget.
|
1568
|
-
*
|
1569
|
-
* "param_info", if not NULL, links to a ParamPathInfo that identifies outer
|
1570
|
-
* relation(s) that provide parameter values to each scan of this path.
|
1571
|
-
* That means this path can only be joined to those rels by means of nestloop
|
1572
|
-
* joins with this path on the inside. Also note that a parameterized path
|
1573
|
-
* is responsible for testing all "movable" joinclauses involving this rel
|
1574
|
-
* and the specified outer rel(s).
|
1575
|
-
*
|
1576
|
-
* "rows" is the same as parent->rows in simple paths, but in parameterized
|
1577
|
-
* paths and UniquePaths it can be less than parent->rows, reflecting the
|
1578
|
-
* fact that we've filtered by extra join conditions or removed duplicates.
|
1579
|
-
*
|
1580
|
-
* "pathkeys" is a List of PathKey nodes (see above), describing the sort
|
1581
|
-
* ordering of the path's output rows.
|
1582
|
-
*
|
1583
|
-
* We do not support copying Path trees, mainly because the circular linkages
|
1584
|
-
* between RelOptInfo and Path nodes can't be handled easily in a simple
|
1585
|
-
* depth-first traversal. We also don't have read support at the moment.
|
1586
|
-
*/
|
1587
|
-
typedef struct Path
|
1588
|
-
{
|
1589
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1590
|
-
|
1591
|
-
NodeTag type;
|
1592
|
-
|
1593
|
-
/* tag identifying scan/join method */
|
1594
|
-
NodeTag pathtype;
|
1595
|
-
|
1596
|
-
/*
|
1597
|
-
* the relation this path can build
|
1598
|
-
*
|
1599
|
-
* We do NOT print the parent, else we'd be in infinite recursion. We can
|
1600
|
-
* print the parent's relids for identification purposes, though.
|
1601
|
-
*/
|
1602
|
-
RelOptInfo *parent pg_node_attr(write_only_relids);
|
1603
|
-
|
1604
|
-
/*
|
1605
|
-
* list of Vars/Exprs, cost, width
|
1606
|
-
*
|
1607
|
-
* We print the pathtarget only if it's not the default one for the rel.
|
1608
|
-
*/
|
1609
|
-
PathTarget *pathtarget pg_node_attr(write_only_nondefault_pathtarget);
|
1610
|
-
|
1611
|
-
/*
|
1612
|
-
* parameterization info, or NULL if none
|
1613
|
-
*
|
1614
|
-
* We do not print the whole of param_info, since it's printed via
|
1615
|
-
* RelOptInfo; it's sufficient and less cluttering to print just the
|
1616
|
-
* required outer relids.
|
1617
|
-
*/
|
1618
|
-
ParamPathInfo *param_info pg_node_attr(write_only_req_outer);
|
1619
|
-
|
1620
|
-
/* engage parallel-aware logic? */
|
1621
|
-
bool parallel_aware;
|
1622
|
-
/* OK to use as part of parallel plan? */
|
1623
|
-
bool parallel_safe;
|
1624
|
-
/* desired # of workers; 0 = not parallel */
|
1625
|
-
int parallel_workers;
|
1626
|
-
|
1627
|
-
/* estimated size/costs for path (see costsize.c for more info) */
|
1628
|
-
Cardinality rows; /* estimated number of result tuples */
|
1629
|
-
Cost startup_cost; /* cost expended before fetching any tuples */
|
1630
|
-
Cost total_cost; /* total cost (assuming all tuples fetched) */
|
1631
|
-
|
1632
|
-
/* sort ordering of path's output; a List of PathKey nodes; see above */
|
1633
|
-
List *pathkeys;
|
1634
|
-
} Path;
|
1635
|
-
|
1636
|
-
/* Macro for extracting a path's parameterization relids; beware double eval */
|
1637
|
-
#define PATH_REQ_OUTER(path) \
|
1638
|
-
((path)->param_info ? (path)->param_info->ppi_req_outer : (Relids) NULL)
|
1639
|
-
|
1640
|
-
/*----------
|
1641
|
-
* IndexPath represents an index scan over a single index.
|
1642
|
-
*
|
1643
|
-
* This struct is used for both regular indexscans and index-only scans;
|
1644
|
-
* path.pathtype is T_IndexScan or T_IndexOnlyScan to show which is meant.
|
1645
|
-
*
|
1646
|
-
* 'indexinfo' is the index to be scanned.
|
1647
|
-
*
|
1648
|
-
* 'indexclauses' is a list of IndexClause nodes, each representing one
|
1649
|
-
* index-checkable restriction, with implicit AND semantics across the list.
|
1650
|
-
* An empty list implies a full index scan.
|
1651
|
-
*
|
1652
|
-
* 'indexorderbys', if not NIL, is a list of ORDER BY expressions that have
|
1653
|
-
* been found to be usable as ordering operators for an amcanorderbyop index.
|
1654
|
-
* The list must match the path's pathkeys, ie, one expression per pathkey
|
1655
|
-
* in the same order. These are not RestrictInfos, just bare expressions,
|
1656
|
-
* since they generally won't yield booleans. It's guaranteed that each
|
1657
|
-
* expression has the index key on the left side of the operator.
|
1658
|
-
*
|
1659
|
-
* 'indexorderbycols' is an integer list of index column numbers (zero-based)
|
1660
|
-
* of the same length as 'indexorderbys', showing which index column each
|
1661
|
-
* ORDER BY expression is meant to be used with. (There is no restriction
|
1662
|
-
* on which index column each ORDER BY can be used with.)
|
1663
|
-
*
|
1664
|
-
* 'indexscandir' is one of:
|
1665
|
-
* ForwardScanDirection: forward scan of an index
|
1666
|
-
* BackwardScanDirection: backward scan of an ordered index
|
1667
|
-
* Unordered indexes will always have an indexscandir of ForwardScanDirection.
|
1668
|
-
*
|
1669
|
-
* 'indextotalcost' and 'indexselectivity' are saved in the IndexPath so that
|
1670
|
-
* we need not recompute them when considering using the same index in a
|
1671
|
-
* bitmap index/heap scan (see BitmapHeapPath). The costs of the IndexPath
|
1672
|
-
* itself represent the costs of an IndexScan or IndexOnlyScan plan type.
|
1673
|
-
*----------
|
1674
|
-
*/
|
1675
|
-
typedef struct IndexPath
|
1676
|
-
{
|
1677
|
-
Path path;
|
1678
|
-
IndexOptInfo *indexinfo;
|
1679
|
-
List *indexclauses;
|
1680
|
-
List *indexorderbys;
|
1681
|
-
List *indexorderbycols;
|
1682
|
-
ScanDirection indexscandir;
|
1683
|
-
Cost indextotalcost;
|
1684
|
-
Selectivity indexselectivity;
|
1685
|
-
} IndexPath;
|
1686
|
-
|
1687
|
-
/*
|
1688
|
-
* Each IndexClause references a RestrictInfo node from the query's WHERE
|
1689
|
-
* or JOIN conditions, and shows how that restriction can be applied to
|
1690
|
-
* the particular index. We support both indexclauses that are directly
|
1691
|
-
* usable by the index machinery, which are typically of the form
|
1692
|
-
* "indexcol OP pseudoconstant", and those from which an indexable qual
|
1693
|
-
* can be derived. The simplest such transformation is that a clause
|
1694
|
-
* of the form "pseudoconstant OP indexcol" can be commuted to produce an
|
1695
|
-
* indexable qual (the index machinery expects the indexcol to be on the
|
1696
|
-
* left always). Another example is that we might be able to extract an
|
1697
|
-
* indexable range condition from a LIKE condition, as in "x LIKE 'foo%bar'"
|
1698
|
-
* giving rise to "x >= 'foo' AND x < 'fop'". Derivation of such lossy
|
1699
|
-
* conditions is done by a planner support function attached to the
|
1700
|
-
* indexclause's top-level function or operator.
|
1701
|
-
*
|
1702
|
-
* indexquals is a list of RestrictInfos for the directly-usable index
|
1703
|
-
* conditions associated with this IndexClause. In the simplest case
|
1704
|
-
* it's a one-element list whose member is iclause->rinfo. Otherwise,
|
1705
|
-
* it contains one or more directly-usable indexqual conditions extracted
|
1706
|
-
* from the given clause. The 'lossy' flag indicates whether the
|
1707
|
-
* indexquals are semantically equivalent to the original clause, or
|
1708
|
-
* represent a weaker condition.
|
1709
|
-
*
|
1710
|
-
* Normally, indexcol is the index of the single index column the clause
|
1711
|
-
* works on, and indexcols is NIL. But if the clause is a RowCompareExpr,
|
1712
|
-
* indexcol is the index of the leading column, and indexcols is a list of
|
1713
|
-
* all the affected columns. (Note that indexcols matches up with the
|
1714
|
-
* columns of the actual indexable RowCompareExpr in indexquals, which
|
1715
|
-
* might be different from the original in rinfo.)
|
1716
|
-
*
|
1717
|
-
* An IndexPath's IndexClause list is required to be ordered by index
|
1718
|
-
* column, i.e. the indexcol values must form a nondecreasing sequence.
|
1719
|
-
* (The order of multiple clauses for the same index column is unspecified.)
|
1720
|
-
*/
|
1721
|
-
typedef struct IndexClause
|
1722
|
-
{
|
1723
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
1724
|
-
|
1725
|
-
NodeTag type;
|
1726
|
-
struct RestrictInfo *rinfo; /* original restriction or join clause */
|
1727
|
-
List *indexquals; /* indexqual(s) derived from it */
|
1728
|
-
bool lossy; /* are indexquals a lossy version of clause? */
|
1729
|
-
AttrNumber indexcol; /* index column the clause uses (zero-based) */
|
1730
|
-
List *indexcols; /* multiple index columns, if RowCompare */
|
1731
|
-
} IndexClause;
|
1732
|
-
|
1733
|
-
/*
|
1734
|
-
* BitmapHeapPath represents one or more indexscans that generate TID bitmaps
|
1735
|
-
* instead of directly accessing the heap, followed by AND/OR combinations
|
1736
|
-
* to produce a single bitmap, followed by a heap scan that uses the bitmap.
|
1737
|
-
* Note that the output is always considered unordered, since it will come
|
1738
|
-
* out in physical heap order no matter what the underlying indexes did.
|
1739
|
-
*
|
1740
|
-
* The individual indexscans are represented by IndexPath nodes, and any
|
1741
|
-
* logic on top of them is represented by a tree of BitmapAndPath and
|
1742
|
-
* BitmapOrPath nodes. Notice that we can use the same IndexPath node both
|
1743
|
-
* to represent a regular (or index-only) index scan plan, and as the child
|
1744
|
-
* of a BitmapHeapPath that represents scanning the same index using a
|
1745
|
-
* BitmapIndexScan. The startup_cost and total_cost figures of an IndexPath
|
1746
|
-
* always represent the costs to use it as a regular (or index-only)
|
1747
|
-
* IndexScan. The costs of a BitmapIndexScan can be computed using the
|
1748
|
-
* IndexPath's indextotalcost and indexselectivity.
|
1749
|
-
*/
|
1750
|
-
typedef struct BitmapHeapPath
|
1751
|
-
{
|
1752
|
-
Path path;
|
1753
|
-
Path *bitmapqual; /* IndexPath, BitmapAndPath, BitmapOrPath */
|
1754
|
-
} BitmapHeapPath;
|
1755
|
-
|
1756
|
-
/*
|
1757
|
-
* BitmapAndPath represents a BitmapAnd plan node; it can only appear as
|
1758
|
-
* part of the substructure of a BitmapHeapPath. The Path structure is
|
1759
|
-
* a bit more heavyweight than we really need for this, but for simplicity
|
1760
|
-
* we make it a derivative of Path anyway.
|
1761
|
-
*/
|
1762
|
-
typedef struct BitmapAndPath
|
1763
|
-
{
|
1764
|
-
Path path;
|
1765
|
-
List *bitmapquals; /* IndexPaths and BitmapOrPaths */
|
1766
|
-
Selectivity bitmapselectivity;
|
1767
|
-
} BitmapAndPath;
|
1768
|
-
|
1769
|
-
/*
|
1770
|
-
* BitmapOrPath represents a BitmapOr plan node; it can only appear as
|
1771
|
-
* part of the substructure of a BitmapHeapPath. The Path structure is
|
1772
|
-
* a bit more heavyweight than we really need for this, but for simplicity
|
1773
|
-
* we make it a derivative of Path anyway.
|
1774
|
-
*/
|
1775
|
-
typedef struct BitmapOrPath
|
1776
|
-
{
|
1777
|
-
Path path;
|
1778
|
-
List *bitmapquals; /* IndexPaths and BitmapAndPaths */
|
1779
|
-
Selectivity bitmapselectivity;
|
1780
|
-
} BitmapOrPath;
|
1781
|
-
|
1782
|
-
/*
|
1783
|
-
* TidPath represents a scan by TID
|
1784
|
-
*
|
1785
|
-
* tidquals is an implicitly OR'ed list of qual expressions of the form
|
1786
|
-
* "CTID = pseudoconstant", or "CTID = ANY(pseudoconstant_array)",
|
1787
|
-
* or a CurrentOfExpr for the relation.
|
1788
|
-
*/
|
1789
|
-
typedef struct TidPath
|
1790
|
-
{
|
1791
|
-
Path path;
|
1792
|
-
List *tidquals; /* qual(s) involving CTID = something */
|
1793
|
-
} TidPath;
|
1794
|
-
|
1795
|
-
/*
|
1796
|
-
* TidRangePath represents a scan by a contiguous range of TIDs
|
1797
|
-
*
|
1798
|
-
* tidrangequals is an implicitly AND'ed list of qual expressions of the form
|
1799
|
-
* "CTID relop pseudoconstant", where relop is one of >,>=,<,<=.
|
1800
|
-
*/
|
1801
|
-
typedef struct TidRangePath
|
1802
|
-
{
|
1803
|
-
Path path;
|
1804
|
-
List *tidrangequals;
|
1805
|
-
} TidRangePath;
|
1806
|
-
|
1807
|
-
/*
|
1808
|
-
* SubqueryScanPath represents a scan of an unflattened subquery-in-FROM
|
1809
|
-
*
|
1810
|
-
* Note that the subpath comes from a different planning domain; for example
|
1811
|
-
* RTE indexes within it mean something different from those known to the
|
1812
|
-
* SubqueryScanPath. path.parent->subroot is the planning context needed to
|
1813
|
-
* interpret the subpath.
|
1814
|
-
*/
|
1815
|
-
typedef struct SubqueryScanPath
|
1816
|
-
{
|
1817
|
-
Path path;
|
1818
|
-
Path *subpath; /* path representing subquery execution */
|
1819
|
-
} SubqueryScanPath;
|
1820
|
-
|
1821
|
-
/*
|
1822
|
-
* ForeignPath represents a potential scan of a foreign table, foreign join
|
1823
|
-
* or foreign upper-relation.
|
1824
|
-
*
|
1825
|
-
* fdw_private stores FDW private data about the scan. While fdw_private is
|
1826
|
-
* not actually touched by the core code during normal operations, it's
|
1827
|
-
* generally a good idea to use a representation that can be dumped by
|
1828
|
-
* nodeToString(), so that you can examine the structure during debugging
|
1829
|
-
* with tools like pprint().
|
1830
|
-
*/
|
1831
|
-
typedef struct ForeignPath
|
1832
|
-
{
|
1833
|
-
Path path;
|
1834
|
-
Path *fdw_outerpath;
|
1835
|
-
List *fdw_private;
|
1836
|
-
} ForeignPath;
|
1837
|
-
|
1838
|
-
/*
|
1839
|
-
* CustomPath represents a table scan or a table join done by some out-of-core
|
1840
|
-
* extension.
|
1841
|
-
*
|
1842
|
-
* We provide a set of hooks here - which the provider must take care to set
|
1843
|
-
* up correctly - to allow extensions to supply their own methods of scanning
|
1844
|
-
* a relation or joing relations. For example, a provider might provide GPU
|
1845
|
-
* acceleration, a cache-based scan, or some other kind of logic we haven't
|
1846
|
-
* dreamed up yet.
|
1847
|
-
*
|
1848
|
-
* CustomPaths can be injected into the planning process for a base or join
|
1849
|
-
* relation by set_rel_pathlist_hook or set_join_pathlist_hook functions,
|
1850
|
-
* respectively.
|
1851
|
-
*
|
1852
|
-
* Core code must avoid assuming that the CustomPath is only as large as
|
1853
|
-
* the structure declared here; providers are allowed to make it the first
|
1854
|
-
* element in a larger structure. (Since the planner never copies Paths,
|
1855
|
-
* this doesn't add any complication.) However, for consistency with the
|
1856
|
-
* FDW case, we provide a "custom_private" field in CustomPath; providers
|
1857
|
-
* may prefer to use that rather than define another struct type.
|
1858
|
-
*/
|
1859
|
-
|
1860
|
-
struct CustomPathMethods;
|
1861
|
-
|
1862
|
-
typedef struct CustomPath
|
1863
|
-
{
|
1864
|
-
Path path;
|
1865
|
-
uint32 flags; /* mask of CUSTOMPATH_* flags, see
|
1866
|
-
* nodes/extensible.h */
|
1867
|
-
List *custom_paths; /* list of child Path nodes, if any */
|
1868
|
-
List *custom_private;
|
1869
|
-
const struct CustomPathMethods *methods;
|
1870
|
-
} CustomPath;
|
1871
|
-
|
1872
|
-
/*
|
1873
|
-
* AppendPath represents an Append plan, ie, successive execution of
|
1874
|
-
* several member plans.
|
1875
|
-
*
|
1876
|
-
* For partial Append, 'subpaths' contains non-partial subpaths followed by
|
1877
|
-
* partial subpaths.
|
1878
|
-
*
|
1879
|
-
* Note: it is possible for "subpaths" to contain only one, or even no,
|
1880
|
-
* elements. These cases are optimized during create_append_plan.
|
1881
|
-
* In particular, an AppendPath with no subpaths is a "dummy" path that
|
1882
|
-
* is created to represent the case that a relation is provably empty.
|
1883
|
-
* (This is a convenient representation because it means that when we build
|
1884
|
-
* an appendrel and find that all its children have been excluded, no extra
|
1885
|
-
* action is needed to recognize the relation as dummy.)
|
1886
|
-
*/
|
1887
|
-
typedef struct AppendPath
|
1888
|
-
{
|
1889
|
-
Path path;
|
1890
|
-
List *subpaths; /* list of component Paths */
|
1891
|
-
/* Index of first partial path in subpaths; list_length(subpaths) if none */
|
1892
|
-
int first_partial_path;
|
1893
|
-
Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
|
1894
|
-
} AppendPath;
|
1895
|
-
|
1896
|
-
#define IS_DUMMY_APPEND(p) \
|
1897
|
-
(IsA((p), AppendPath) && ((AppendPath *) (p))->subpaths == NIL)
|
1898
|
-
|
1899
|
-
/*
|
1900
|
-
* A relation that's been proven empty will have one path that is dummy
|
1901
|
-
* (but might have projection paths on top). For historical reasons,
|
1902
|
-
* this is provided as a macro that wraps is_dummy_rel().
|
1903
|
-
*/
|
1904
|
-
#define IS_DUMMY_REL(r) is_dummy_rel(r)
|
1905
|
-
extern bool is_dummy_rel(RelOptInfo *rel);
|
1906
|
-
|
1907
|
-
/*
|
1908
|
-
* MergeAppendPath represents a MergeAppend plan, ie, the merging of sorted
|
1909
|
-
* results from several member plans to produce similarly-sorted output.
|
1910
|
-
*/
|
1911
|
-
typedef struct MergeAppendPath
|
1912
|
-
{
|
1913
|
-
Path path;
|
1914
|
-
List *subpaths; /* list of component Paths */
|
1915
|
-
Cardinality limit_tuples; /* hard limit on output tuples, or -1 */
|
1916
|
-
} MergeAppendPath;
|
1917
|
-
|
1918
|
-
/*
|
1919
|
-
* GroupResultPath represents use of a Result plan node to compute the
|
1920
|
-
* output of a degenerate GROUP BY case, wherein we know we should produce
|
1921
|
-
* exactly one row, which might then be filtered by a HAVING qual.
|
1922
|
-
*
|
1923
|
-
* Note that quals is a list of bare clauses, not RestrictInfos.
|
1924
|
-
*/
|
1925
|
-
typedef struct GroupResultPath
|
1926
|
-
{
|
1927
|
-
Path path;
|
1928
|
-
List *quals;
|
1929
|
-
} GroupResultPath;
|
1930
|
-
|
1931
|
-
/*
|
1932
|
-
* MaterialPath represents use of a Material plan node, i.e., caching of
|
1933
|
-
* the output of its subpath. This is used when the subpath is expensive
|
1934
|
-
* and needs to be scanned repeatedly, or when we need mark/restore ability
|
1935
|
-
* and the subpath doesn't have it.
|
1936
|
-
*/
|
1937
|
-
typedef struct MaterialPath
|
1938
|
-
{
|
1939
|
-
Path path;
|
1940
|
-
Path *subpath;
|
1941
|
-
} MaterialPath;
|
1942
|
-
|
1943
|
-
/*
|
1944
|
-
* MemoizePath represents a Memoize plan node, i.e., a cache that caches
|
1945
|
-
* tuples from parameterized paths to save the underlying node from having to
|
1946
|
-
* be rescanned for parameter values which are already cached.
|
1947
|
-
*/
|
1948
|
-
typedef struct MemoizePath
|
1949
|
-
{
|
1950
|
-
Path path;
|
1951
|
-
Path *subpath; /* outerpath to cache tuples from */
|
1952
|
-
List *hash_operators; /* OIDs of hash equality ops for cache keys */
|
1953
|
-
List *param_exprs; /* expressions that are cache keys */
|
1954
|
-
bool singlerow; /* true if the cache entry is to be marked as
|
1955
|
-
* complete after caching the first record. */
|
1956
|
-
bool binary_mode; /* true when cache key should be compared bit
|
1957
|
-
* by bit, false when using hash equality ops */
|
1958
|
-
Cardinality calls; /* expected number of rescans */
|
1959
|
-
uint32 est_entries; /* The maximum number of entries that the
|
1960
|
-
* planner expects will fit in the cache, or 0
|
1961
|
-
* if unknown */
|
1962
|
-
} MemoizePath;
|
1963
|
-
|
1964
|
-
/*
|
1965
|
-
* UniquePath represents elimination of distinct rows from the output of
|
1966
|
-
* its subpath.
|
1967
|
-
*
|
1968
|
-
* This can represent significantly different plans: either hash-based or
|
1969
|
-
* sort-based implementation, or a no-op if the input path can be proven
|
1970
|
-
* distinct already. The decision is sufficiently localized that it's not
|
1971
|
-
* worth having separate Path node types. (Note: in the no-op case, we could
|
1972
|
-
* eliminate the UniquePath node entirely and just return the subpath; but
|
1973
|
-
* it's convenient to have a UniquePath in the path tree to signal upper-level
|
1974
|
-
* routines that the input is known distinct.)
|
1975
|
-
*/
|
1976
|
-
typedef enum UniquePathMethod
|
1977
|
-
{
|
1978
|
-
UNIQUE_PATH_NOOP, /* input is known unique already */
|
1979
|
-
UNIQUE_PATH_HASH, /* use hashing */
|
1980
|
-
UNIQUE_PATH_SORT /* use sorting */
|
1981
|
-
} UniquePathMethod;
|
1982
|
-
|
1983
|
-
typedef struct UniquePath
|
1984
|
-
{
|
1985
|
-
Path path;
|
1986
|
-
Path *subpath;
|
1987
|
-
UniquePathMethod umethod;
|
1988
|
-
List *in_operators; /* equality operators of the IN clause */
|
1989
|
-
List *uniq_exprs; /* expressions to be made unique */
|
1990
|
-
} UniquePath;
|
1991
|
-
|
1992
|
-
/*
|
1993
|
-
* GatherPath runs several copies of a plan in parallel and collects the
|
1994
|
-
* results. The parallel leader may also execute the plan, unless the
|
1995
|
-
* single_copy flag is set.
|
1996
|
-
*/
|
1997
|
-
typedef struct GatherPath
|
1998
|
-
{
|
1999
|
-
Path path;
|
2000
|
-
Path *subpath; /* path for each worker */
|
2001
|
-
bool single_copy; /* don't execute path more than once */
|
2002
|
-
int num_workers; /* number of workers sought to help */
|
2003
|
-
} GatherPath;
|
2004
|
-
|
2005
|
-
/*
|
2006
|
-
* GatherMergePath runs several copies of a plan in parallel and collects
|
2007
|
-
* the results, preserving their common sort order.
|
2008
|
-
*/
|
2009
|
-
typedef struct GatherMergePath
|
2010
|
-
{
|
2011
|
-
Path path;
|
2012
|
-
Path *subpath; /* path for each worker */
|
2013
|
-
int num_workers; /* number of workers sought to help */
|
2014
|
-
} GatherMergePath;
|
2015
|
-
|
2016
|
-
|
2017
|
-
/*
|
2018
|
-
* All join-type paths share these fields.
|
2019
|
-
*/
|
2020
|
-
|
2021
|
-
typedef struct JoinPath
|
2022
|
-
{
|
2023
|
-
pg_node_attr(abstract)
|
2024
|
-
|
2025
|
-
Path path;
|
2026
|
-
|
2027
|
-
JoinType jointype;
|
2028
|
-
|
2029
|
-
bool inner_unique; /* each outer tuple provably matches no more
|
2030
|
-
* than one inner tuple */
|
2031
|
-
|
2032
|
-
Path *outerjoinpath; /* path for the outer side of the join */
|
2033
|
-
Path *innerjoinpath; /* path for the inner side of the join */
|
2034
|
-
|
2035
|
-
List *joinrestrictinfo; /* RestrictInfos to apply to join */
|
2036
|
-
|
2037
|
-
/*
|
2038
|
-
* See the notes for RelOptInfo and ParamPathInfo to understand why
|
2039
|
-
* joinrestrictinfo is needed in JoinPath, and can't be merged into the
|
2040
|
-
* parent RelOptInfo.
|
2041
|
-
*/
|
2042
|
-
} JoinPath;
|
2043
|
-
|
2044
|
-
/*
|
2045
|
-
* A nested-loop path needs no special fields.
|
2046
|
-
*/
|
2047
|
-
|
2048
|
-
typedef struct NestPath
|
2049
|
-
{
|
2050
|
-
JoinPath jpath;
|
2051
|
-
} NestPath;
|
2052
|
-
|
2053
|
-
/*
|
2054
|
-
* A mergejoin path has these fields.
|
2055
|
-
*
|
2056
|
-
* Unlike other path types, a MergePath node doesn't represent just a single
|
2057
|
-
* run-time plan node: it can represent up to four. Aside from the MergeJoin
|
2058
|
-
* node itself, there can be a Sort node for the outer input, a Sort node
|
2059
|
-
* for the inner input, and/or a Material node for the inner input. We could
|
2060
|
-
* represent these nodes by separate path nodes, but considering how many
|
2061
|
-
* different merge paths are investigated during a complex join problem,
|
2062
|
-
* it seems better to avoid unnecessary palloc overhead.
|
2063
|
-
*
|
2064
|
-
* path_mergeclauses lists the clauses (in the form of RestrictInfos)
|
2065
|
-
* that will be used in the merge.
|
2066
|
-
*
|
2067
|
-
* Note that the mergeclauses are a subset of the parent relation's
|
2068
|
-
* restriction-clause list. Any join clauses that are not mergejoinable
|
2069
|
-
* appear only in the parent's restrict list, and must be checked by a
|
2070
|
-
* qpqual at execution time.
|
2071
|
-
*
|
2072
|
-
* outersortkeys (resp. innersortkeys) is NIL if the outer path
|
2073
|
-
* (resp. inner path) is already ordered appropriately for the
|
2074
|
-
* mergejoin. If it is not NIL then it is a PathKeys list describing
|
2075
|
-
* the ordering that must be created by an explicit Sort node.
|
2076
|
-
*
|
2077
|
-
* skip_mark_restore is true if the executor need not do mark/restore calls.
|
2078
|
-
* Mark/restore overhead is usually required, but can be skipped if we know
|
2079
|
-
* that the executor need find only one match per outer tuple, and that the
|
2080
|
-
* mergeclauses are sufficient to identify a match. In such cases the
|
2081
|
-
* executor can immediately advance the outer relation after processing a
|
2082
|
-
* match, and therefore it need never back up the inner relation.
|
2083
|
-
*
|
2084
|
-
* materialize_inner is true if a Material node should be placed atop the
|
2085
|
-
* inner input. This may appear with or without an inner Sort step.
|
2086
|
-
*/
|
2087
|
-
|
2088
|
-
typedef struct MergePath
|
2089
|
-
{
|
2090
|
-
JoinPath jpath;
|
2091
|
-
List *path_mergeclauses; /* join clauses to be used for merge */
|
2092
|
-
List *outersortkeys; /* keys for explicit sort, if any */
|
2093
|
-
List *innersortkeys; /* keys for explicit sort, if any */
|
2094
|
-
bool skip_mark_restore; /* can executor skip mark/restore? */
|
2095
|
-
bool materialize_inner; /* add Materialize to inner? */
|
2096
|
-
} MergePath;
|
2097
|
-
|
2098
|
-
/*
|
2099
|
-
* A hashjoin path has these fields.
|
2100
|
-
*
|
2101
|
-
* The remarks above for mergeclauses apply for hashclauses as well.
|
2102
|
-
*
|
2103
|
-
* Hashjoin does not care what order its inputs appear in, so we have
|
2104
|
-
* no need for sortkeys.
|
2105
|
-
*/
|
2106
|
-
|
2107
|
-
typedef struct HashPath
|
2108
|
-
{
|
2109
|
-
JoinPath jpath;
|
2110
|
-
List *path_hashclauses; /* join clauses used for hashing */
|
2111
|
-
int num_batches; /* number of batches expected */
|
2112
|
-
Cardinality inner_rows_total; /* total inner rows expected */
|
2113
|
-
} HashPath;
|
2114
|
-
|
2115
|
-
/*
|
2116
|
-
* ProjectionPath represents a projection (that is, targetlist computation)
|
2117
|
-
*
|
2118
|
-
* Nominally, this path node represents using a Result plan node to do a
|
2119
|
-
* projection step. However, if the input plan node supports projection,
|
2120
|
-
* we can just modify its output targetlist to do the required calculations
|
2121
|
-
* directly, and not need a Result. In some places in the planner we can just
|
2122
|
-
* jam the desired PathTarget into the input path node (and adjust its cost
|
2123
|
-
* accordingly), so we don't need a ProjectionPath. But in other places
|
2124
|
-
* it's necessary to not modify the input path node, so we need a separate
|
2125
|
-
* ProjectionPath node, which is marked dummy to indicate that we intend to
|
2126
|
-
* assign the work to the input plan node. The estimated cost for the
|
2127
|
-
* ProjectionPath node will account for whether a Result will be used or not.
|
2128
|
-
*/
|
2129
|
-
typedef struct ProjectionPath
|
2130
|
-
{
|
2131
|
-
Path path;
|
2132
|
-
Path *subpath; /* path representing input source */
|
2133
|
-
bool dummypp; /* true if no separate Result is needed */
|
2134
|
-
} ProjectionPath;
|
2135
|
-
|
2136
|
-
/*
|
2137
|
-
* ProjectSetPath represents evaluation of a targetlist that includes
|
2138
|
-
* set-returning function(s), which will need to be implemented by a
|
2139
|
-
* ProjectSet plan node.
|
2140
|
-
*/
|
2141
|
-
typedef struct ProjectSetPath
|
2142
|
-
{
|
2143
|
-
Path path;
|
2144
|
-
Path *subpath; /* path representing input source */
|
2145
|
-
} ProjectSetPath;
|
2146
|
-
|
2147
|
-
/*
|
2148
|
-
* SortPath represents an explicit sort step
|
2149
|
-
*
|
2150
|
-
* The sort keys are, by definition, the same as path.pathkeys.
|
2151
|
-
*
|
2152
|
-
* Note: the Sort plan node cannot project, so path.pathtarget must be the
|
2153
|
-
* same as the input's pathtarget.
|
2154
|
-
*/
|
2155
|
-
typedef struct SortPath
|
2156
|
-
{
|
2157
|
-
Path path;
|
2158
|
-
Path *subpath; /* path representing input source */
|
2159
|
-
} SortPath;
|
2160
|
-
|
2161
|
-
/*
|
2162
|
-
* IncrementalSortPath represents an incremental sort step
|
2163
|
-
*
|
2164
|
-
* This is like a regular sort, except some leading key columns are assumed
|
2165
|
-
* to be ordered already.
|
2166
|
-
*/
|
2167
|
-
typedef struct IncrementalSortPath
|
2168
|
-
{
|
2169
|
-
SortPath spath;
|
2170
|
-
int nPresortedCols; /* number of presorted columns */
|
2171
|
-
} IncrementalSortPath;
|
2172
|
-
|
2173
|
-
/*
|
2174
|
-
* GroupPath represents grouping (of presorted input)
|
2175
|
-
*
|
2176
|
-
* groupClause represents the columns to be grouped on; the input path
|
2177
|
-
* must be at least that well sorted.
|
2178
|
-
*
|
2179
|
-
* We can also apply a qual to the grouped rows (equivalent of HAVING)
|
2180
|
-
*/
|
2181
|
-
typedef struct GroupPath
|
2182
|
-
{
|
2183
|
-
Path path;
|
2184
|
-
Path *subpath; /* path representing input source */
|
2185
|
-
List *groupClause; /* a list of SortGroupClause's */
|
2186
|
-
List *qual; /* quals (HAVING quals), if any */
|
2187
|
-
} GroupPath;
|
2188
|
-
|
2189
|
-
/*
|
2190
|
-
* UpperUniquePath represents adjacent-duplicate removal (in presorted input)
|
2191
|
-
*
|
2192
|
-
* The columns to be compared are the first numkeys columns of the path's
|
2193
|
-
* pathkeys. The input is presumed already sorted that way.
|
2194
|
-
*/
|
2195
|
-
typedef struct UpperUniquePath
|
2196
|
-
{
|
2197
|
-
Path path;
|
2198
|
-
Path *subpath; /* path representing input source */
|
2199
|
-
int numkeys; /* number of pathkey columns to compare */
|
2200
|
-
} UpperUniquePath;
|
2201
|
-
|
2202
|
-
/*
|
2203
|
-
* AggPath represents generic computation of aggregate functions
|
2204
|
-
*
|
2205
|
-
* This may involve plain grouping (but not grouping sets), using either
|
2206
|
-
* sorted or hashed grouping; for the AGG_SORTED case, the input must be
|
2207
|
-
* appropriately presorted.
|
2208
|
-
*/
|
2209
|
-
typedef struct AggPath
|
2210
|
-
{
|
2211
|
-
Path path;
|
2212
|
-
Path *subpath; /* path representing input source */
|
2213
|
-
AggStrategy aggstrategy; /* basic strategy, see nodes.h */
|
2214
|
-
AggSplit aggsplit; /* agg-splitting mode, see nodes.h */
|
2215
|
-
Cardinality numGroups; /* estimated number of groups in input */
|
2216
|
-
uint64 transitionSpace; /* for pass-by-ref transition data */
|
2217
|
-
List *groupClause; /* a list of SortGroupClause's */
|
2218
|
-
List *qual; /* quals (HAVING quals), if any */
|
2219
|
-
} AggPath;
|
2220
|
-
|
2221
|
-
/*
|
2222
|
-
* Various annotations used for grouping sets in the planner.
|
2223
|
-
*/
|
2224
|
-
|
2225
|
-
typedef struct GroupingSetData
|
2226
|
-
{
|
2227
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
2228
|
-
|
2229
|
-
NodeTag type;
|
2230
|
-
List *set; /* grouping set as list of sortgrouprefs */
|
2231
|
-
Cardinality numGroups; /* est. number of result groups */
|
2232
|
-
} GroupingSetData;
|
2233
|
-
|
2234
|
-
typedef struct RollupData
|
2235
|
-
{
|
2236
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
2237
|
-
|
2238
|
-
NodeTag type;
|
2239
|
-
List *groupClause; /* applicable subset of parse->groupClause */
|
2240
|
-
List *gsets; /* lists of integer indexes into groupClause */
|
2241
|
-
List *gsets_data; /* list of GroupingSetData */
|
2242
|
-
Cardinality numGroups; /* est. number of result groups */
|
2243
|
-
bool hashable; /* can be hashed */
|
2244
|
-
bool is_hashed; /* to be implemented as a hashagg */
|
2245
|
-
} RollupData;
|
2246
|
-
|
2247
|
-
/*
|
2248
|
-
* GroupingSetsPath represents a GROUPING SETS aggregation
|
2249
|
-
*/
|
2250
|
-
|
2251
|
-
typedef struct GroupingSetsPath
|
2252
|
-
{
|
2253
|
-
Path path;
|
2254
|
-
Path *subpath; /* path representing input source */
|
2255
|
-
AggStrategy aggstrategy; /* basic strategy */
|
2256
|
-
List *rollups; /* list of RollupData */
|
2257
|
-
List *qual; /* quals (HAVING quals), if any */
|
2258
|
-
uint64 transitionSpace; /* for pass-by-ref transition data */
|
2259
|
-
} GroupingSetsPath;
|
2260
|
-
|
2261
|
-
/*
|
2262
|
-
* MinMaxAggPath represents computation of MIN/MAX aggregates from indexes
|
2263
|
-
*/
|
2264
|
-
typedef struct MinMaxAggPath
|
2265
|
-
{
|
2266
|
-
Path path;
|
2267
|
-
List *mmaggregates; /* list of MinMaxAggInfo */
|
2268
|
-
List *quals; /* HAVING quals, if any */
|
2269
|
-
} MinMaxAggPath;
|
2270
|
-
|
2271
|
-
/*
|
2272
|
-
* WindowAggPath represents generic computation of window functions
|
2273
|
-
*/
|
2274
|
-
typedef struct WindowAggPath
|
2275
|
-
{
|
2276
|
-
Path path;
|
2277
|
-
Path *subpath; /* path representing input source */
|
2278
|
-
WindowClause *winclause; /* WindowClause we'll be using */
|
2279
|
-
List *qual; /* lower-level WindowAgg runconditions */
|
2280
|
-
bool topwindow; /* false for all apart from the WindowAgg
|
2281
|
-
* that's closest to the root of the plan */
|
2282
|
-
} WindowAggPath;
|
2283
|
-
|
2284
|
-
/*
|
2285
|
-
* SetOpPath represents a set-operation, that is INTERSECT or EXCEPT
|
2286
|
-
*/
|
2287
|
-
typedef struct SetOpPath
|
2288
|
-
{
|
2289
|
-
Path path;
|
2290
|
-
Path *subpath; /* path representing input source */
|
2291
|
-
SetOpCmd cmd; /* what to do, see nodes.h */
|
2292
|
-
SetOpStrategy strategy; /* how to do it, see nodes.h */
|
2293
|
-
List *distinctList; /* SortGroupClauses identifying target cols */
|
2294
|
-
AttrNumber flagColIdx; /* where is the flag column, if any */
|
2295
|
-
int firstFlag; /* flag value for first input relation */
|
2296
|
-
Cardinality numGroups; /* estimated number of groups in input */
|
2297
|
-
} SetOpPath;
|
2298
|
-
|
2299
|
-
/*
|
2300
|
-
* RecursiveUnionPath represents a recursive UNION node
|
2301
|
-
*/
|
2302
|
-
typedef struct RecursiveUnionPath
|
2303
|
-
{
|
2304
|
-
Path path;
|
2305
|
-
Path *leftpath; /* paths representing input sources */
|
2306
|
-
Path *rightpath;
|
2307
|
-
List *distinctList; /* SortGroupClauses identifying target cols */
|
2308
|
-
int wtParam; /* ID of Param representing work table */
|
2309
|
-
Cardinality numGroups; /* estimated number of groups in input */
|
2310
|
-
} RecursiveUnionPath;
|
2311
|
-
|
2312
|
-
/*
|
2313
|
-
* LockRowsPath represents acquiring row locks for SELECT FOR UPDATE/SHARE
|
2314
|
-
*/
|
2315
|
-
typedef struct LockRowsPath
|
2316
|
-
{
|
2317
|
-
Path path;
|
2318
|
-
Path *subpath; /* path representing input source */
|
2319
|
-
List *rowMarks; /* a list of PlanRowMark's */
|
2320
|
-
int epqParam; /* ID of Param for EvalPlanQual re-eval */
|
2321
|
-
} LockRowsPath;
|
2322
|
-
|
2323
|
-
/*
|
2324
|
-
* ModifyTablePath represents performing INSERT/UPDATE/DELETE/MERGE
|
2325
|
-
*
|
2326
|
-
* We represent most things that will be in the ModifyTable plan node
|
2327
|
-
* literally, except we have a child Path not Plan. But analysis of the
|
2328
|
-
* OnConflictExpr is deferred to createplan.c, as is collection of FDW data.
|
2329
|
-
*/
|
2330
|
-
typedef struct ModifyTablePath
|
2331
|
-
{
|
2332
|
-
Path path;
|
2333
|
-
Path *subpath; /* Path producing source data */
|
2334
|
-
CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */
|
2335
|
-
bool canSetTag; /* do we set the command tag/es_processed? */
|
2336
|
-
Index nominalRelation; /* Parent RT index for use of EXPLAIN */
|
2337
|
-
Index rootRelation; /* Root RT index, if partitioned/inherited */
|
2338
|
-
bool partColsUpdated; /* some part key in hierarchy updated? */
|
2339
|
-
List *resultRelations; /* integer list of RT indexes */
|
2340
|
-
List *updateColnosLists; /* per-target-table update_colnos lists */
|
2341
|
-
List *withCheckOptionLists; /* per-target-table WCO lists */
|
2342
|
-
List *returningLists; /* per-target-table RETURNING tlists */
|
2343
|
-
List *rowMarks; /* PlanRowMarks (non-locking only) */
|
2344
|
-
OnConflictExpr *onconflict; /* ON CONFLICT clause, or NULL */
|
2345
|
-
int epqParam; /* ID of Param for EvalPlanQual re-eval */
|
2346
|
-
List *mergeActionLists; /* per-target-table lists of actions for
|
2347
|
-
* MERGE */
|
2348
|
-
} ModifyTablePath;
|
2349
|
-
|
2350
|
-
/*
|
2351
|
-
* LimitPath represents applying LIMIT/OFFSET restrictions
|
2352
|
-
*/
|
2353
|
-
typedef struct LimitPath
|
2354
|
-
{
|
2355
|
-
Path path;
|
2356
|
-
Path *subpath; /* path representing input source */
|
2357
|
-
Node *limitOffset; /* OFFSET parameter, or NULL if none */
|
2358
|
-
Node *limitCount; /* COUNT parameter, or NULL if none */
|
2359
|
-
LimitOption limitOption; /* FETCH FIRST with ties or exact number */
|
2360
|
-
} LimitPath;
|
2361
|
-
|
2362
|
-
|
2363
|
-
/*
|
2364
|
-
* Restriction clause info.
|
2365
|
-
*
|
2366
|
-
* We create one of these for each AND sub-clause of a restriction condition
|
2367
|
-
* (WHERE or JOIN/ON clause). Since the restriction clauses are logically
|
2368
|
-
* ANDed, we can use any one of them or any subset of them to filter out
|
2369
|
-
* tuples, without having to evaluate the rest. The RestrictInfo node itself
|
2370
|
-
* stores data used by the optimizer while choosing the best query plan.
|
2371
|
-
*
|
2372
|
-
* If a restriction clause references a single base relation, it will appear
|
2373
|
-
* in the baserestrictinfo list of the RelOptInfo for that base rel.
|
2374
|
-
*
|
2375
|
-
* If a restriction clause references more than one base+OJ relation, it will
|
2376
|
-
* appear in the joininfo list of every RelOptInfo that describes a strict
|
2377
|
-
* subset of the relations mentioned in the clause. The joininfo lists are
|
2378
|
-
* used to drive join tree building by selecting plausible join candidates.
|
2379
|
-
* The clause cannot actually be applied until we have built a join rel
|
2380
|
-
* containing all the relations it references, however.
|
2381
|
-
*
|
2382
|
-
* When we construct a join rel that includes all the relations referenced
|
2383
|
-
* in a multi-relation restriction clause, we place that clause into the
|
2384
|
-
* joinrestrictinfo lists of paths for the join rel, if neither left nor
|
2385
|
-
* right sub-path includes all relations referenced in the clause. The clause
|
2386
|
-
* will be applied at that join level, and will not propagate any further up
|
2387
|
-
* the join tree. (Note: the "predicate migration" code was once intended to
|
2388
|
-
* push restriction clauses up and down the plan tree based on evaluation
|
2389
|
-
* costs, but it's dead code and is unlikely to be resurrected in the
|
2390
|
-
* foreseeable future.)
|
2391
|
-
*
|
2392
|
-
* Note that in the presence of more than two rels, a multi-rel restriction
|
2393
|
-
* might reach different heights in the join tree depending on the join
|
2394
|
-
* sequence we use. So, these clauses cannot be associated directly with
|
2395
|
-
* the join RelOptInfo, but must be kept track of on a per-join-path basis.
|
2396
|
-
*
|
2397
|
-
* RestrictInfos that represent equivalence conditions (i.e., mergejoinable
|
2398
|
-
* equalities that are not outerjoin-delayed) are handled a bit differently.
|
2399
|
-
* Initially we attach them to the EquivalenceClasses that are derived from
|
2400
|
-
* them. When we construct a scan or join path, we look through all the
|
2401
|
-
* EquivalenceClasses and generate derived RestrictInfos representing the
|
2402
|
-
* minimal set of conditions that need to be checked for this particular scan
|
2403
|
-
* or join to enforce that all members of each EquivalenceClass are in fact
|
2404
|
-
* equal in all rows emitted by the scan or join.
|
2405
|
-
*
|
2406
|
-
* The clause_relids field lists the base plus outer-join RT indexes that
|
2407
|
-
* actually appear in the clause. required_relids lists the minimum set of
|
2408
|
-
* relids needed to evaluate the clause; while this is often equal to
|
2409
|
-
* clause_relids, it can be more. We will add relids to required_relids when
|
2410
|
-
* we need to force an outer join ON clause to be evaluated exactly at the
|
2411
|
-
* level of the outer join, which is true except when it is a "degenerate"
|
2412
|
-
* condition that references only Vars from the nullable side of the join.
|
2413
|
-
*
|
2414
|
-
* RestrictInfo nodes contain a flag to indicate whether a qual has been
|
2415
|
-
* pushed down to a lower level than its original syntactic placement in the
|
2416
|
-
* join tree would suggest. If an outer join prevents us from pushing a qual
|
2417
|
-
* down to its "natural" semantic level (the level associated with just the
|
2418
|
-
* base rels used in the qual) then we mark the qual with a "required_relids"
|
2419
|
-
* value including more than just the base rels it actually uses. By
|
2420
|
-
* pretending that the qual references all the rels required to form the outer
|
2421
|
-
* join, we prevent it from being evaluated below the outer join's joinrel.
|
2422
|
-
* When we do form the outer join's joinrel, we still need to distinguish
|
2423
|
-
* those quals that are actually in that join's JOIN/ON condition from those
|
2424
|
-
* that appeared elsewhere in the tree and were pushed down to the join rel
|
2425
|
-
* because they used no other rels. That's what the is_pushed_down flag is
|
2426
|
-
* for; it tells us that a qual is not an OUTER JOIN qual for the set of base
|
2427
|
-
* rels listed in required_relids. A clause that originally came from WHERE
|
2428
|
-
* or an INNER JOIN condition will *always* have its is_pushed_down flag set.
|
2429
|
-
* It's possible for an OUTER JOIN clause to be marked is_pushed_down too,
|
2430
|
-
* if we decide that it can be pushed down into the nullable side of the join.
|
2431
|
-
* In that case it acts as a plain filter qual for wherever it gets evaluated.
|
2432
|
-
* (In short, is_pushed_down is only false for non-degenerate outer join
|
2433
|
-
* conditions. Possibly we should rename it to reflect that meaning? But
|
2434
|
-
* see also the comments for RINFO_IS_PUSHED_DOWN, below.)
|
2435
|
-
*
|
2436
|
-
* There is also an incompatible_relids field, which is a set of outer-join
|
2437
|
-
* relids above which we cannot evaluate the clause (because they might null
|
2438
|
-
* Vars it uses that should not be nulled yet). In principle this could be
|
2439
|
-
* filled in any RestrictInfo as the set of OJ relids that appear above the
|
2440
|
-
* clause and null Vars that it uses. In practice we only bother to populate
|
2441
|
-
* it for "clone" clauses, as it's currently only needed to prevent multiple
|
2442
|
-
* clones of the same clause from being accepted for evaluation at the same
|
2443
|
-
* join level.
|
2444
|
-
*
|
2445
|
-
* There is also an outer_relids field, which is NULL except for outer join
|
2446
|
-
* clauses; for those, it is the set of relids on the outer side of the
|
2447
|
-
* clause's outer join. (These are rels that the clause cannot be applied to
|
2448
|
-
* in parameterized scans, since pushing it into the join's outer side would
|
2449
|
-
* lead to wrong answers.)
|
2450
|
-
*
|
2451
|
-
* To handle security-barrier conditions efficiently, we mark RestrictInfo
|
2452
|
-
* nodes with a security_level field, in which higher values identify clauses
|
2453
|
-
* coming from less-trusted sources. The exact semantics are that a clause
|
2454
|
-
* cannot be evaluated before another clause with a lower security_level value
|
2455
|
-
* unless the first clause is leakproof. As with outer-join clauses, this
|
2456
|
-
* creates a reason for clauses to sometimes need to be evaluated higher in
|
2457
|
-
* the join tree than their contents would suggest; and even at a single plan
|
2458
|
-
* node, this rule constrains the order of application of clauses.
|
2459
|
-
*
|
2460
|
-
* In general, the referenced clause might be arbitrarily complex. The
|
2461
|
-
* kinds of clauses we can handle as indexscan quals, mergejoin clauses,
|
2462
|
-
* or hashjoin clauses are limited (e.g., no volatile functions). The code
|
2463
|
-
* for each kind of path is responsible for identifying the restrict clauses
|
2464
|
-
* it can use and ignoring the rest. Clauses not implemented by an indexscan,
|
2465
|
-
* mergejoin, or hashjoin will be placed in the plan qual or joinqual field
|
2466
|
-
* of the finished Plan node, where they will be enforced by general-purpose
|
2467
|
-
* qual-expression-evaluation code. (But we are still entitled to count
|
2468
|
-
* their selectivity when estimating the result tuple count, if we
|
2469
|
-
* can guess what it is...)
|
2470
|
-
*
|
2471
|
-
* When the referenced clause is an OR clause, we generate a modified copy
|
2472
|
-
* in which additional RestrictInfo nodes are inserted below the top-level
|
2473
|
-
* OR/AND structure. This is a convenience for OR indexscan processing:
|
2474
|
-
* indexquals taken from either the top level or an OR subclause will have
|
2475
|
-
* associated RestrictInfo nodes.
|
2476
|
-
*
|
2477
|
-
* The can_join flag is set true if the clause looks potentially useful as
|
2478
|
-
* a merge or hash join clause, that is if it is a binary opclause with
|
2479
|
-
* nonoverlapping sets of relids referenced in the left and right sides.
|
2480
|
-
* (Whether the operator is actually merge or hash joinable isn't checked,
|
2481
|
-
* however.)
|
2482
|
-
*
|
2483
|
-
* The pseudoconstant flag is set true if the clause contains no Vars of
|
2484
|
-
* the current query level and no volatile functions. Such a clause can be
|
2485
|
-
* pulled out and used as a one-time qual in a gating Result node. We keep
|
2486
|
-
* pseudoconstant clauses in the same lists as other RestrictInfos so that
|
2487
|
-
* the regular clause-pushing machinery can assign them to the correct join
|
2488
|
-
* level, but they need to be treated specially for cost and selectivity
|
2489
|
-
* estimates. Note that a pseudoconstant clause can never be an indexqual
|
2490
|
-
* or merge or hash join clause, so it's of no interest to large parts of
|
2491
|
-
* the planner.
|
2492
|
-
*
|
2493
|
-
* When we generate multiple versions of a clause so as to have versions
|
2494
|
-
* that will work after commuting some left joins per outer join identity 3,
|
2495
|
-
* we mark the one with the fewest nullingrels bits with has_clone = true,
|
2496
|
-
* and the rest with is_clone = true. This allows proper filtering of
|
2497
|
-
* these redundant clauses, so that we apply only one version of them.
|
2498
|
-
*
|
2499
|
-
* When join clauses are generated from EquivalenceClasses, there may be
|
2500
|
-
* several equally valid ways to enforce join equivalence, of which we need
|
2501
|
-
* apply only one. We mark clauses of this kind by setting parent_ec to
|
2502
|
-
* point to the generating EquivalenceClass. Multiple clauses with the same
|
2503
|
-
* parent_ec in the same join are redundant.
|
2504
|
-
*
|
2505
|
-
* Most fields are ignored for equality, since they may not be set yet, and
|
2506
|
-
* should be derivable from the clause anyway.
|
2507
|
-
*
|
2508
|
-
* parent_ec, left_ec, right_ec are not printed, lest it lead to infinite
|
2509
|
-
* recursion in plan tree dump.
|
2510
|
-
*/
|
2511
|
-
|
2512
|
-
typedef struct RestrictInfo
|
2513
|
-
{
|
2514
|
-
pg_node_attr(no_read, no_query_jumble)
|
2515
|
-
|
2516
|
-
NodeTag type;
|
2517
|
-
|
2518
|
-
/* the represented clause of WHERE or JOIN */
|
2519
|
-
Expr *clause;
|
2520
|
-
|
2521
|
-
/* true if clause was pushed down in level */
|
2522
|
-
bool is_pushed_down;
|
2523
|
-
|
2524
|
-
/* see comment above */
|
2525
|
-
bool can_join pg_node_attr(equal_ignore);
|
2526
|
-
|
2527
|
-
/* see comment above */
|
2528
|
-
bool pseudoconstant pg_node_attr(equal_ignore);
|
2529
|
-
|
2530
|
-
/* see comment above */
|
2531
|
-
bool has_clone;
|
2532
|
-
bool is_clone;
|
2533
|
-
|
2534
|
-
/* true if known to contain no leaked Vars */
|
2535
|
-
bool leakproof pg_node_attr(equal_ignore);
|
2536
|
-
|
2537
|
-
/* indicates if clause contains any volatile functions */
|
2538
|
-
VolatileFunctionStatus has_volatile pg_node_attr(equal_ignore);
|
2539
|
-
|
2540
|
-
/* see comment above */
|
2541
|
-
Index security_level;
|
2542
|
-
|
2543
|
-
/* number of base rels in clause_relids */
|
2544
|
-
int num_base_rels pg_node_attr(equal_ignore);
|
2545
|
-
|
2546
|
-
/* The relids (varnos+varnullingrels) actually referenced in the clause: */
|
2547
|
-
Relids clause_relids pg_node_attr(equal_ignore);
|
2548
|
-
|
2549
|
-
/* The set of relids required to evaluate the clause: */
|
2550
|
-
Relids required_relids;
|
2551
|
-
|
2552
|
-
/* Relids above which we cannot evaluate the clause (see comment above) */
|
2553
|
-
Relids incompatible_relids;
|
2554
|
-
|
2555
|
-
/* If an outer-join clause, the outer-side relations, else NULL: */
|
2556
|
-
Relids outer_relids;
|
2557
|
-
|
2558
|
-
/*
|
2559
|
-
* Relids in the left/right side of the clause. These fields are set for
|
2560
|
-
* any binary opclause.
|
2561
|
-
*/
|
2562
|
-
Relids left_relids pg_node_attr(equal_ignore);
|
2563
|
-
Relids right_relids pg_node_attr(equal_ignore);
|
2564
|
-
|
2565
|
-
/*
|
2566
|
-
* Modified clause with RestrictInfos. This field is NULL unless clause
|
2567
|
-
* is an OR clause.
|
2568
|
-
*/
|
2569
|
-
Expr *orclause pg_node_attr(equal_ignore);
|
2570
|
-
|
2571
|
-
/*----------
|
2572
|
-
* Serial number of this RestrictInfo. This is unique within the current
|
2573
|
-
* PlannerInfo context, with a few critical exceptions:
|
2574
|
-
* 1. When we generate multiple clones of the same qual condition to
|
2575
|
-
* cope with outer join identity 3, all the clones get the same serial
|
2576
|
-
* number. This reflects that we only want to apply one of them in any
|
2577
|
-
* given plan.
|
2578
|
-
* 2. If we manufacture a commuted version of a qual to use as an index
|
2579
|
-
* condition, it copies the original's rinfo_serial, since it is in
|
2580
|
-
* practice the same condition.
|
2581
|
-
* 3. RestrictInfos made for a child relation copy their parent's
|
2582
|
-
* rinfo_serial. Likewise, when an EquivalenceClass makes a derived
|
2583
|
-
* equality clause for a child relation, it copies the rinfo_serial of
|
2584
|
-
* the matching equality clause for the parent. This allows detection
|
2585
|
-
* of redundant pushed-down equality clauses.
|
2586
|
-
*----------
|
2587
|
-
*/
|
2588
|
-
int rinfo_serial;
|
2589
|
-
|
2590
|
-
/*
|
2591
|
-
* Generating EquivalenceClass. This field is NULL unless clause is
|
2592
|
-
* potentially redundant.
|
2593
|
-
*/
|
2594
|
-
EquivalenceClass *parent_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
|
2595
|
-
|
2596
|
-
/*
|
2597
|
-
* cache space for cost and selectivity
|
2598
|
-
*/
|
2599
|
-
|
2600
|
-
/* eval cost of clause; -1 if not yet set */
|
2601
|
-
QualCost eval_cost pg_node_attr(equal_ignore);
|
2602
|
-
|
2603
|
-
/* selectivity for "normal" (JOIN_INNER) semantics; -1 if not yet set */
|
2604
|
-
Selectivity norm_selec pg_node_attr(equal_ignore);
|
2605
|
-
/* selectivity for outer join semantics; -1 if not yet set */
|
2606
|
-
Selectivity outer_selec pg_node_attr(equal_ignore);
|
2607
|
-
|
2608
|
-
/*
|
2609
|
-
* opfamilies containing clause operator; valid if clause is
|
2610
|
-
* mergejoinable, else NIL
|
2611
|
-
*/
|
2612
|
-
List *mergeopfamilies pg_node_attr(equal_ignore);
|
2613
|
-
|
2614
|
-
/*
|
2615
|
-
* cache space for mergeclause processing; NULL if not yet set
|
2616
|
-
*/
|
2617
|
-
|
2618
|
-
/* EquivalenceClass containing lefthand */
|
2619
|
-
EquivalenceClass *left_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
|
2620
|
-
/* EquivalenceClass containing righthand */
|
2621
|
-
EquivalenceClass *right_ec pg_node_attr(copy_as_scalar, equal_ignore, read_write_ignore);
|
2622
|
-
/* EquivalenceMember for lefthand */
|
2623
|
-
EquivalenceMember *left_em pg_node_attr(copy_as_scalar, equal_ignore);
|
2624
|
-
/* EquivalenceMember for righthand */
|
2625
|
-
EquivalenceMember *right_em pg_node_attr(copy_as_scalar, equal_ignore);
|
2626
|
-
|
2627
|
-
/*
|
2628
|
-
* List of MergeScanSelCache structs. Those aren't Nodes, so hard to
|
2629
|
-
* copy; instead replace with NIL. That has the effect that copying will
|
2630
|
-
* just reset the cache. Likewise, can't compare or print them.
|
2631
|
-
*/
|
2632
|
-
List *scansel_cache pg_node_attr(copy_as(NIL), equal_ignore, read_write_ignore);
|
2633
|
-
|
2634
|
-
/*
|
2635
|
-
* transient workspace for use while considering a specific join path; T =
|
2636
|
-
* outer var on left, F = on right
|
2637
|
-
*/
|
2638
|
-
bool outer_is_left pg_node_attr(equal_ignore);
|
2639
|
-
|
2640
|
-
/*
|
2641
|
-
* copy of clause operator; valid if clause is hashjoinable, else
|
2642
|
-
* InvalidOid
|
2643
|
-
*/
|
2644
|
-
Oid hashjoinoperator pg_node_attr(equal_ignore);
|
2645
|
-
|
2646
|
-
/*
|
2647
|
-
* cache space for hashclause processing; -1 if not yet set
|
2648
|
-
*/
|
2649
|
-
/* avg bucketsize of left side */
|
2650
|
-
Selectivity left_bucketsize pg_node_attr(equal_ignore);
|
2651
|
-
/* avg bucketsize of right side */
|
2652
|
-
Selectivity right_bucketsize pg_node_attr(equal_ignore);
|
2653
|
-
/* left side's most common val's freq */
|
2654
|
-
Selectivity left_mcvfreq pg_node_attr(equal_ignore);
|
2655
|
-
/* right side's most common val's freq */
|
2656
|
-
Selectivity right_mcvfreq pg_node_attr(equal_ignore);
|
2657
|
-
|
2658
|
-
/* hash equality operators used for memoize nodes, else InvalidOid */
|
2659
|
-
Oid left_hasheqoperator pg_node_attr(equal_ignore);
|
2660
|
-
Oid right_hasheqoperator pg_node_attr(equal_ignore);
|
2661
|
-
} RestrictInfo;
|
2662
|
-
|
2663
|
-
/*
|
2664
|
-
* This macro embodies the correct way to test whether a RestrictInfo is
|
2665
|
-
* "pushed down" to a given outer join, that is, should be treated as a filter
|
2666
|
-
* clause rather than a join clause at that outer join. This is certainly so
|
2667
|
-
* if is_pushed_down is true; but examining that is not sufficient anymore,
|
2668
|
-
* because outer-join clauses will get pushed down to lower outer joins when
|
2669
|
-
* we generate a path for the lower outer join that is parameterized by the
|
2670
|
-
* LHS of the upper one. We can detect such a clause by noting that its
|
2671
|
-
* required_relids exceed the scope of the join.
|
2672
|
-
*/
|
2673
|
-
#define RINFO_IS_PUSHED_DOWN(rinfo, joinrelids) \
|
2674
|
-
((rinfo)->is_pushed_down || \
|
2675
|
-
!bms_is_subset((rinfo)->required_relids, joinrelids))
|
2676
|
-
|
2677
|
-
/*
|
2678
|
-
* Since mergejoinscansel() is a relatively expensive function, and would
|
2679
|
-
* otherwise be invoked many times while planning a large join tree,
|
2680
|
-
* we go out of our way to cache its results. Each mergejoinable
|
2681
|
-
* RestrictInfo carries a list of the specific sort orderings that have
|
2682
|
-
* been considered for use with it, and the resulting selectivities.
|
2683
|
-
*/
|
2684
|
-
typedef struct MergeScanSelCache
|
2685
|
-
{
|
2686
|
-
/* Ordering details (cache lookup key) */
|
2687
|
-
Oid opfamily; /* btree opfamily defining the ordering */
|
2688
|
-
Oid collation; /* collation for the ordering */
|
2689
|
-
int strategy; /* sort direction (ASC or DESC) */
|
2690
|
-
bool nulls_first; /* do NULLs come before normal values? */
|
2691
|
-
/* Results */
|
2692
|
-
Selectivity leftstartsel; /* first-join fraction for clause left side */
|
2693
|
-
Selectivity leftendsel; /* last-join fraction for clause left side */
|
2694
|
-
Selectivity rightstartsel; /* first-join fraction for clause right side */
|
2695
|
-
Selectivity rightendsel; /* last-join fraction for clause right side */
|
2696
|
-
} MergeScanSelCache;
|
2697
|
-
|
2698
|
-
/*
|
2699
|
-
* Placeholder node for an expression to be evaluated below the top level
|
2700
|
-
* of a plan tree. This is used during planning to represent the contained
|
2701
|
-
* expression. At the end of the planning process it is replaced by either
|
2702
|
-
* the contained expression or a Var referring to a lower-level evaluation of
|
2703
|
-
* the contained expression. Generally the evaluation occurs below an outer
|
2704
|
-
* join, and Var references above the outer join might thereby yield NULL
|
2705
|
-
* instead of the expression value.
|
2706
|
-
*
|
2707
|
-
* phrels and phlevelsup correspond to the varno/varlevelsup fields of a
|
2708
|
-
* plain Var, except that phrels has to be a relid set since the evaluation
|
2709
|
-
* level of a PlaceHolderVar might be a join rather than a base relation.
|
2710
|
-
* Likewise, phnullingrels corresponds to varnullingrels.
|
2711
|
-
*
|
2712
|
-
* Although the planner treats this as an expression node type, it is not
|
2713
|
-
* recognized by the parser or executor, so we declare it here rather than
|
2714
|
-
* in primnodes.h.
|
2715
|
-
*
|
2716
|
-
* We intentionally do not compare phexpr. Two PlaceHolderVars with the
|
2717
|
-
* same ID and levelsup should be considered equal even if the contained
|
2718
|
-
* expressions have managed to mutate to different states. This will
|
2719
|
-
* happen during final plan construction when there are nested PHVs, since
|
2720
|
-
* the inner PHV will get replaced by a Param in some copies of the outer
|
2721
|
-
* PHV. Another way in which it can happen is that initplan sublinks
|
2722
|
-
* could get replaced by differently-numbered Params when sublink folding
|
2723
|
-
* is done. (The end result of such a situation would be some
|
2724
|
-
* unreferenced initplans, which is annoying but not really a problem.)
|
2725
|
-
* On the same reasoning, there is no need to examine phrels. But we do
|
2726
|
-
* need to compare phnullingrels, as that represents effects that are
|
2727
|
-
* external to the original value of the PHV.
|
2728
|
-
*/
|
2729
|
-
|
2730
|
-
typedef struct PlaceHolderVar
|
2731
|
-
{
|
2732
|
-
pg_node_attr(no_query_jumble)
|
2733
|
-
|
2734
|
-
Expr xpr;
|
2735
|
-
|
2736
|
-
/* the represented expression */
|
2737
|
-
Expr *phexpr pg_node_attr(equal_ignore);
|
2738
|
-
|
2739
|
-
/* base+OJ relids syntactically within expr src */
|
2740
|
-
Relids phrels pg_node_attr(equal_ignore);
|
2741
|
-
|
2742
|
-
/* RT indexes of outer joins that can null PHV's value */
|
2743
|
-
Relids phnullingrels;
|
2744
|
-
|
2745
|
-
/* ID for PHV (unique within planner run) */
|
2746
|
-
Index phid;
|
2747
|
-
|
2748
|
-
/* > 0 if PHV belongs to outer query */
|
2749
|
-
Index phlevelsup;
|
2750
|
-
} PlaceHolderVar;
|
2751
|
-
|
2752
|
-
/*
|
2753
|
-
* "Special join" info.
|
2754
|
-
*
|
2755
|
-
* One-sided outer joins constrain the order of joining partially but not
|
2756
|
-
* completely. We flatten such joins into the planner's top-level list of
|
2757
|
-
* relations to join, but record information about each outer join in a
|
2758
|
-
* SpecialJoinInfo struct. These structs are kept in the PlannerInfo node's
|
2759
|
-
* join_info_list.
|
2760
|
-
*
|
2761
|
-
* Similarly, semijoins and antijoins created by flattening IN (subselect)
|
2762
|
-
* and EXISTS(subselect) clauses create partial constraints on join order.
|
2763
|
-
* These are likewise recorded in SpecialJoinInfo structs.
|
2764
|
-
*
|
2765
|
-
* We make SpecialJoinInfos for FULL JOINs even though there is no flexibility
|
2766
|
-
* of planning for them, because this simplifies make_join_rel()'s API.
|
2767
|
-
*
|
2768
|
-
* min_lefthand and min_righthand are the sets of base+OJ relids that must be
|
2769
|
-
* available on each side when performing the special join.
|
2770
|
-
* It is not valid for either min_lefthand or min_righthand to be empty sets;
|
2771
|
-
* if they were, this would break the logic that enforces join order.
|
2772
|
-
*
|
2773
|
-
* syn_lefthand and syn_righthand are the sets of base+OJ relids that are
|
2774
|
-
* syntactically below this special join. (These are needed to help compute
|
2775
|
-
* min_lefthand and min_righthand for higher joins.)
|
2776
|
-
*
|
2777
|
-
* jointype is never JOIN_RIGHT; a RIGHT JOIN is handled by switching
|
2778
|
-
* the inputs to make it a LEFT JOIN. It's never JOIN_RIGHT_ANTI either.
|
2779
|
-
* So the allowed values of jointype in a join_info_list member are only
|
2780
|
-
* LEFT, FULL, SEMI, or ANTI.
|
2781
|
-
*
|
2782
|
-
* ojrelid is the RT index of the join RTE representing this outer join,
|
2783
|
-
* if there is one. It is zero when jointype is INNER or SEMI, and can be
|
2784
|
-
* zero for jointype ANTI (if the join was transformed from a SEMI join).
|
2785
|
-
* One use for this field is that when constructing the output targetlist of a
|
2786
|
-
* join relation that implements this OJ, we add ojrelid to the varnullingrels
|
2787
|
-
* and phnullingrels fields of nullable (RHS) output columns, so that the
|
2788
|
-
* output Vars and PlaceHolderVars correctly reflect the nulling that has
|
2789
|
-
* potentially happened to them.
|
2790
|
-
*
|
2791
|
-
* commute_above_l is filled with the relids of syntactically-higher outer
|
2792
|
-
* joins that have been found to commute with this one per outer join identity
|
2793
|
-
* 3 (see optimizer/README), when this join is in the LHS of the upper join
|
2794
|
-
* (so, this is the lower join in the first form of the identity).
|
2795
|
-
*
|
2796
|
-
* commute_above_r is filled with the relids of syntactically-higher outer
|
2797
|
-
* joins that have been found to commute with this one per outer join identity
|
2798
|
-
* 3, when this join is in the RHS of the upper join (so, this is the lower
|
2799
|
-
* join in the second form of the identity).
|
2800
|
-
*
|
2801
|
-
* commute_below_l is filled with the relids of syntactically-lower outer
|
2802
|
-
* joins that have been found to commute with this one per outer join identity
|
2803
|
-
* 3 and are in the LHS of this join (so, this is the upper join in the first
|
2804
|
-
* form of the identity).
|
2805
|
-
*
|
2806
|
-
* commute_below_r is filled with the relids of syntactically-lower outer
|
2807
|
-
* joins that have been found to commute with this one per outer join identity
|
2808
|
-
* 3 and are in the RHS of this join (so, this is the upper join in the second
|
2809
|
-
* form of the identity).
|
2810
|
-
*
|
2811
|
-
* lhs_strict is true if the special join's condition cannot succeed when the
|
2812
|
-
* LHS variables are all NULL (this means that an outer join can commute with
|
2813
|
-
* upper-level outer joins even if it appears in their RHS). We don't bother
|
2814
|
-
* to set lhs_strict for FULL JOINs, however.
|
2815
|
-
*
|
2816
|
-
* For a semijoin, we also extract the join operators and their RHS arguments
|
2817
|
-
* and set semi_operators, semi_rhs_exprs, semi_can_btree, and semi_can_hash.
|
2818
|
-
* This is done in support of possibly unique-ifying the RHS, so we don't
|
2819
|
-
* bother unless at least one of semi_can_btree and semi_can_hash can be set
|
2820
|
-
* true. (You might expect that this information would be computed during
|
2821
|
-
* join planning; but it's helpful to have it available during planning of
|
2822
|
-
* parameterized table scans, so we store it in the SpecialJoinInfo structs.)
|
2823
|
-
*
|
2824
|
-
* For purposes of join selectivity estimation, we create transient
|
2825
|
-
* SpecialJoinInfo structures for regular inner joins; so it is possible
|
2826
|
-
* to have jointype == JOIN_INNER in such a structure, even though this is
|
2827
|
-
* not allowed within join_info_list. We also create transient
|
2828
|
-
* SpecialJoinInfos with jointype == JOIN_INNER for outer joins, since for
|
2829
|
-
* cost estimation purposes it is sometimes useful to know the join size under
|
2830
|
-
* plain innerjoin semantics. Note that lhs_strict and the semi_xxx fields
|
2831
|
-
* are not set meaningfully within such structs.
|
2832
|
-
*/
|
2833
|
-
#ifndef HAVE_SPECIALJOININFO_TYPEDEF
|
2834
|
-
typedef struct SpecialJoinInfo SpecialJoinInfo;
|
2835
|
-
#define HAVE_SPECIALJOININFO_TYPEDEF 1
|
2836
|
-
#endif
|
2837
|
-
|
2838
|
-
struct SpecialJoinInfo
|
2839
|
-
{
|
2840
|
-
pg_node_attr(no_read, no_query_jumble)
|
2841
|
-
|
2842
|
-
NodeTag type;
|
2843
|
-
Relids min_lefthand; /* base+OJ relids in minimum LHS for join */
|
2844
|
-
Relids min_righthand; /* base+OJ relids in minimum RHS for join */
|
2845
|
-
Relids syn_lefthand; /* base+OJ relids syntactically within LHS */
|
2846
|
-
Relids syn_righthand; /* base+OJ relids syntactically within RHS */
|
2847
|
-
JoinType jointype; /* always INNER, LEFT, FULL, SEMI, or ANTI */
|
2848
|
-
Index ojrelid; /* outer join's RT index; 0 if none */
|
2849
|
-
Relids commute_above_l; /* commuting OJs above this one, if LHS */
|
2850
|
-
Relids commute_above_r; /* commuting OJs above this one, if RHS */
|
2851
|
-
Relids commute_below_l; /* commuting OJs in this one's LHS */
|
2852
|
-
Relids commute_below_r; /* commuting OJs in this one's RHS */
|
2853
|
-
bool lhs_strict; /* joinclause is strict for some LHS rel */
|
2854
|
-
/* Remaining fields are set only for JOIN_SEMI jointype: */
|
2855
|
-
bool semi_can_btree; /* true if semi_operators are all btree */
|
2856
|
-
bool semi_can_hash; /* true if semi_operators are all hash */
|
2857
|
-
List *semi_operators; /* OIDs of equality join operators */
|
2858
|
-
List *semi_rhs_exprs; /* righthand-side expressions of these ops */
|
2859
|
-
};
|
2860
|
-
|
2861
|
-
/*
|
2862
|
-
* Transient outer-join clause info.
|
2863
|
-
*
|
2864
|
-
* We set aside every outer join ON clause that looks mergejoinable,
|
2865
|
-
* and process it specially at the end of qual distribution.
|
2866
|
-
*/
|
2867
|
-
typedef struct OuterJoinClauseInfo
|
2868
|
-
{
|
2869
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
2870
|
-
|
2871
|
-
NodeTag type;
|
2872
|
-
RestrictInfo *rinfo; /* a mergejoinable outer-join clause */
|
2873
|
-
SpecialJoinInfo *sjinfo; /* the outer join's SpecialJoinInfo */
|
2874
|
-
} OuterJoinClauseInfo;
|
2875
|
-
|
2876
|
-
/*
|
2877
|
-
* Append-relation info.
|
2878
|
-
*
|
2879
|
-
* When we expand an inheritable table or a UNION-ALL subselect into an
|
2880
|
-
* "append relation" (essentially, a list of child RTEs), we build an
|
2881
|
-
* AppendRelInfo for each child RTE. The list of AppendRelInfos indicates
|
2882
|
-
* which child RTEs must be included when expanding the parent, and each node
|
2883
|
-
* carries information needed to translate between columns of the parent and
|
2884
|
-
* columns of the child.
|
2885
|
-
*
|
2886
|
-
* These structs are kept in the PlannerInfo node's append_rel_list, with
|
2887
|
-
* append_rel_array[] providing a convenient lookup method for the struct
|
2888
|
-
* associated with a particular child relid (there can be only one, though
|
2889
|
-
* parent rels may have many entries in append_rel_list).
|
2890
|
-
*
|
2891
|
-
* Note: after completion of the planner prep phase, any given RTE is an
|
2892
|
-
* append parent having entries in append_rel_list if and only if its
|
2893
|
-
* "inh" flag is set. We clear "inh" for plain tables that turn out not
|
2894
|
-
* to have inheritance children, and (in an abuse of the original meaning
|
2895
|
-
* of the flag) we set "inh" for subquery RTEs that turn out to be
|
2896
|
-
* flattenable UNION ALL queries. This lets us avoid useless searches
|
2897
|
-
* of append_rel_list.
|
2898
|
-
*
|
2899
|
-
* Note: the data structure assumes that append-rel members are single
|
2900
|
-
* baserels. This is OK for inheritance, but it prevents us from pulling
|
2901
|
-
* up a UNION ALL member subquery if it contains a join. While that could
|
2902
|
-
* be fixed with a more complex data structure, at present there's not much
|
2903
|
-
* point because no improvement in the plan could result.
|
2904
|
-
*/
|
2905
|
-
|
2906
|
-
typedef struct AppendRelInfo
|
2907
|
-
{
|
2908
|
-
pg_node_attr(no_query_jumble)
|
2909
|
-
|
2910
|
-
NodeTag type;
|
2911
|
-
|
2912
|
-
/*
|
2913
|
-
* These fields uniquely identify this append relationship. There can be
|
2914
|
-
* (in fact, always should be) multiple AppendRelInfos for the same
|
2915
|
-
* parent_relid, but never more than one per child_relid, since a given
|
2916
|
-
* RTE cannot be a child of more than one append parent.
|
2917
|
-
*/
|
2918
|
-
Index parent_relid; /* RT index of append parent rel */
|
2919
|
-
Index child_relid; /* RT index of append child rel */
|
2920
|
-
|
2921
|
-
/*
|
2922
|
-
* For an inheritance appendrel, the parent and child are both regular
|
2923
|
-
* relations, and we store their rowtype OIDs here for use in translating
|
2924
|
-
* whole-row Vars. For a UNION-ALL appendrel, the parent and child are
|
2925
|
-
* both subqueries with no named rowtype, and we store InvalidOid here.
|
2926
|
-
*/
|
2927
|
-
Oid parent_reltype; /* OID of parent's composite type */
|
2928
|
-
Oid child_reltype; /* OID of child's composite type */
|
2929
|
-
|
2930
|
-
/*
|
2931
|
-
* The N'th element of this list is a Var or expression representing the
|
2932
|
-
* child column corresponding to the N'th column of the parent. This is
|
2933
|
-
* used to translate Vars referencing the parent rel into references to
|
2934
|
-
* the child. A list element is NULL if it corresponds to a dropped
|
2935
|
-
* column of the parent (this is only possible for inheritance cases, not
|
2936
|
-
* UNION ALL). The list elements are always simple Vars for inheritance
|
2937
|
-
* cases, but can be arbitrary expressions in UNION ALL cases.
|
2938
|
-
*
|
2939
|
-
* Notice we only store entries for user columns (attno > 0). Whole-row
|
2940
|
-
* Vars are special-cased, and system columns (attno < 0) need no special
|
2941
|
-
* translation since their attnos are the same for all tables.
|
2942
|
-
*
|
2943
|
-
* Caution: the Vars have varlevelsup = 0. Be careful to adjust as needed
|
2944
|
-
* when copying into a subquery.
|
2945
|
-
*/
|
2946
|
-
List *translated_vars; /* Expressions in the child's Vars */
|
2947
|
-
|
2948
|
-
/*
|
2949
|
-
* This array simplifies translations in the reverse direction, from
|
2950
|
-
* child's column numbers to parent's. The entry at [ccolno - 1] is the
|
2951
|
-
* 1-based parent column number for child column ccolno, or zero if that
|
2952
|
-
* child column is dropped or doesn't exist in the parent.
|
2953
|
-
*/
|
2954
|
-
int num_child_cols; /* length of array */
|
2955
|
-
AttrNumber *parent_colnos pg_node_attr(array_size(num_child_cols));
|
2956
|
-
|
2957
|
-
/*
|
2958
|
-
* We store the parent table's OID here for inheritance, or InvalidOid for
|
2959
|
-
* UNION ALL. This is only needed to help in generating error messages if
|
2960
|
-
* an attempt is made to reference a dropped parent column.
|
2961
|
-
*/
|
2962
|
-
Oid parent_reloid; /* OID of parent relation */
|
2963
|
-
} AppendRelInfo;
|
2964
|
-
|
2965
|
-
/*
|
2966
|
-
* Information about a row-identity "resjunk" column in UPDATE/DELETE/MERGE.
|
2967
|
-
*
|
2968
|
-
* In partitioned UPDATE/DELETE/MERGE it's important for child partitions to
|
2969
|
-
* share row-identity columns whenever possible, so as not to chew up too many
|
2970
|
-
* targetlist columns. We use these structs to track which identity columns
|
2971
|
-
* have been requested. In the finished plan, each of these will give rise
|
2972
|
-
* to one resjunk entry in the targetlist of the ModifyTable's subplan node.
|
2973
|
-
*
|
2974
|
-
* All the Vars stored in RowIdentityVarInfos must have varno ROWID_VAR, for
|
2975
|
-
* convenience of detecting duplicate requests. We'll replace that, in the
|
2976
|
-
* final plan, with the varno of the generating rel.
|
2977
|
-
*
|
2978
|
-
* Outside this list, a Var with varno ROWID_VAR and varattno k is a reference
|
2979
|
-
* to the k-th element of the row_identity_vars list (k counting from 1).
|
2980
|
-
* We add such a reference to root->processed_tlist when creating the entry,
|
2981
|
-
* and it propagates into the plan tree from there.
|
2982
|
-
*/
|
2983
|
-
typedef struct RowIdentityVarInfo
|
2984
|
-
{
|
2985
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
2986
|
-
|
2987
|
-
NodeTag type;
|
2988
|
-
|
2989
|
-
Var *rowidvar; /* Var to be evaluated (but varno=ROWID_VAR) */
|
2990
|
-
int32 rowidwidth; /* estimated average width */
|
2991
|
-
char *rowidname; /* name of the resjunk column */
|
2992
|
-
Relids rowidrels; /* RTE indexes of target rels using this */
|
2993
|
-
} RowIdentityVarInfo;
|
2994
|
-
|
2995
|
-
/*
|
2996
|
-
* For each distinct placeholder expression generated during planning, we
|
2997
|
-
* store a PlaceHolderInfo node in the PlannerInfo node's placeholder_list.
|
2998
|
-
* This stores info that is needed centrally rather than in each copy of the
|
2999
|
-
* PlaceHolderVar. The phid fields identify which PlaceHolderInfo goes with
|
3000
|
-
* each PlaceHolderVar. Note that phid is unique throughout a planner run,
|
3001
|
-
* not just within a query level --- this is so that we need not reassign ID's
|
3002
|
-
* when pulling a subquery into its parent.
|
3003
|
-
*
|
3004
|
-
* The idea is to evaluate the expression at (only) the ph_eval_at join level,
|
3005
|
-
* then allow it to bubble up like a Var until the ph_needed join level.
|
3006
|
-
* ph_needed has the same definition as attr_needed for a regular Var.
|
3007
|
-
*
|
3008
|
-
* The PlaceHolderVar's expression might contain LATERAL references to vars
|
3009
|
-
* coming from outside its syntactic scope. If so, those rels are *not*
|
3010
|
-
* included in ph_eval_at, but they are recorded in ph_lateral.
|
3011
|
-
*
|
3012
|
-
* Notice that when ph_eval_at is a join rather than a single baserel, the
|
3013
|
-
* PlaceHolderInfo may create constraints on join order: the ph_eval_at join
|
3014
|
-
* has to be formed below any outer joins that should null the PlaceHolderVar.
|
3015
|
-
*
|
3016
|
-
* We create a PlaceHolderInfo only after determining that the PlaceHolderVar
|
3017
|
-
* is actually referenced in the plan tree, so that unreferenced placeholders
|
3018
|
-
* don't result in unnecessary constraints on join order.
|
3019
|
-
*/
|
3020
|
-
|
3021
|
-
typedef struct PlaceHolderInfo
|
3022
|
-
{
|
3023
|
-
pg_node_attr(no_read, no_query_jumble)
|
3024
|
-
|
3025
|
-
NodeTag type;
|
3026
|
-
|
3027
|
-
/* ID for PH (unique within planner run) */
|
3028
|
-
Index phid;
|
3029
|
-
|
3030
|
-
/*
|
3031
|
-
* copy of PlaceHolderVar tree (should be redundant for comparison, could
|
3032
|
-
* be ignored)
|
3033
|
-
*/
|
3034
|
-
PlaceHolderVar *ph_var;
|
3035
|
-
|
3036
|
-
/* lowest level we can evaluate value at */
|
3037
|
-
Relids ph_eval_at;
|
3038
|
-
|
3039
|
-
/* relids of contained lateral refs, if any */
|
3040
|
-
Relids ph_lateral;
|
3041
|
-
|
3042
|
-
/* highest level the value is needed at */
|
3043
|
-
Relids ph_needed;
|
3044
|
-
|
3045
|
-
/* estimated attribute width */
|
3046
|
-
int32 ph_width;
|
3047
|
-
} PlaceHolderInfo;
|
3048
|
-
|
3049
|
-
/*
|
3050
|
-
* This struct describes one potentially index-optimizable MIN/MAX aggregate
|
3051
|
-
* function. MinMaxAggPath contains a list of these, and if we accept that
|
3052
|
-
* path, the list is stored into root->minmax_aggs for use during setrefs.c.
|
3053
|
-
*/
|
3054
|
-
typedef struct MinMaxAggInfo
|
3055
|
-
{
|
3056
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
3057
|
-
|
3058
|
-
NodeTag type;
|
3059
|
-
|
3060
|
-
/* pg_proc Oid of the aggregate */
|
3061
|
-
Oid aggfnoid;
|
3062
|
-
|
3063
|
-
/* Oid of its sort operator */
|
3064
|
-
Oid aggsortop;
|
3065
|
-
|
3066
|
-
/* expression we are aggregating on */
|
3067
|
-
Expr *target;
|
3068
|
-
|
3069
|
-
/*
|
3070
|
-
* modified "root" for planning the subquery; not printed, too large, not
|
3071
|
-
* interesting enough
|
3072
|
-
*/
|
3073
|
-
PlannerInfo *subroot pg_node_attr(read_write_ignore);
|
3074
|
-
|
3075
|
-
/* access path for subquery */
|
3076
|
-
Path *path;
|
3077
|
-
|
3078
|
-
/* estimated cost to fetch first row */
|
3079
|
-
Cost pathcost;
|
3080
|
-
|
3081
|
-
/* param for subplan's output */
|
3082
|
-
Param *param;
|
3083
|
-
} MinMaxAggInfo;
|
3084
|
-
|
3085
|
-
/*
|
3086
|
-
* At runtime, PARAM_EXEC slots are used to pass values around from one plan
|
3087
|
-
* node to another. They can be used to pass values down into subqueries (for
|
3088
|
-
* outer references in subqueries), or up out of subqueries (for the results
|
3089
|
-
* of a subplan), or from a NestLoop plan node into its inner relation (when
|
3090
|
-
* the inner scan is parameterized with values from the outer relation).
|
3091
|
-
* The planner is responsible for assigning nonconflicting PARAM_EXEC IDs to
|
3092
|
-
* the PARAM_EXEC Params it generates.
|
3093
|
-
*
|
3094
|
-
* Outer references are managed via root->plan_params, which is a list of
|
3095
|
-
* PlannerParamItems. While planning a subquery, each parent query level's
|
3096
|
-
* plan_params contains the values required from it by the current subquery.
|
3097
|
-
* During create_plan(), we use plan_params to track values that must be
|
3098
|
-
* passed from outer to inner sides of NestLoop plan nodes.
|
3099
|
-
*
|
3100
|
-
* The item a PlannerParamItem represents can be one of three kinds:
|
3101
|
-
*
|
3102
|
-
* A Var: the slot represents a variable of this level that must be passed
|
3103
|
-
* down because subqueries have outer references to it, or must be passed
|
3104
|
-
* from a NestLoop node to its inner scan. The varlevelsup value in the Var
|
3105
|
-
* will always be zero.
|
3106
|
-
*
|
3107
|
-
* A PlaceHolderVar: this works much like the Var case, except that the
|
3108
|
-
* entry is a PlaceHolderVar node with a contained expression. The PHV
|
3109
|
-
* will have phlevelsup = 0, and the contained expression is adjusted
|
3110
|
-
* to match in level.
|
3111
|
-
*
|
3112
|
-
* An Aggref (with an expression tree representing its argument): the slot
|
3113
|
-
* represents an aggregate expression that is an outer reference for some
|
3114
|
-
* subquery. The Aggref itself has agglevelsup = 0, and its argument tree
|
3115
|
-
* is adjusted to match in level.
|
3116
|
-
*
|
3117
|
-
* Note: we detect duplicate Var and PlaceHolderVar parameters and coalesce
|
3118
|
-
* them into one slot, but we do not bother to do that for Aggrefs.
|
3119
|
-
* The scope of duplicate-elimination only extends across the set of
|
3120
|
-
* parameters passed from one query level into a single subquery, or for
|
3121
|
-
* nestloop parameters across the set of nestloop parameters used in a single
|
3122
|
-
* query level. So there is no possibility of a PARAM_EXEC slot being used
|
3123
|
-
* for conflicting purposes.
|
3124
|
-
*
|
3125
|
-
* In addition, PARAM_EXEC slots are assigned for Params representing outputs
|
3126
|
-
* from subplans (values that are setParam items for those subplans). These
|
3127
|
-
* IDs need not be tracked via PlannerParamItems, since we do not need any
|
3128
|
-
* duplicate-elimination nor later processing of the represented expressions.
|
3129
|
-
* Instead, we just record the assignment of the slot number by appending to
|
3130
|
-
* root->glob->paramExecTypes.
|
3131
|
-
*/
|
3132
|
-
typedef struct PlannerParamItem
|
3133
|
-
{
|
3134
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
3135
|
-
|
3136
|
-
NodeTag type;
|
3137
|
-
|
3138
|
-
Node *item; /* the Var, PlaceHolderVar, or Aggref */
|
3139
|
-
int paramId; /* its assigned PARAM_EXEC slot number */
|
3140
|
-
} PlannerParamItem;
|
3141
|
-
|
3142
|
-
/*
|
3143
|
-
* When making cost estimates for a SEMI/ANTI/inner_unique join, there are
|
3144
|
-
* some correction factors that are needed in both nestloop and hash joins
|
3145
|
-
* to account for the fact that the executor can stop scanning inner rows
|
3146
|
-
* as soon as it finds a match to the current outer row. These numbers
|
3147
|
-
* depend only on the selected outer and inner join relations, not on the
|
3148
|
-
* particular paths used for them, so it's worthwhile to calculate them
|
3149
|
-
* just once per relation pair not once per considered path. This struct
|
3150
|
-
* is filled by compute_semi_anti_join_factors and must be passed along
|
3151
|
-
* to the join cost estimation functions.
|
3152
|
-
*
|
3153
|
-
* outer_match_frac is the fraction of the outer tuples that are
|
3154
|
-
* expected to have at least one match.
|
3155
|
-
* match_count is the average number of matches expected for
|
3156
|
-
* outer tuples that have at least one match.
|
3157
|
-
*/
|
3158
|
-
typedef struct SemiAntiJoinFactors
|
3159
|
-
{
|
3160
|
-
Selectivity outer_match_frac;
|
3161
|
-
Selectivity match_count;
|
3162
|
-
} SemiAntiJoinFactors;
|
3163
|
-
|
3164
|
-
/*
|
3165
|
-
* Struct for extra information passed to subroutines of add_paths_to_joinrel
|
3166
|
-
*
|
3167
|
-
* restrictlist contains all of the RestrictInfo nodes for restriction
|
3168
|
-
* clauses that apply to this join
|
3169
|
-
* mergeclause_list is a list of RestrictInfo nodes for available
|
3170
|
-
* mergejoin clauses in this join
|
3171
|
-
* inner_unique is true if each outer tuple provably matches no more
|
3172
|
-
* than one inner tuple
|
3173
|
-
* sjinfo is extra info about special joins for selectivity estimation
|
3174
|
-
* semifactors is as shown above (only valid for SEMI/ANTI/inner_unique joins)
|
3175
|
-
* param_source_rels are OK targets for parameterization of result paths
|
3176
|
-
*/
|
3177
|
-
typedef struct JoinPathExtraData
|
3178
|
-
{
|
3179
|
-
List *restrictlist;
|
3180
|
-
List *mergeclause_list;
|
3181
|
-
bool inner_unique;
|
3182
|
-
SpecialJoinInfo *sjinfo;
|
3183
|
-
SemiAntiJoinFactors semifactors;
|
3184
|
-
Relids param_source_rels;
|
3185
|
-
} JoinPathExtraData;
|
3186
|
-
|
3187
|
-
/*
|
3188
|
-
* Various flags indicating what kinds of grouping are possible.
|
3189
|
-
*
|
3190
|
-
* GROUPING_CAN_USE_SORT should be set if it's possible to perform
|
3191
|
-
* sort-based implementations of grouping. When grouping sets are in use,
|
3192
|
-
* this will be true if sorting is potentially usable for any of the grouping
|
3193
|
-
* sets, even if it's not usable for all of them.
|
3194
|
-
*
|
3195
|
-
* GROUPING_CAN_USE_HASH should be set if it's possible to perform
|
3196
|
-
* hash-based implementations of grouping.
|
3197
|
-
*
|
3198
|
-
* GROUPING_CAN_PARTIAL_AGG should be set if the aggregation is of a type
|
3199
|
-
* for which we support partial aggregation (not, for example, grouping sets).
|
3200
|
-
* It says nothing about parallel-safety or the availability of suitable paths.
|
3201
|
-
*/
|
3202
|
-
#define GROUPING_CAN_USE_SORT 0x0001
|
3203
|
-
#define GROUPING_CAN_USE_HASH 0x0002
|
3204
|
-
#define GROUPING_CAN_PARTIAL_AGG 0x0004
|
3205
|
-
|
3206
|
-
/*
|
3207
|
-
* What kind of partitionwise aggregation is in use?
|
3208
|
-
*
|
3209
|
-
* PARTITIONWISE_AGGREGATE_NONE: Not used.
|
3210
|
-
*
|
3211
|
-
* PARTITIONWISE_AGGREGATE_FULL: Aggregate each partition separately, and
|
3212
|
-
* append the results.
|
3213
|
-
*
|
3214
|
-
* PARTITIONWISE_AGGREGATE_PARTIAL: Partially aggregate each partition
|
3215
|
-
* separately, append the results, and then finalize aggregation.
|
3216
|
-
*/
|
3217
|
-
typedef enum
|
3218
|
-
{
|
3219
|
-
PARTITIONWISE_AGGREGATE_NONE,
|
3220
|
-
PARTITIONWISE_AGGREGATE_FULL,
|
3221
|
-
PARTITIONWISE_AGGREGATE_PARTIAL
|
3222
|
-
} PartitionwiseAggregateType;
|
3223
|
-
|
3224
|
-
/*
|
3225
|
-
* Struct for extra information passed to subroutines of create_grouping_paths
|
3226
|
-
*
|
3227
|
-
* flags indicating what kinds of grouping are possible.
|
3228
|
-
* partial_costs_set is true if the agg_partial_costs and agg_final_costs
|
3229
|
-
* have been initialized.
|
3230
|
-
* agg_partial_costs gives partial aggregation costs.
|
3231
|
-
* agg_final_costs gives finalization costs.
|
3232
|
-
* target_parallel_safe is true if target is parallel safe.
|
3233
|
-
* havingQual gives list of quals to be applied after aggregation.
|
3234
|
-
* targetList gives list of columns to be projected.
|
3235
|
-
* patype is the type of partitionwise aggregation that is being performed.
|
3236
|
-
*/
|
3237
|
-
typedef struct
|
3238
|
-
{
|
3239
|
-
/* Data which remains constant once set. */
|
3240
|
-
int flags;
|
3241
|
-
bool partial_costs_set;
|
3242
|
-
AggClauseCosts agg_partial_costs;
|
3243
|
-
AggClauseCosts agg_final_costs;
|
3244
|
-
|
3245
|
-
/* Data which may differ across partitions. */
|
3246
|
-
bool target_parallel_safe;
|
3247
|
-
Node *havingQual;
|
3248
|
-
List *targetList;
|
3249
|
-
PartitionwiseAggregateType patype;
|
3250
|
-
} GroupPathExtraData;
|
3251
|
-
|
3252
|
-
/*
|
3253
|
-
* Struct for extra information passed to subroutines of grouping_planner
|
3254
|
-
*
|
3255
|
-
* limit_needed is true if we actually need a Limit plan node.
|
3256
|
-
* limit_tuples is an estimated bound on the number of output tuples,
|
3257
|
-
* or -1 if no LIMIT or couldn't estimate.
|
3258
|
-
* count_est and offset_est are the estimated values of the LIMIT and OFFSET
|
3259
|
-
* expressions computed by preprocess_limit() (see comments for
|
3260
|
-
* preprocess_limit() for more information).
|
3261
|
-
*/
|
3262
|
-
typedef struct
|
3263
|
-
{
|
3264
|
-
bool limit_needed;
|
3265
|
-
Cardinality limit_tuples;
|
3266
|
-
int64 count_est;
|
3267
|
-
int64 offset_est;
|
3268
|
-
} FinalPathExtraData;
|
3269
|
-
|
3270
|
-
/*
|
3271
|
-
* For speed reasons, cost estimation for join paths is performed in two
|
3272
|
-
* phases: the first phase tries to quickly derive a lower bound for the
|
3273
|
-
* join cost, and then we check if that's sufficient to reject the path.
|
3274
|
-
* If not, we come back for a more refined cost estimate. The first phase
|
3275
|
-
* fills a JoinCostWorkspace struct with its preliminary cost estimates
|
3276
|
-
* and possibly additional intermediate values. The second phase takes
|
3277
|
-
* these values as inputs to avoid repeating work.
|
3278
|
-
*
|
3279
|
-
* (Ideally we'd declare this in cost.h, but it's also needed in pathnode.h,
|
3280
|
-
* so seems best to put it here.)
|
3281
|
-
*/
|
3282
|
-
typedef struct JoinCostWorkspace
|
3283
|
-
{
|
3284
|
-
/* Preliminary cost estimates --- must not be larger than final ones! */
|
3285
|
-
Cost startup_cost; /* cost expended before fetching any tuples */
|
3286
|
-
Cost total_cost; /* total cost (assuming all tuples fetched) */
|
3287
|
-
|
3288
|
-
/* Fields below here should be treated as private to costsize.c */
|
3289
|
-
Cost run_cost; /* non-startup cost components */
|
3290
|
-
|
3291
|
-
/* private for cost_nestloop code */
|
3292
|
-
Cost inner_run_cost; /* also used by cost_mergejoin code */
|
3293
|
-
Cost inner_rescan_run_cost;
|
3294
|
-
|
3295
|
-
/* private for cost_mergejoin code */
|
3296
|
-
Cardinality outer_rows;
|
3297
|
-
Cardinality inner_rows;
|
3298
|
-
Cardinality outer_skip_rows;
|
3299
|
-
Cardinality inner_skip_rows;
|
3300
|
-
|
3301
|
-
/* private for cost_hashjoin code */
|
3302
|
-
int numbuckets;
|
3303
|
-
int numbatches;
|
3304
|
-
Cardinality inner_rows_total;
|
3305
|
-
} JoinCostWorkspace;
|
3306
|
-
|
3307
|
-
/*
|
3308
|
-
* AggInfo holds information about an aggregate that needs to be computed.
|
3309
|
-
* Multiple Aggrefs in a query can refer to the same AggInfo by having the
|
3310
|
-
* same 'aggno' value, so that the aggregate is computed only once.
|
3311
|
-
*/
|
3312
|
-
typedef struct AggInfo
|
3313
|
-
{
|
3314
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
3315
|
-
|
3316
|
-
NodeTag type;
|
3317
|
-
|
3318
|
-
/*
|
3319
|
-
* List of Aggref exprs that this state value is for.
|
3320
|
-
*
|
3321
|
-
* There will always be at least one, but there can be multiple identical
|
3322
|
-
* Aggref's sharing the same per-agg.
|
3323
|
-
*/
|
3324
|
-
List *aggrefs;
|
3325
|
-
|
3326
|
-
/* Transition state number for this aggregate */
|
3327
|
-
int transno;
|
3328
|
-
|
3329
|
-
/*
|
3330
|
-
* "shareable" is false if this agg cannot share state values with other
|
3331
|
-
* aggregates because the final function is read-write.
|
3332
|
-
*/
|
3333
|
-
bool shareable;
|
3334
|
-
|
3335
|
-
/* Oid of the final function, or InvalidOid if none */
|
3336
|
-
Oid finalfn_oid;
|
3337
|
-
} AggInfo;
|
3338
|
-
|
3339
|
-
/*
|
3340
|
-
* AggTransInfo holds information about transition state that is used by one
|
3341
|
-
* or more aggregates in the query. Multiple aggregates can share the same
|
3342
|
-
* transition state, if they have the same inputs and the same transition
|
3343
|
-
* function. Aggrefs that share the same transition info have the same
|
3344
|
-
* 'aggtransno' value.
|
3345
|
-
*/
|
3346
|
-
typedef struct AggTransInfo
|
3347
|
-
{
|
3348
|
-
pg_node_attr(no_copy_equal, no_read, no_query_jumble)
|
3349
|
-
|
3350
|
-
NodeTag type;
|
3351
|
-
|
3352
|
-
/* Inputs for this transition state */
|
3353
|
-
List *args;
|
3354
|
-
Expr *aggfilter;
|
3355
|
-
|
3356
|
-
/* Oid of the state transition function */
|
3357
|
-
Oid transfn_oid;
|
3358
|
-
|
3359
|
-
/* Oid of the serialization function, or InvalidOid if none */
|
3360
|
-
Oid serialfn_oid;
|
3361
|
-
|
3362
|
-
/* Oid of the deserialization function, or InvalidOid if none */
|
3363
|
-
Oid deserialfn_oid;
|
3364
|
-
|
3365
|
-
/* Oid of the combine function, or InvalidOid if none */
|
3366
|
-
Oid combinefn_oid;
|
3367
|
-
|
3368
|
-
/* Oid of state value's datatype */
|
3369
|
-
Oid aggtranstype;
|
3370
|
-
|
3371
|
-
/* Additional data about transtype */
|
3372
|
-
int32 aggtranstypmod;
|
3373
|
-
int transtypeLen;
|
3374
|
-
bool transtypeByVal;
|
3375
|
-
|
3376
|
-
/* Space-consumption estimate */
|
3377
|
-
int32 aggtransspace;
|
3378
|
-
|
3379
|
-
/* Initial value from pg_aggregate entry */
|
3380
|
-
Datum initValue pg_node_attr(read_write_ignore);
|
3381
|
-
bool initValueIsNull;
|
3382
|
-
} AggTransInfo;
|
3383
|
-
|
3384
|
-
#endif /* PATHNODES_H */
|