gitlab-pg_query 1.3.1 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +217 -99
- data/README.md +92 -69
- data/Rakefile +85 -5
- data/ext/pg_query/extconf.rb +3 -40
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +246 -0
- data/ext/pg_query/include/access/attmap.h +52 -0
- data/ext/pg_query/include/access/attnum.h +64 -0
- data/ext/pg_query/include/access/clog.h +61 -0
- data/ext/pg_query/include/access/commit_ts.h +77 -0
- data/ext/pg_query/include/access/detoast.h +92 -0
- data/ext/pg_query/include/access/genam.h +228 -0
- data/ext/pg_query/include/access/gin.h +78 -0
- data/ext/pg_query/include/access/htup.h +89 -0
- data/ext/pg_query/include/access/htup_details.h +819 -0
- data/ext/pg_query/include/access/itup.h +161 -0
- data/ext/pg_query/include/access/parallel.h +82 -0
- data/ext/pg_query/include/access/printtup.h +35 -0
- data/ext/pg_query/include/access/relation.h +28 -0
- data/ext/pg_query/include/access/relscan.h +176 -0
- data/ext/pg_query/include/access/rmgr.h +35 -0
- data/ext/pg_query/include/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/access/sdir.h +58 -0
- data/ext/pg_query/include/access/skey.h +151 -0
- data/ext/pg_query/include/access/stratnum.h +83 -0
- data/ext/pg_query/include/access/sysattr.h +29 -0
- data/ext/pg_query/include/access/table.h +27 -0
- data/ext/pg_query/include/access/tableam.h +1825 -0
- data/ext/pg_query/include/access/transam.h +265 -0
- data/ext/pg_query/include/access/tupconvert.h +51 -0
- data/ext/pg_query/include/access/tupdesc.h +154 -0
- data/ext/pg_query/include/access/tupmacs.h +247 -0
- data/ext/pg_query/include/access/twophase.h +61 -0
- data/ext/pg_query/include/access/xact.h +463 -0
- data/ext/pg_query/include/access/xlog.h +398 -0
- data/ext/pg_query/include/access/xlog_internal.h +330 -0
- data/ext/pg_query/include/access/xlogdefs.h +109 -0
- data/ext/pg_query/include/access/xloginsert.h +64 -0
- data/ext/pg_query/include/access/xlogreader.h +327 -0
- data/ext/pg_query/include/access/xlogrecord.h +227 -0
- data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
- data/ext/pg_query/include/c.h +1322 -0
- data/ext/pg_query/include/catalog/catalog.h +42 -0
- data/ext/pg_query/include/catalog/catversion.h +58 -0
- data/ext/pg_query/include/catalog/dependency.h +275 -0
- data/ext/pg_query/include/catalog/genbki.h +64 -0
- data/ext/pg_query/include/catalog/index.h +199 -0
- data/ext/pg_query/include/catalog/indexing.h +366 -0
- data/ext/pg_query/include/catalog/namespace.h +188 -0
- data/ext/pg_query/include/catalog/objectaccess.h +197 -0
- data/ext/pg_query/include/catalog/objectaddress.h +84 -0
- data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
- data/ext/pg_query/include/catalog/pg_am.h +60 -0
- data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
- data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
- data/ext/pg_query/include/catalog/pg_authid.h +58 -0
- data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_class.h +200 -0
- data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
- data/ext/pg_query/include/catalog/pg_collation.h +73 -0
- data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
- data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
- data/ext/pg_query/include/catalog/pg_control.h +250 -0
- data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
- data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_depend.h +73 -0
- data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_index.h +80 -0
- data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
- data/ext/pg_query/include/catalog/pg_language.h +67 -0
- data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
- data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
- data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
- data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_operator.h +102 -0
- data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_proc.h +211 -0
- data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
- data/ext/pg_query/include/catalog/pg_publication.h +115 -0
- data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
- data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
- data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
- data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
- data/ext/pg_query/include/catalog/pg_transform.h +45 -0
- data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
- data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
- data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_type.h +372 -0
- data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
- data/ext/pg_query/include/catalog/storage.h +48 -0
- data/ext/pg_query/include/commands/async.h +54 -0
- data/ext/pg_query/include/commands/dbcommands.h +35 -0
- data/ext/pg_query/include/commands/defrem.h +173 -0
- data/ext/pg_query/include/commands/event_trigger.h +88 -0
- data/ext/pg_query/include/commands/explain.h +127 -0
- data/ext/pg_query/include/commands/prepare.h +61 -0
- data/ext/pg_query/include/commands/tablespace.h +67 -0
- data/ext/pg_query/include/commands/trigger.h +277 -0
- data/ext/pg_query/include/commands/user.h +37 -0
- data/ext/pg_query/include/commands/vacuum.h +293 -0
- data/ext/pg_query/include/commands/variable.h +38 -0
- data/ext/pg_query/include/common/file_perm.h +56 -0
- data/ext/pg_query/include/common/hashfn.h +104 -0
- data/ext/pg_query/include/common/ip.h +37 -0
- data/ext/pg_query/include/common/keywords.h +33 -0
- data/ext/pg_query/include/common/kwlookup.h +44 -0
- data/ext/pg_query/include/common/relpath.h +90 -0
- data/ext/pg_query/include/common/string.h +19 -0
- data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
- data/ext/pg_query/include/datatype/timestamp.h +197 -0
- data/ext/pg_query/include/executor/execdesc.h +70 -0
- data/ext/pg_query/include/executor/executor.h +614 -0
- data/ext/pg_query/include/executor/functions.h +41 -0
- data/ext/pg_query/include/executor/instrument.h +101 -0
- data/ext/pg_query/include/executor/spi.h +175 -0
- data/ext/pg_query/include/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/executor/tuptable.h +487 -0
- data/ext/pg_query/include/fmgr.h +775 -0
- data/ext/pg_query/include/funcapi.h +348 -0
- data/ext/pg_query/include/getaddrinfo.h +162 -0
- data/ext/pg_query/include/jit/jit.h +105 -0
- data/ext/pg_query/include/kwlist_d.h +1072 -0
- data/ext/pg_query/include/lib/ilist.h +727 -0
- data/ext/pg_query/include/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/lib/simplehash.h +1059 -0
- data/ext/pg_query/include/lib/stringinfo.h +161 -0
- data/ext/pg_query/include/libpq/auth.h +29 -0
- data/ext/pg_query/include/libpq/crypt.h +46 -0
- data/ext/pg_query/include/libpq/hba.h +140 -0
- data/ext/pg_query/include/libpq/libpq-be.h +326 -0
- data/ext/pg_query/include/libpq/libpq.h +133 -0
- data/ext/pg_query/include/libpq/pqcomm.h +208 -0
- data/ext/pg_query/include/libpq/pqformat.h +210 -0
- data/ext/pg_query/include/libpq/pqsignal.h +42 -0
- data/ext/pg_query/include/mb/pg_wchar.h +672 -0
- data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/miscadmin.h +476 -0
- data/ext/pg_query/include/nodes/bitmapset.h +122 -0
- data/ext/pg_query/include/nodes/execnodes.h +2520 -0
- data/ext/pg_query/include/nodes/extensible.h +160 -0
- data/ext/pg_query/include/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/nodes/makefuncs.h +108 -0
- data/ext/pg_query/include/nodes/memnodes.h +108 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
- data/ext/pg_query/include/nodes/nodes.h +842 -0
- data/ext/pg_query/include/nodes/params.h +170 -0
- data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
- data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
- data/ext/pg_query/include/nodes/pg_list.h +605 -0
- data/ext/pg_query/include/nodes/plannodes.h +1251 -0
- data/ext/pg_query/include/nodes/primnodes.h +1541 -0
- data/ext/pg_query/include/nodes/print.h +34 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/nodes/value.h +61 -0
- data/ext/pg_query/include/optimizer/cost.h +206 -0
- data/ext/pg_query/include/optimizer/geqo.h +88 -0
- data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/optimizer/optimizer.h +199 -0
- data/ext/pg_query/include/optimizer/paths.h +249 -0
- data/ext/pg_query/include/optimizer/planmain.h +119 -0
- data/ext/pg_query/include/parser/analyze.h +49 -0
- data/ext/pg_query/include/parser/gram.h +1067 -0
- data/ext/pg_query/include/parser/gramparse.h +75 -0
- data/ext/pg_query/include/parser/kwlist.h +477 -0
- data/ext/pg_query/include/parser/parse_agg.h +68 -0
- data/ext/pg_query/include/parser/parse_clause.h +54 -0
- data/ext/pg_query/include/parser/parse_coerce.h +97 -0
- data/ext/pg_query/include/parser/parse_collate.h +27 -0
- data/ext/pg_query/include/parser/parse_expr.h +26 -0
- data/ext/pg_query/include/parser/parse_func.h +73 -0
- data/ext/pg_query/include/parser/parse_node.h +327 -0
- data/ext/pg_query/include/parser/parse_oper.h +67 -0
- data/ext/pg_query/include/parser/parse_relation.h +123 -0
- data/ext/pg_query/include/parser/parse_target.h +46 -0
- data/ext/pg_query/include/parser/parse_type.h +60 -0
- data/ext/pg_query/include/parser/parser.h +41 -0
- data/ext/pg_query/include/parser/parsetree.h +61 -0
- data/ext/pg_query/include/parser/scanner.h +152 -0
- data/ext/pg_query/include/parser/scansup.h +30 -0
- data/ext/pg_query/include/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/pg_config.h +989 -0
- data/ext/pg_query/include/pg_config_ext.h +8 -0
- data/ext/pg_query/include/pg_config_manual.h +350 -0
- data/ext/pg_query/include/pg_config_os.h +8 -0
- data/ext/pg_query/include/pg_getopt.h +56 -0
- data/ext/pg_query/include/pg_query.h +121 -0
- data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
- data/ext/pg_query/include/pg_query_json_helper.c +61 -0
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
- data/ext/pg_query/include/pg_trace.h +17 -0
- data/ext/pg_query/include/pgstat.h +1487 -0
- data/ext/pg_query/include/pgtime.h +84 -0
- data/ext/pg_query/include/pl_gram.h +385 -0
- data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/plerrcodes.h +990 -0
- data/ext/pg_query/include/plpgsql.h +1347 -0
- data/ext/pg_query/include/port.h +524 -0
- data/ext/pg_query/include/port/atomics.h +524 -0
- data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
- data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
- data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
- data/ext/pg_query/include/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
- data/ext/pg_query/include/port/atomics/generic.h +401 -0
- data/ext/pg_query/include/port/pg_bitutils.h +226 -0
- data/ext/pg_query/include/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/port/pg_crc32c.h +101 -0
- data/ext/pg_query/include/portability/instr_time.h +256 -0
- data/ext/pg_query/include/postgres.h +764 -0
- data/ext/pg_query/include/postgres_ext.h +74 -0
- data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
- data/ext/pg_query/include/postmaster/bgworker.h +161 -0
- data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
- data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postmaster/fork_process.h +17 -0
- data/ext/pg_query/include/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postmaster/pgarch.h +39 -0
- data/ext/pg_query/include/postmaster/postmaster.h +77 -0
- data/ext/pg_query/include/postmaster/syslogger.h +98 -0
- data/ext/pg_query/include/postmaster/walwriter.h +21 -0
- data/ext/pg_query/include/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
- data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
- data/ext/pg_query/include/regex/regex.h +184 -0
- data/ext/pg_query/include/replication/logicallauncher.h +31 -0
- data/ext/pg_query/include/replication/logicalproto.h +110 -0
- data/ext/pg_query/include/replication/logicalworker.h +19 -0
- data/ext/pg_query/include/replication/origin.h +73 -0
- data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
- data/ext/pg_query/include/replication/slot.h +219 -0
- data/ext/pg_query/include/replication/syncrep.h +115 -0
- data/ext/pg_query/include/replication/walreceiver.h +340 -0
- data/ext/pg_query/include/replication/walsender.h +74 -0
- data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
- data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
- data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/storage/backendid.h +37 -0
- data/ext/pg_query/include/storage/block.h +121 -0
- data/ext/pg_query/include/storage/buf.h +46 -0
- data/ext/pg_query/include/storage/bufmgr.h +292 -0
- data/ext/pg_query/include/storage/bufpage.h +459 -0
- data/ext/pg_query/include/storage/condition_variable.h +62 -0
- data/ext/pg_query/include/storage/dsm.h +61 -0
- data/ext/pg_query/include/storage/dsm_impl.h +75 -0
- data/ext/pg_query/include/storage/fd.h +168 -0
- data/ext/pg_query/include/storage/ipc.h +81 -0
- data/ext/pg_query/include/storage/item.h +19 -0
- data/ext/pg_query/include/storage/itemid.h +184 -0
- data/ext/pg_query/include/storage/itemptr.h +206 -0
- data/ext/pg_query/include/storage/large_object.h +100 -0
- data/ext/pg_query/include/storage/latch.h +190 -0
- data/ext/pg_query/include/storage/lmgr.h +114 -0
- data/ext/pg_query/include/storage/lock.h +612 -0
- data/ext/pg_query/include/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/storage/lwlock.h +232 -0
- data/ext/pg_query/include/storage/lwlocknames.h +51 -0
- data/ext/pg_query/include/storage/off.h +57 -0
- data/ext/pg_query/include/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/storage/pg_shmem.h +90 -0
- data/ext/pg_query/include/storage/pmsignal.h +94 -0
- data/ext/pg_query/include/storage/predicate.h +87 -0
- data/ext/pg_query/include/storage/proc.h +333 -0
- data/ext/pg_query/include/storage/proclist_types.h +51 -0
- data/ext/pg_query/include/storage/procsignal.h +75 -0
- data/ext/pg_query/include/storage/relfilenode.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +1047 -0
- data/ext/pg_query/include/storage/sharedfileset.h +45 -0
- data/ext/pg_query/include/storage/shm_mq.h +85 -0
- data/ext/pg_query/include/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/storage/shmem.h +81 -0
- data/ext/pg_query/include/storage/sinval.h +153 -0
- data/ext/pg_query/include/storage/sinvaladt.h +43 -0
- data/ext/pg_query/include/storage/smgr.h +109 -0
- data/ext/pg_query/include/storage/spin.h +77 -0
- data/ext/pg_query/include/storage/standby.h +91 -0
- data/ext/pg_query/include/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/storage/sync.h +62 -0
- data/ext/pg_query/include/tcop/cmdtag.h +58 -0
- data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
- data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/tcop/dest.h +149 -0
- data/ext/pg_query/include/tcop/fastpath.h +21 -0
- data/ext/pg_query/include/tcop/pquery.h +45 -0
- data/ext/pg_query/include/tcop/tcopprot.h +89 -0
- data/ext/pg_query/include/tcop/utility.h +108 -0
- data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
- data/ext/pg_query/include/utils/acl.h +312 -0
- data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/utils/array.h +458 -0
- data/ext/pg_query/include/utils/builtins.h +127 -0
- data/ext/pg_query/include/utils/bytea.h +27 -0
- data/ext/pg_query/include/utils/catcache.h +231 -0
- data/ext/pg_query/include/utils/date.h +90 -0
- data/ext/pg_query/include/utils/datetime.h +343 -0
- data/ext/pg_query/include/utils/datum.h +68 -0
- data/ext/pg_query/include/utils/dsa.h +123 -0
- data/ext/pg_query/include/utils/dynahash.h +19 -0
- data/ext/pg_query/include/utils/elog.h +439 -0
- data/ext/pg_query/include/utils/errcodes.h +352 -0
- data/ext/pg_query/include/utils/expandeddatum.h +159 -0
- data/ext/pg_query/include/utils/expandedrecord.h +231 -0
- data/ext/pg_query/include/utils/float.h +356 -0
- data/ext/pg_query/include/utils/fmgroids.h +2657 -0
- data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
- data/ext/pg_query/include/utils/fmgrtab.h +48 -0
- data/ext/pg_query/include/utils/guc.h +443 -0
- data/ext/pg_query/include/utils/guc_tables.h +272 -0
- data/ext/pg_query/include/utils/hsearch.h +149 -0
- data/ext/pg_query/include/utils/inval.h +64 -0
- data/ext/pg_query/include/utils/lsyscache.h +197 -0
- data/ext/pg_query/include/utils/memdebug.h +82 -0
- data/ext/pg_query/include/utils/memutils.h +225 -0
- data/ext/pg_query/include/utils/numeric.h +76 -0
- data/ext/pg_query/include/utils/palloc.h +136 -0
- data/ext/pg_query/include/utils/partcache.h +102 -0
- data/ext/pg_query/include/utils/pg_locale.h +119 -0
- data/ext/pg_query/include/utils/pg_lsn.h +29 -0
- data/ext/pg_query/include/utils/pidfile.h +56 -0
- data/ext/pg_query/include/utils/plancache.h +235 -0
- data/ext/pg_query/include/utils/portal.h +241 -0
- data/ext/pg_query/include/utils/probes.h +114 -0
- data/ext/pg_query/include/utils/ps_status.h +25 -0
- data/ext/pg_query/include/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/utils/regproc.h +28 -0
- data/ext/pg_query/include/utils/rel.h +644 -0
- data/ext/pg_query/include/utils/relcache.h +151 -0
- data/ext/pg_query/include/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/utils/resowner.h +86 -0
- data/ext/pg_query/include/utils/rls.h +50 -0
- data/ext/pg_query/include/utils/ruleutils.h +44 -0
- data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/utils/snapmgr.h +158 -0
- data/ext/pg_query/include/utils/snapshot.h +206 -0
- data/ext/pg_query/include/utils/sortsupport.h +276 -0
- data/ext/pg_query/include/utils/syscache.h +219 -0
- data/ext/pg_query/include/utils/timeout.h +88 -0
- data/ext/pg_query/include/utils/timestamp.h +116 -0
- data/ext/pg_query/include/utils/tuplesort.h +277 -0
- data/ext/pg_query/include/utils/tuplestore.h +91 -0
- data/ext/pg_query/include/utils/typcache.h +202 -0
- data/ext/pg_query/include/utils/tzparser.h +39 -0
- data/ext/pg_query/include/utils/varlena.h +39 -0
- data/ext/pg_query/include/utils/xml.h +84 -0
- data/ext/pg_query/include/xxhash.h +5445 -0
- data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
- data/ext/pg_query/pg_query.c +104 -0
- data/ext/pg_query/pg_query.pb-c.c +37628 -0
- data/ext/pg_query/pg_query_deparse.c +9959 -0
- data/ext/pg_query/pg_query_fingerprint.c +295 -0
- data/ext/pg_query/pg_query_fingerprint.h +8 -0
- data/ext/pg_query/pg_query_internal.h +24 -0
- data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
- data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
- data/ext/pg_query/pg_query_normalize.c +439 -0
- data/ext/pg_query/pg_query_outfuncs.h +10 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
- data/ext/pg_query/pg_query_parse.c +148 -0
- data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
- data/ext/pg_query/pg_query_readfuncs.h +11 -0
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
- data/ext/pg_query/pg_query_ruby.c +108 -12
- data/ext/pg_query/pg_query_scan.c +173 -0
- data/ext/pg_query/pg_query_split.c +221 -0
- data/ext/pg_query/protobuf-c.c +3660 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
- data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
- data/ext/pg_query/src_backend_commands_define.c +117 -0
- data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
- data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
- data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
- data/ext/pg_query/src_backend_nodes_list.c +922 -0
- data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
- data/ext/pg_query/src_backend_nodes_value.c +84 -0
- data/ext/pg_query/src_backend_parser_gram.c +47456 -0
- data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
- data/ext/pg_query/src_backend_parser_parser.c +497 -0
- data/ext/pg_query/src_backend_parser_scan.c +7091 -0
- data/ext/pg_query/src_backend_parser_scansup.c +160 -0
- data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
- data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
- data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
- data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
- data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
- data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
- data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
- data/ext/pg_query/src_common_encnames.c +158 -0
- data/ext/pg_query/src_common_keywords.c +39 -0
- data/ext/pg_query/src_common_kwlist_d.h +1081 -0
- data/ext/pg_query/src_common_kwlookup.c +91 -0
- data/ext/pg_query/src_common_psprintf.c +158 -0
- data/ext/pg_query/src_common_string.c +86 -0
- data/ext/pg_query/src_common_stringinfo.c +336 -0
- data/ext/pg_query/src_common_wchar.c +1651 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
- data/ext/pg_query/src_port_erand48.c +127 -0
- data/ext/pg_query/src_port_pg_bitutils.c +246 -0
- data/ext/pg_query/src_port_pgsleep.c +69 -0
- data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
- data/ext/pg_query/src_port_qsort.c +240 -0
- data/ext/pg_query/src_port_random.c +31 -0
- data/ext/pg_query/src_port_snprintf.c +1449 -0
- data/ext/pg_query/src_port_strerror.c +324 -0
- data/ext/pg_query/src_port_strnlen.c +39 -0
- data/ext/pg_query/xxhash.c +43 -0
- data/lib/pg_query.rb +7 -4
- data/lib/pg_query/constants.rb +21 -0
- data/lib/pg_query/deparse.rb +15 -1581
- data/lib/pg_query/filter_columns.rb +88 -85
- data/lib/pg_query/fingerprint.rb +122 -87
- data/lib/pg_query/json_field_names.rb +1402 -0
- data/lib/pg_query/node.rb +31 -0
- data/lib/pg_query/param_refs.rb +42 -37
- data/lib/pg_query/parse.rb +220 -203
- data/lib/pg_query/parse_error.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +3211 -0
- data/lib/pg_query/scan.rb +23 -0
- data/lib/pg_query/treewalker.rb +24 -40
- data/lib/pg_query/truncate.rb +71 -42
- data/lib/pg_query/version.rb +2 -2
- metadata +472 -11
- data/ext/pg_query/pg_query_ruby.h +0 -10
- data/lib/pg_query/deep_dup.rb +0 -16
- data/lib/pg_query/deparse/alter_table.rb +0 -42
- data/lib/pg_query/deparse/interval.rb +0 -105
- data/lib/pg_query/deparse/keywords.rb +0 -159
- data/lib/pg_query/deparse/rename.rb +0 -41
- data/lib/pg_query/legacy_parsetree.rb +0 -109
- data/lib/pg_query/node_types.rb +0 -296
|
@@ -0,0 +1,776 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
* Symbols referenced in this file:
|
|
3
|
+
* - whereToSendOutput
|
|
4
|
+
* - debug_query_string
|
|
5
|
+
* - ProcessInterrupts
|
|
6
|
+
* - check_stack_depth
|
|
7
|
+
* - stack_is_too_deep
|
|
8
|
+
* - stack_base_ptr
|
|
9
|
+
* - max_stack_depth_bytes
|
|
10
|
+
* - max_stack_depth
|
|
11
|
+
*--------------------------------------------------------------------
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/*-------------------------------------------------------------------------
|
|
15
|
+
*
|
|
16
|
+
* postgres.c
|
|
17
|
+
* POSTGRES C Backend Interface
|
|
18
|
+
*
|
|
19
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
20
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
21
|
+
*
|
|
22
|
+
*
|
|
23
|
+
* IDENTIFICATION
|
|
24
|
+
* src/backend/tcop/postgres.c
|
|
25
|
+
*
|
|
26
|
+
* NOTES
|
|
27
|
+
* this is the "main" module of the postgres backend and
|
|
28
|
+
* hence the main module of the "traffic cop".
|
|
29
|
+
*
|
|
30
|
+
*-------------------------------------------------------------------------
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
#include "postgres.h"
|
|
34
|
+
|
|
35
|
+
#include <fcntl.h>
|
|
36
|
+
#include <limits.h>
|
|
37
|
+
#include <signal.h>
|
|
38
|
+
#include <unistd.h>
|
|
39
|
+
#include <sys/socket.h>
|
|
40
|
+
#ifdef HAVE_SYS_SELECT_H
|
|
41
|
+
#include <sys/select.h>
|
|
42
|
+
#endif
|
|
43
|
+
#ifdef HAVE_SYS_RESOURCE_H
|
|
44
|
+
#include <sys/time.h>
|
|
45
|
+
#include <sys/resource.h>
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
#ifndef HAVE_GETRUSAGE
|
|
49
|
+
#include "rusagestub.h"
|
|
50
|
+
#endif
|
|
51
|
+
|
|
52
|
+
#include "access/parallel.h"
|
|
53
|
+
#include "access/printtup.h"
|
|
54
|
+
#include "access/xact.h"
|
|
55
|
+
#include "catalog/pg_type.h"
|
|
56
|
+
#include "commands/async.h"
|
|
57
|
+
#include "commands/prepare.h"
|
|
58
|
+
#include "executor/spi.h"
|
|
59
|
+
#include "jit/jit.h"
|
|
60
|
+
#include "libpq/libpq.h"
|
|
61
|
+
#include "libpq/pqformat.h"
|
|
62
|
+
#include "libpq/pqsignal.h"
|
|
63
|
+
#include "mb/pg_wchar.h"
|
|
64
|
+
#include "mb/stringinfo_mb.h"
|
|
65
|
+
#include "miscadmin.h"
|
|
66
|
+
#include "nodes/print.h"
|
|
67
|
+
#include "optimizer/optimizer.h"
|
|
68
|
+
#include "parser/analyze.h"
|
|
69
|
+
#include "parser/parser.h"
|
|
70
|
+
#include "pg_getopt.h"
|
|
71
|
+
#include "pg_trace.h"
|
|
72
|
+
#include "pgstat.h"
|
|
73
|
+
#include "postmaster/autovacuum.h"
|
|
74
|
+
#include "postmaster/interrupt.h"
|
|
75
|
+
#include "postmaster/postmaster.h"
|
|
76
|
+
#include "replication/logicallauncher.h"
|
|
77
|
+
#include "replication/logicalworker.h"
|
|
78
|
+
#include "replication/slot.h"
|
|
79
|
+
#include "replication/walsender.h"
|
|
80
|
+
#include "rewrite/rewriteHandler.h"
|
|
81
|
+
#include "storage/bufmgr.h"
|
|
82
|
+
#include "storage/ipc.h"
|
|
83
|
+
#include "storage/proc.h"
|
|
84
|
+
#include "storage/procsignal.h"
|
|
85
|
+
#include "storage/sinval.h"
|
|
86
|
+
#include "tcop/fastpath.h"
|
|
87
|
+
#include "tcop/pquery.h"
|
|
88
|
+
#include "tcop/tcopprot.h"
|
|
89
|
+
#include "tcop/utility.h"
|
|
90
|
+
#include "utils/lsyscache.h"
|
|
91
|
+
#include "utils/memutils.h"
|
|
92
|
+
#include "utils/ps_status.h"
|
|
93
|
+
#include "utils/snapmgr.h"
|
|
94
|
+
#include "utils/timeout.h"
|
|
95
|
+
#include "utils/timestamp.h"
|
|
96
|
+
|
|
97
|
+
/* ----------------
|
|
98
|
+
* global variables
|
|
99
|
+
* ----------------
|
|
100
|
+
*/
|
|
101
|
+
__thread const char *debug_query_string;
|
|
102
|
+
/* client-supplied query string */
|
|
103
|
+
|
|
104
|
+
/* Note: whereToSendOutput is initialized for the bootstrap/standalone case */
|
|
105
|
+
__thread CommandDest whereToSendOutput = DestDebug;
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
/* flag for logging end of session */
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
/* GUC variable for maximum stack depth (measured in kilobytes) */
|
|
114
|
+
__thread int max_stack_depth = 100;
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
/* wait N seconds to allow attach from a debugger */
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
/* ----------------
|
|
123
|
+
* private variables
|
|
124
|
+
* ----------------
|
|
125
|
+
*/
|
|
126
|
+
|
|
127
|
+
/* max_stack_depth converted to bytes for speed of checking */
|
|
128
|
+
static __thread long max_stack_depth_bytes = 100 * 1024L;
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* Stack base pointer -- initialized by PostmasterMain and inherited by
|
|
133
|
+
* subprocesses. This is not static because old versions of PL/Java modify
|
|
134
|
+
* it directly. Newer versions use set_stack_base(), but we want to stay
|
|
135
|
+
* binary-compatible for the time being.
|
|
136
|
+
*/
|
|
137
|
+
__thread char *stack_base_ptr = NULL;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* On IA64 we also have to remember the register stack base.
|
|
142
|
+
*/
|
|
143
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
144
|
+
char *register_stack_base_ptr = NULL;
|
|
145
|
+
#endif
|
|
146
|
+
|
|
147
|
+
/*
|
|
148
|
+
* Flag to keep track of whether we have started a transaction.
|
|
149
|
+
* For extended query protocol this has to be remembered across messages.
|
|
150
|
+
*/
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* Flag to indicate that we are doing the outer loop's read-from-client,
|
|
155
|
+
* as opposed to any random read from client that might happen within
|
|
156
|
+
* commands like COPY FROM STDIN.
|
|
157
|
+
*/
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* Flags to implement skip-till-Sync-after-error behavior for messages of
|
|
162
|
+
* the extended query protocol.
|
|
163
|
+
*/
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* If an unnamed prepared statement exists, it's stored here.
|
|
169
|
+
* We keep it separate from the hashtable kept by commands/prepare.c
|
|
170
|
+
* in order to reduce overhead for short-lived queries.
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
/* assorted command-line switches */
|
|
175
|
+
/* -D switch */
|
|
176
|
+
/* -E switch */
|
|
177
|
+
/* -j switch */
|
|
178
|
+
|
|
179
|
+
/* whether or not, and why, we were canceled by conflict with recovery */
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
/* reused buffer to pass to SendRowDescriptionMessage() */
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
/* ----------------------------------------------------------------
|
|
189
|
+
* decls for routines only used in this file
|
|
190
|
+
* ----------------------------------------------------------------
|
|
191
|
+
*/
|
|
192
|
+
static int InteractiveBackend(StringInfo inBuf);
|
|
193
|
+
static int interactive_getc(void);
|
|
194
|
+
static int SocketBackend(StringInfo inBuf);
|
|
195
|
+
static int ReadCommand(StringInfo inBuf);
|
|
196
|
+
static void forbidden_in_wal_sender(char firstchar);
|
|
197
|
+
static List *pg_rewrite_query(Query *query);
|
|
198
|
+
static bool check_log_statement(List *stmt_list);
|
|
199
|
+
static int errdetail_execute(List *raw_parsetree_list);
|
|
200
|
+
static int errdetail_params(ParamListInfo params);
|
|
201
|
+
static int errdetail_abort(void);
|
|
202
|
+
static int errdetail_recovery_conflict(void);
|
|
203
|
+
static void start_xact_command(void);
|
|
204
|
+
static void finish_xact_command(void);
|
|
205
|
+
static bool IsTransactionExitStmt(Node *parsetree);
|
|
206
|
+
static bool IsTransactionExitStmtList(List *pstmts);
|
|
207
|
+
static bool IsTransactionStmtList(List *pstmts);
|
|
208
|
+
static void drop_unnamed_stmt(void);
|
|
209
|
+
static void log_disconnections(int code, Datum arg);
|
|
210
|
+
static void enable_statement_timeout(void);
|
|
211
|
+
static void disable_statement_timeout(void);
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
/* ----------------------------------------------------------------
|
|
215
|
+
* routines to obtain user input
|
|
216
|
+
* ----------------------------------------------------------------
|
|
217
|
+
*/
|
|
218
|
+
|
|
219
|
+
/* ----------------
|
|
220
|
+
* InteractiveBackend() is called for user interactive connections
|
|
221
|
+
*
|
|
222
|
+
* the string entered by the user is placed in its parameter inBuf,
|
|
223
|
+
* and we act like a Q message was received.
|
|
224
|
+
*
|
|
225
|
+
* EOF is returned if end-of-file input is seen; time to shut down.
|
|
226
|
+
* ----------------
|
|
227
|
+
*/
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
* interactive_getc -- collect one character from stdin
|
|
233
|
+
*
|
|
234
|
+
* Even though we are not reading from a "client" process, we still want to
|
|
235
|
+
* respond to signals, particularly SIGTERM/SIGQUIT.
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
/* ----------------
|
|
240
|
+
* SocketBackend() Is called for frontend-backend connections
|
|
241
|
+
*
|
|
242
|
+
* Returns the message type code, and loads message body data into inBuf.
|
|
243
|
+
*
|
|
244
|
+
* EOF is returned if the connection is lost.
|
|
245
|
+
* ----------------
|
|
246
|
+
*/
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
/* ----------------
|
|
250
|
+
* ReadCommand reads a command from either the frontend or
|
|
251
|
+
* standard input, places it in inBuf, and returns the
|
|
252
|
+
* message type code (first byte of the message).
|
|
253
|
+
* EOF is returned if end of file.
|
|
254
|
+
* ----------------
|
|
255
|
+
*/
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
/*
|
|
259
|
+
* ProcessClientReadInterrupt() - Process interrupts specific to client reads
|
|
260
|
+
*
|
|
261
|
+
* This is called just before and after low-level reads.
|
|
262
|
+
* 'blocked' is true if no data was available to read and we plan to retry,
|
|
263
|
+
* false if about to read or done reading.
|
|
264
|
+
*
|
|
265
|
+
* Must preserve errno!
|
|
266
|
+
*/
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
/*
|
|
270
|
+
* ProcessClientWriteInterrupt() - Process interrupts specific to client writes
|
|
271
|
+
*
|
|
272
|
+
* This is called just before and after low-level writes.
|
|
273
|
+
* 'blocked' is true if no data could be written and we plan to retry,
|
|
274
|
+
* false if about to write or done writing.
|
|
275
|
+
*
|
|
276
|
+
* Must preserve errno!
|
|
277
|
+
*/
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* Do raw parsing (only).
|
|
282
|
+
*
|
|
283
|
+
* A list of parsetrees (RawStmt nodes) is returned, since there might be
|
|
284
|
+
* multiple commands in the given string.
|
|
285
|
+
*
|
|
286
|
+
* NOTE: for interactive queries, it is important to keep this routine
|
|
287
|
+
* separate from the analysis & rewrite stages. Analysis and rewriting
|
|
288
|
+
* cannot be done in an aborted transaction, since they require access to
|
|
289
|
+
* database tables. So, we rely on the raw parser to determine whether
|
|
290
|
+
* we've seen a COMMIT or ABORT command; when we are in abort state, other
|
|
291
|
+
* commands are not processed any further than the raw parse stage.
|
|
292
|
+
*/
|
|
293
|
+
#ifdef COPY_PARSE_PLAN_TREES
|
|
294
|
+
#endif
|
|
295
|
+
|
|
296
|
+
/*
|
|
297
|
+
* Given a raw parsetree (gram.y output), and optionally information about
|
|
298
|
+
* types of parameter symbols ($n), perform parse analysis and rule rewriting.
|
|
299
|
+
*
|
|
300
|
+
* A list of Query nodes is returned, since either the analyzer or the
|
|
301
|
+
* rewriter might expand one query to several.
|
|
302
|
+
*
|
|
303
|
+
* NOTE: for reasons mentioned above, this must be separate from raw parsing.
|
|
304
|
+
*/
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
/*
|
|
308
|
+
* Do parse analysis and rewriting. This is the same as pg_analyze_and_rewrite
|
|
309
|
+
* except that external-parameter resolution is determined by parser callback
|
|
310
|
+
* hooks instead of a fixed list of parameter datatypes.
|
|
311
|
+
*/
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
/*
|
|
315
|
+
* Perform rewriting of a query produced by parse analysis.
|
|
316
|
+
*
|
|
317
|
+
* Note: query must just have come from the parser, because we do not do
|
|
318
|
+
* AcquireRewriteLocks() on it.
|
|
319
|
+
*/
|
|
320
|
+
#ifdef COPY_PARSE_PLAN_TREES
|
|
321
|
+
#endif
|
|
322
|
+
#ifdef WRITE_READ_PARSE_PLAN_TREES
|
|
323
|
+
#endif
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
/*
|
|
327
|
+
* Generate a plan for a single already-rewritten query.
|
|
328
|
+
* This is a thin wrapper around planner() and takes the same parameters.
|
|
329
|
+
*/
|
|
330
|
+
#ifdef COPY_PARSE_PLAN_TREES
|
|
331
|
+
#ifdef NOT_USED
|
|
332
|
+
#endif
|
|
333
|
+
#endif
|
|
334
|
+
#ifdef WRITE_READ_PARSE_PLAN_TREES
|
|
335
|
+
#ifdef NOT_USED
|
|
336
|
+
#endif
|
|
337
|
+
#endif
|
|
338
|
+
|
|
339
|
+
/*
|
|
340
|
+
* Generate plans for a list of already-rewritten queries.
|
|
341
|
+
*
|
|
342
|
+
* For normal optimizable statements, invoke the planner. For utility
|
|
343
|
+
* statements, just make a wrapper PlannedStmt node.
|
|
344
|
+
*
|
|
345
|
+
* The result is a list of PlannedStmt nodes.
|
|
346
|
+
*/
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
/*
|
|
351
|
+
* exec_simple_query
|
|
352
|
+
*
|
|
353
|
+
* Execute a "simple Query" protocol message.
|
|
354
|
+
*/
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
/*
|
|
358
|
+
* exec_parse_message
|
|
359
|
+
*
|
|
360
|
+
* Execute a "Parse" protocol message.
|
|
361
|
+
*/
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
/*
|
|
365
|
+
* exec_bind_message
|
|
366
|
+
*
|
|
367
|
+
* Process a "Bind" message to create a portal from a prepared statement
|
|
368
|
+
*/
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
/*
|
|
372
|
+
* exec_execute_message
|
|
373
|
+
*
|
|
374
|
+
* Process an "Execute" message for a portal
|
|
375
|
+
*/
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
/*
|
|
379
|
+
* check_log_statement
|
|
380
|
+
* Determine whether command should be logged because of log_statement
|
|
381
|
+
*
|
|
382
|
+
* stmt_list can be either raw grammar output or a list of planned
|
|
383
|
+
* statements
|
|
384
|
+
*/
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
/*
|
|
388
|
+
* check_log_duration
|
|
389
|
+
* Determine whether current command's duration should be logged
|
|
390
|
+
* We also check if this statement in this transaction must be logged
|
|
391
|
+
* (regardless of its duration).
|
|
392
|
+
*
|
|
393
|
+
* Returns:
|
|
394
|
+
* 0 if no logging is needed
|
|
395
|
+
* 1 if just the duration should be logged
|
|
396
|
+
* 2 if duration and query details should be logged
|
|
397
|
+
*
|
|
398
|
+
* If logging is needed, the duration in msec is formatted into msec_str[],
|
|
399
|
+
* which must be a 32-byte buffer.
|
|
400
|
+
*
|
|
401
|
+
* was_logged should be true if caller already logged query details (this
|
|
402
|
+
* essentially prevents 2 from being returned).
|
|
403
|
+
*/
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
/*
|
|
407
|
+
* errdetail_execute
|
|
408
|
+
*
|
|
409
|
+
* Add an errdetail() line showing the query referenced by an EXECUTE, if any.
|
|
410
|
+
* The argument is the raw parsetree list.
|
|
411
|
+
*/
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
/*
|
|
415
|
+
* errdetail_params
|
|
416
|
+
*
|
|
417
|
+
* Add an errdetail() line showing bind-parameter data, if available.
|
|
418
|
+
* Note that this is only used for statement logging, so it is controlled
|
|
419
|
+
* by log_parameter_max_length not log_parameter_max_length_on_error.
|
|
420
|
+
*/
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
/*
|
|
424
|
+
* errdetail_abort
|
|
425
|
+
*
|
|
426
|
+
* Add an errdetail() line showing abort reason, if any.
|
|
427
|
+
*/
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* errdetail_recovery_conflict
|
|
432
|
+
*
|
|
433
|
+
* Add an errdetail() line showing conflict source.
|
|
434
|
+
*/
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
/*
|
|
438
|
+
* exec_describe_statement_message
|
|
439
|
+
*
|
|
440
|
+
* Process a "Describe" message for a prepared statement
|
|
441
|
+
*/
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
/*
|
|
445
|
+
* exec_describe_portal_message
|
|
446
|
+
*
|
|
447
|
+
* Process a "Describe" message for a portal
|
|
448
|
+
*/
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
/*
|
|
453
|
+
* Convenience routines for starting/committing a single command.
|
|
454
|
+
*/
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
#ifdef MEMORY_CONTEXT_CHECKING
|
|
458
|
+
#endif
|
|
459
|
+
#ifdef SHOW_MEMORY_STATS
|
|
460
|
+
#endif
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
/*
|
|
464
|
+
* Convenience routines for checking whether a statement is one of the
|
|
465
|
+
* ones that we allow in transaction-aborted state.
|
|
466
|
+
*/
|
|
467
|
+
|
|
468
|
+
/* Test a bare parsetree */
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
/* Test a list that contains PlannedStmt nodes */
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
/* Test a list that contains PlannedStmt nodes */
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
/* Release any existing unnamed prepared statement */
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
/* --------------------------------
|
|
482
|
+
* signal handler routines used in PostgresMain()
|
|
483
|
+
* --------------------------------
|
|
484
|
+
*/
|
|
485
|
+
|
|
486
|
+
/*
|
|
487
|
+
* quickdie() occurs when signaled SIGQUIT by the postmaster.
|
|
488
|
+
*
|
|
489
|
+
* Some backend has bought the farm,
|
|
490
|
+
* so we need to stop what we're doing and exit.
|
|
491
|
+
*/
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
/*
|
|
495
|
+
* Shutdown signal from postmaster: abort transaction and exit
|
|
496
|
+
* at soonest convenient time
|
|
497
|
+
*/
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
/*
|
|
501
|
+
* Query-cancel signal from postmaster: abort current transaction
|
|
502
|
+
* at soonest convenient time
|
|
503
|
+
*/
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
/* signal handler for floating point exception */
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
/*
|
|
510
|
+
* RecoveryConflictInterrupt: out-of-line portion of recovery conflict
|
|
511
|
+
* handling following receipt of SIGUSR1. Designed to be similar to die()
|
|
512
|
+
* and StatementCancelHandler(). Called only by a normal user backend
|
|
513
|
+
* that begins a transaction during recovery.
|
|
514
|
+
*/
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
/*
|
|
518
|
+
* ProcessInterrupts: out-of-line portion of CHECK_FOR_INTERRUPTS() macro
|
|
519
|
+
*
|
|
520
|
+
* If an interrupt condition is pending, and it's safe to service it,
|
|
521
|
+
* then clear the flag and accept the interrupt. Called only when
|
|
522
|
+
* InterruptPending is true.
|
|
523
|
+
*/
|
|
524
|
+
void ProcessInterrupts(void) {}
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
/*
|
|
529
|
+
* IA64-specific code to fetch the AR.BSP register for stack depth checks.
|
|
530
|
+
*
|
|
531
|
+
* We currently support gcc, icc, and HP-UX's native compiler here.
|
|
532
|
+
*
|
|
533
|
+
* Note: while icc accepts gcc asm blocks on x86[_64], this is not true on
|
|
534
|
+
* ia64 (at least not in icc versions before 12.x). So we have to carry a
|
|
535
|
+
* separate implementation for it.
|
|
536
|
+
*/
|
|
537
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
538
|
+
|
|
539
|
+
#if defined(__hpux) && !defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
|
540
|
+
/* Assume it's HP-UX native compiler */
|
|
541
|
+
#include <ia64/sys/inline.h>
|
|
542
|
+
#define ia64_get_bsp() ((char *) (_Asm_mov_from_ar(_AREG_BSP, _NO_FENCE)))
|
|
543
|
+
#elif defined(__INTEL_COMPILER)
|
|
544
|
+
/* icc */
|
|
545
|
+
#include <asm/ia64regs.h>
|
|
546
|
+
#define ia64_get_bsp() ((char *) __getReg(_IA64_REG_AR_BSP))
|
|
547
|
+
#else
|
|
548
|
+
/* gcc */
|
|
549
|
+
static __inline__ char *
|
|
550
|
+
ia64_get_bsp(void)
|
|
551
|
+
{
|
|
552
|
+
char *ret;
|
|
553
|
+
|
|
554
|
+
/* the ;; is a "stop", seems to be required before fetching BSP */
|
|
555
|
+
__asm__ __volatile__(
|
|
556
|
+
";;\n"
|
|
557
|
+
" mov %0=ar.bsp \n"
|
|
558
|
+
: "=r"(ret));
|
|
559
|
+
|
|
560
|
+
return ret;
|
|
561
|
+
}
|
|
562
|
+
#endif
|
|
563
|
+
#endif /* IA64 */
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
/*
|
|
567
|
+
* set_stack_base: set up reference point for stack depth checking
|
|
568
|
+
*
|
|
569
|
+
* Returns the old reference point, if any.
|
|
570
|
+
*/
|
|
571
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
572
|
+
#else
|
|
573
|
+
#endif
|
|
574
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
575
|
+
#endif
|
|
576
|
+
|
|
577
|
+
/*
|
|
578
|
+
* restore_stack_base: restore reference point for stack depth checking
|
|
579
|
+
*
|
|
580
|
+
* This can be used after set_stack_base() to restore the old value. This
|
|
581
|
+
* is currently only used in PL/Java. When PL/Java calls a backend function
|
|
582
|
+
* from different thread, the thread's stack is at a different location than
|
|
583
|
+
* the main thread's stack, so it sets the base pointer before the call, and
|
|
584
|
+
* restores it afterwards.
|
|
585
|
+
*/
|
|
586
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
587
|
+
#else
|
|
588
|
+
#endif
|
|
589
|
+
|
|
590
|
+
/*
|
|
591
|
+
* check_stack_depth/stack_is_too_deep: check for excessively deep recursion
|
|
592
|
+
*
|
|
593
|
+
* This should be called someplace in any recursive routine that might possibly
|
|
594
|
+
* recurse deep enough to overflow the stack. Most Unixen treat stack
|
|
595
|
+
* overflow as an unrecoverable SIGSEGV, so we want to error out ourselves
|
|
596
|
+
* before hitting the hardware limit.
|
|
597
|
+
*
|
|
598
|
+
* check_stack_depth() just throws an error summarily. stack_is_too_deep()
|
|
599
|
+
* can be used by code that wants to handle the error condition itself.
|
|
600
|
+
*/
|
|
601
|
+
void
|
|
602
|
+
check_stack_depth(void)
|
|
603
|
+
{
|
|
604
|
+
if (stack_is_too_deep())
|
|
605
|
+
{
|
|
606
|
+
ereport(ERROR,
|
|
607
|
+
(errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
|
|
608
|
+
errmsg("stack depth limit exceeded"),
|
|
609
|
+
errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), "
|
|
610
|
+
"after ensuring the platform's stack depth limit is adequate.",
|
|
611
|
+
max_stack_depth)));
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
bool
|
|
616
|
+
stack_is_too_deep(void)
|
|
617
|
+
{
|
|
618
|
+
char stack_top_loc;
|
|
619
|
+
long stack_depth;
|
|
620
|
+
|
|
621
|
+
/*
|
|
622
|
+
* Compute distance from reference point to my local variables
|
|
623
|
+
*/
|
|
624
|
+
stack_depth = (long) (stack_base_ptr - &stack_top_loc);
|
|
625
|
+
|
|
626
|
+
/*
|
|
627
|
+
* Take abs value, since stacks grow up on some machines, down on others
|
|
628
|
+
*/
|
|
629
|
+
if (stack_depth < 0)
|
|
630
|
+
stack_depth = -stack_depth;
|
|
631
|
+
|
|
632
|
+
/*
|
|
633
|
+
* Trouble?
|
|
634
|
+
*
|
|
635
|
+
* The test on stack_base_ptr prevents us from erroring out if called
|
|
636
|
+
* during process setup or in a non-backend process. Logically it should
|
|
637
|
+
* be done first, but putting it here avoids wasting cycles during normal
|
|
638
|
+
* cases.
|
|
639
|
+
*/
|
|
640
|
+
if (stack_depth > max_stack_depth_bytes &&
|
|
641
|
+
stack_base_ptr != NULL)
|
|
642
|
+
return true;
|
|
643
|
+
|
|
644
|
+
/*
|
|
645
|
+
* On IA64 there is a separate "register" stack that requires its own
|
|
646
|
+
* independent check. For this, we have to measure the change in the
|
|
647
|
+
* "BSP" pointer from PostgresMain to here. Logic is just as above,
|
|
648
|
+
* except that we know IA64's register stack grows up.
|
|
649
|
+
*
|
|
650
|
+
* Note we assume that the same max_stack_depth applies to both stacks.
|
|
651
|
+
*/
|
|
652
|
+
#if defined(__ia64__) || defined(__ia64)
|
|
653
|
+
stack_depth = (long) (ia64_get_bsp() - register_stack_base_ptr);
|
|
654
|
+
|
|
655
|
+
if (stack_depth > max_stack_depth_bytes &&
|
|
656
|
+
register_stack_base_ptr != NULL)
|
|
657
|
+
return true;
|
|
658
|
+
#endif /* IA64 */
|
|
659
|
+
|
|
660
|
+
return false;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/* GUC check hook for max_stack_depth */
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
/* GUC assign hook for max_stack_depth */
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
/*
|
|
671
|
+
* set_debug_options --- apply "-d N" command line option
|
|
672
|
+
*
|
|
673
|
+
* -d is not quite the same as setting log_min_messages because it enables
|
|
674
|
+
* other output options.
|
|
675
|
+
*/
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
/* ----------------------------------------------------------------
|
|
686
|
+
* process_postgres_switches
|
|
687
|
+
* Parse command line arguments for PostgresMain
|
|
688
|
+
*
|
|
689
|
+
* This is called twice, once for the "secure" options coming from the
|
|
690
|
+
* postmaster or command line, and once for the "insecure" options coming
|
|
691
|
+
* from the client's startup packet. The latter have the same syntax but
|
|
692
|
+
* may be restricted in what they can do.
|
|
693
|
+
*
|
|
694
|
+
* argv[0] is ignored in either case (it's assumed to be the program name).
|
|
695
|
+
*
|
|
696
|
+
* ctx is PGC_POSTMASTER for secure options, PGC_BACKEND for insecure options
|
|
697
|
+
* coming from the client, or PGC_SU_BACKEND for insecure options coming from
|
|
698
|
+
* a superuser client.
|
|
699
|
+
*
|
|
700
|
+
* If a database name is present in the command line arguments, it's
|
|
701
|
+
* returned into *dbname (this is allowed only if *dbname is initially NULL).
|
|
702
|
+
* ----------------------------------------------------------------
|
|
703
|
+
*/
|
|
704
|
+
#ifdef HAVE_INT_OPTERR
|
|
705
|
+
#endif
|
|
706
|
+
#ifdef HAVE_INT_OPTRESET
|
|
707
|
+
#endif
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
/* ----------------------------------------------------------------
|
|
711
|
+
* PostgresMain
|
|
712
|
+
* postgres main loop -- all backends, interactive or otherwise start here
|
|
713
|
+
*
|
|
714
|
+
* argc/argv are the command line arguments to be used. (When being forked
|
|
715
|
+
* by the postmaster, these are not the original argv array of the process.)
|
|
716
|
+
* dbname is the name of the database to connect to, or NULL if the database
|
|
717
|
+
* name should be extracted from the command line arguments or defaulted.
|
|
718
|
+
* username is the PostgreSQL user name to be used for the session.
|
|
719
|
+
* ----------------------------------------------------------------
|
|
720
|
+
*/
|
|
721
|
+
#ifdef EXEC_BACKEND
|
|
722
|
+
#else
|
|
723
|
+
#endif
|
|
724
|
+
|
|
725
|
+
/*
|
|
726
|
+
* Throw an error if we're a WAL sender process.
|
|
727
|
+
*
|
|
728
|
+
* This is used to forbid anything else than simple query protocol messages
|
|
729
|
+
* in a WAL sender process. 'firstchar' specifies what kind of a forbidden
|
|
730
|
+
* message was received, and is used to construct the error message.
|
|
731
|
+
*/
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
/*
|
|
736
|
+
* Obtain platform stack depth limit (in bytes)
|
|
737
|
+
*
|
|
738
|
+
* Return -1 if unknown
|
|
739
|
+
*/
|
|
740
|
+
#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_STACK)
|
|
741
|
+
#else /* no getrlimit */
|
|
742
|
+
#if defined(WIN32) || defined(__CYGWIN__)
|
|
743
|
+
#else /* not windows ... give up */
|
|
744
|
+
#endif
|
|
745
|
+
#endif
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
#if defined(HAVE_GETRUSAGE)
|
|
754
|
+
#if defined(__darwin__)
|
|
755
|
+
#else
|
|
756
|
+
#endif
|
|
757
|
+
#endif /* HAVE_GETRUSAGE */
|
|
758
|
+
|
|
759
|
+
/*
|
|
760
|
+
* on_proc_exit handler to log end of session
|
|
761
|
+
*/
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
/*
|
|
765
|
+
* Start statement timeout timer, if enabled.
|
|
766
|
+
*
|
|
767
|
+
* If there's already a timeout running, don't restart the timer. That
|
|
768
|
+
* enables compromises between accuracy of timeouts and cost of starting a
|
|
769
|
+
* timeout.
|
|
770
|
+
*/
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
/*
|
|
774
|
+
* Disable statement timeout, if active.
|
|
775
|
+
*/
|
|
776
|
+
|