pg_query 4.2.3 → 5.0.0
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 +6 -0
- data/README.md +6 -8
- data/Rakefile +3 -3
- data/ext/pg_query/extconf.rb +1 -3
- data/ext/pg_query/include/access/amapi.h +3 -1
- data/ext/pg_query/include/access/attmap.h +5 -3
- data/ext/pg_query/include/access/attnum.h +1 -1
- data/ext/pg_query/include/access/clog.h +1 -1
- data/ext/pg_query/include/access/commit_ts.h +1 -1
- data/ext/pg_query/include/access/detoast.h +1 -1
- data/ext/pg_query/include/access/genam.h +7 -5
- data/ext/pg_query/include/access/gin.h +16 -3
- data/ext/pg_query/include/access/htup.h +1 -1
- data/ext/pg_query/include/access/htup_details.h +6 -2
- data/ext/pg_query/include/access/itup.h +61 -58
- data/ext/pg_query/include/access/parallel.h +2 -2
- data/ext/pg_query/include/access/printtup.h +1 -1
- data/ext/pg_query/include/access/relation.h +1 -1
- data/ext/pg_query/include/access/relscan.h +1 -1
- data/ext/pg_query/include/access/rmgrlist.h +2 -2
- data/ext/pg_query/include/access/sdir.h +12 -3
- data/ext/pg_query/include/access/skey.h +1 -1
- data/ext/pg_query/include/access/stratnum.h +1 -1
- data/ext/pg_query/include/access/sysattr.h +1 -1
- data/ext/pg_query/include/access/table.h +1 -1
- data/ext/pg_query/include/access/tableam.h +68 -45
- data/ext/pg_query/include/access/toast_compression.h +1 -1
- data/ext/pg_query/include/access/transam.h +1 -1
- data/ext/pg_query/include/access/tsmapi.h +82 -0
- data/ext/pg_query/include/access/tupconvert.h +5 -2
- data/ext/pg_query/include/access/tupdesc.h +2 -2
- data/ext/pg_query/include/access/tupmacs.h +58 -98
- data/ext/pg_query/include/access/twophase.h +2 -2
- data/ext/pg_query/include/access/xact.h +25 -18
- data/ext/pg_query/include/access/xlog.h +15 -16
- data/ext/pg_query/include/access/xlog_internal.h +100 -62
- data/ext/pg_query/include/access/xlogbackup.h +41 -0
- data/ext/pg_query/include/access/xlogdefs.h +6 -25
- data/ext/pg_query/include/access/xlogprefetcher.h +1 -1
- data/ext/pg_query/include/access/xlogreader.h +7 -6
- data/ext/pg_query/include/access/xlogrecord.h +17 -5
- data/ext/pg_query/include/access/xlogrecovery.h +4 -3
- data/ext/pg_query/include/archive/archive_module.h +59 -0
- data/ext/pg_query/include/c.h +144 -156
- data/ext/pg_query/include/catalog/catalog.h +4 -3
- data/ext/pg_query/include/catalog/catversion.h +6 -2
- data/ext/pg_query/include/catalog/dependency.h +5 -4
- data/ext/pg_query/include/catalog/genbki.h +7 -6
- data/ext/pg_query/include/catalog/index.h +4 -4
- data/ext/pg_query/include/catalog/indexing.h +1 -1
- data/ext/pg_query/include/catalog/namespace.h +2 -2
- data/ext/pg_query/include/catalog/objectaccess.h +10 -8
- data/ext/pg_query/include/catalog/objectaddress.h +3 -3
- data/ext/pg_query/include/catalog/pg_aggregate.h +1 -1
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_am.h +1 -1
- data/ext/pg_query/include/catalog/pg_am_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_attribute.h +19 -17
- data/ext/pg_query/include/catalog/pg_attribute_d.h +19 -19
- data/ext/pg_query/include/catalog/pg_authid.h +1 -1
- data/ext/pg_query/include/catalog/pg_authid_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_class.h +1 -1
- data/ext/pg_query/include/catalog/pg_class_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_collation.h +3 -1
- data/ext/pg_query/include/catalog/pg_collation_d.h +4 -3
- data/ext/pg_query/include/catalog/pg_constraint.h +2 -2
- data/ext/pg_query/include/catalog/pg_constraint_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_control.h +9 -1
- data/ext/pg_query/include/catalog/pg_conversion.h +2 -2
- data/ext/pg_query/include/catalog/pg_conversion_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_database.h +124 -0
- data/ext/pg_query/include/catalog/pg_database_d.h +52 -0
- data/ext/pg_query/include/catalog/pg_depend.h +1 -1
- data/ext/pg_query/include/catalog/pg_depend_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_event_trigger.h +1 -1
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_index.h +1 -1
- data/ext/pg_query/include/catalog/pg_index_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_language.h +1 -1
- data/ext/pg_query/include/catalog/pg_language_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_namespace.h +1 -1
- data/ext/pg_query/include/catalog/pg_namespace_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_opclass.h +1 -1
- data/ext/pg_query/include/catalog/pg_opclass_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_operator.h +1 -1
- data/ext/pg_query/include/catalog/pg_operator_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_opfamily.h +3 -2
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +4 -2
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +1 -1
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_proc.h +1 -1
- data/ext/pg_query/include/catalog/pg_proc_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_publication.h +2 -5
- data/ext/pg_query/include/catalog/pg_publication_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_replication_origin.h +1 -1
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_statistic.h +1 -1
- data/ext/pg_query/include/catalog/pg_statistic_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +1 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_transform.h +1 -1
- data/ext/pg_query/include/catalog/pg_transform_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_trigger.h +1 -1
- data/ext/pg_query/include/catalog/pg_trigger_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_config.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_dict.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_parser.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_template.h +1 -1
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +1 -1
- data/ext/pg_query/include/catalog/pg_type.h +1 -1
- data/ext/pg_query/include/catalog/pg_type_d.h +1 -1
- data/ext/pg_query/include/catalog/storage.h +6 -6
- data/ext/pg_query/include/commands/async.h +1 -1
- data/ext/pg_query/include/commands/dbcommands.h +2 -1
- data/ext/pg_query/include/commands/defrem.h +2 -1
- data/ext/pg_query/include/commands/event_trigger.h +1 -1
- data/ext/pg_query/include/commands/explain.h +3 -1
- data/ext/pg_query/include/commands/prepare.h +1 -1
- data/ext/pg_query/include/commands/tablespace.h +4 -4
- data/ext/pg_query/include/commands/trigger.h +15 -14
- data/ext/pg_query/include/commands/user.h +9 -3
- data/ext/pg_query/include/commands/vacuum.h +60 -14
- data/ext/pg_query/include/common/cryptohash.h +39 -0
- data/ext/pg_query/include/common/file_perm.h +1 -1
- data/ext/pg_query/include/common/hashfn.h +1 -1
- data/ext/pg_query/include/common/int.h +437 -0
- data/ext/pg_query/include/common/ip.h +4 -2
- data/ext/pg_query/include/common/keywords.h +1 -1
- data/ext/pg_query/include/common/kwlookup.h +2 -2
- data/ext/pg_query/include/common/pg_prng.h +3 -2
- data/ext/pg_query/include/common/relpath.h +20 -13
- data/ext/pg_query/include/common/scram-common.h +70 -0
- data/ext/pg_query/include/common/sha2.h +32 -0
- data/ext/pg_query/include/common/string.h +5 -3
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +10 -10
- data/ext/pg_query/include/common/{unicode_combining_table.h → unicode_nonspacing_table.h} +31 -13
- data/ext/pg_query/include/copyfuncs.funcs.c +5013 -0
- data/ext/pg_query/include/copyfuncs.switch.c +938 -0
- data/ext/pg_query/include/datatype/timestamp.h +11 -4
- data/ext/pg_query/include/equalfuncs.funcs.c +3097 -0
- data/ext/pg_query/include/equalfuncs.switch.c +785 -0
- data/ext/pg_query/include/executor/execdesc.h +1 -1
- data/ext/pg_query/include/executor/executor.h +34 -17
- data/ext/pg_query/include/executor/functions.h +1 -1
- data/ext/pg_query/include/executor/instrument.h +1 -1
- data/ext/pg_query/include/executor/spi.h +2 -2
- data/ext/pg_query/include/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/executor/tuptable.h +18 -11
- data/ext/pg_query/include/fmgr.h +21 -2
- data/ext/pg_query/include/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/funcapi.h +12 -12
- data/ext/pg_query/include/gram.h +1127 -0
- data/ext/pg_query/include/{parser/gramparse.h → gramparse.h} +4 -4
- data/ext/pg_query/include/jit/jit.h +2 -2
- data/ext/pg_query/include/kwlist_d.h +534 -510
- data/ext/pg_query/include/lib/dshash.h +4 -1
- data/ext/pg_query/include/lib/ilist.h +435 -22
- data/ext/pg_query/include/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/lib/simplehash.h +9 -9
- data/ext/pg_query/include/lib/sort_template.h +1 -1
- data/ext/pg_query/include/lib/stringinfo.h +3 -3
- data/ext/pg_query/include/libpq/auth.h +8 -2
- data/ext/pg_query/include/libpq/crypt.h +1 -1
- data/ext/pg_query/include/libpq/hba.h +24 -17
- data/ext/pg_query/include/libpq/libpq-be.h +36 -25
- data/ext/pg_query/include/libpq/libpq.h +1 -1
- data/ext/pg_query/include/libpq/pqcomm.h +10 -41
- data/ext/pg_query/include/libpq/pqformat.h +2 -2
- data/ext/pg_query/include/libpq/pqsignal.h +22 -10
- data/ext/pg_query/include/libpq/sasl.h +136 -0
- data/ext/pg_query/include/libpq/scram.h +37 -0
- data/ext/pg_query/include/mb/pg_wchar.h +35 -18
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +26 -14
- data/ext/pg_query/include/nodes/bitmapset.h +11 -7
- data/ext/pg_query/include/nodes/execnodes.h +83 -30
- data/ext/pg_query/include/nodes/extensible.h +5 -3
- data/ext/pg_query/include/nodes/lockoptions.h +1 -1
- data/ext/pg_query/include/nodes/makefuncs.h +14 -2
- data/ext/pg_query/include/nodes/memnodes.h +7 -4
- data/ext/pg_query/include/nodes/miscnodes.h +56 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +89 -29
- data/ext/pg_query/include/nodes/nodes.h +95 -510
- data/ext/pg_query/include/nodes/nodetags.h +471 -0
- data/ext/pg_query/include/nodes/params.h +3 -3
- data/ext/pg_query/include/nodes/parsenodes.h +377 -139
- data/ext/pg_query/include/nodes/pathnodes.h +1090 -440
- data/ext/pg_query/include/nodes/pg_list.h +30 -7
- data/ext/pg_query/include/nodes/plannodes.h +367 -124
- data/ext/pg_query/include/nodes/primnodes.h +670 -222
- data/ext/pg_query/include/nodes/print.h +1 -1
- data/ext/pg_query/include/{utils → nodes}/queryjumble.h +5 -7
- data/ext/pg_query/include/nodes/replnodes.h +111 -0
- data/ext/pg_query/include/nodes/supportnodes.h +346 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/nodes/value.h +12 -2
- data/ext/pg_query/include/optimizer/cost.h +6 -4
- data/ext/pg_query/include/optimizer/geqo.h +1 -1
- data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/optimizer/optimizer.h +8 -8
- data/ext/pg_query/include/optimizer/paths.h +16 -7
- data/ext/pg_query/include/optimizer/planmain.h +3 -6
- data/ext/pg_query/include/parser/analyze.h +4 -3
- data/ext/pg_query/include/parser/kwlist.h +12 -1
- data/ext/pg_query/include/parser/parse_agg.h +4 -2
- data/ext/pg_query/include/parser/parse_coerce.h +3 -1
- data/ext/pg_query/include/parser/parse_expr.h +1 -1
- data/ext/pg_query/include/parser/parse_func.h +1 -1
- data/ext/pg_query/include/parser/parse_node.h +22 -4
- data/ext/pg_query/include/parser/parse_oper.h +3 -3
- data/ext/pg_query/include/parser/parse_relation.h +8 -3
- data/ext/pg_query/include/parser/parse_type.h +4 -3
- data/ext/pg_query/include/parser/parser.h +1 -1
- data/ext/pg_query/include/parser/parsetree.h +1 -1
- data/ext/pg_query/include/parser/scanner.h +2 -2
- data/ext/pg_query/include/parser/scansup.h +1 -1
- data/ext/pg_query/include/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/pg_config.h +21 -216
- data/ext/pg_query/include/pg_config_manual.h +8 -46
- data/ext/pg_query/include/pg_getopt.h +1 -1
- data/ext/pg_query/include/pg_query.h +27 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +311 -149
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +545 -489
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +5092 -4432
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +385 -343
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1294 -1161
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +137 -123
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1657 -1496
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +172 -93
- data/ext/pg_query/include/pgtime.h +3 -3
- data/ext/pg_query/include/pl_gram.h +64 -62
- data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +1 -1
- data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -1
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +48 -46
- data/ext/pg_query/include/plpgsql.h +17 -22
- data/ext/pg_query/include/port/atomics/arch-arm.h +3 -3
- data/ext/pg_query/include/port/atomics/arch-ppc.h +21 -21
- data/ext/pg_query/include/port/atomics/arch-x86.h +2 -2
- data/ext/pg_query/include/port/atomics/fallback.h +3 -3
- data/ext/pg_query/include/port/atomics/generic-gcc.h +1 -1
- data/ext/pg_query/include/port/atomics/generic.h +1 -1
- data/ext/pg_query/include/port/atomics.h +2 -7
- data/ext/pg_query/include/port/pg_bitutils.h +62 -25
- data/ext/pg_query/include/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/port/pg_crc32c.h +1 -1
- data/ext/pg_query/include/port/simd.h +375 -0
- data/ext/pg_query/include/port.h +42 -75
- data/ext/pg_query/include/portability/instr_time.h +81 -140
- data/ext/pg_query/include/postgres.h +205 -434
- data/ext/pg_query/include/postgres_ext.h +0 -1
- data/ext/pg_query/include/postmaster/autovacuum.h +1 -4
- data/ext/pg_query/include/postmaster/auxprocess.h +1 -1
- data/ext/pg_query/include/postmaster/bgworker.h +2 -2
- data/ext/pg_query/include/postmaster/bgworker_internals.h +1 -1
- data/ext/pg_query/include/postmaster/bgwriter.h +2 -2
- data/ext/pg_query/include/postmaster/fork_process.h +1 -1
- data/ext/pg_query/include/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postmaster/pgarch.h +1 -38
- data/ext/pg_query/include/postmaster/postmaster.h +5 -2
- data/ext/pg_query/include/postmaster/startup.h +3 -1
- data/ext/pg_query/include/postmaster/syslogger.h +2 -2
- data/ext/pg_query/include/postmaster/walwriter.h +3 -1
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +6186 -5585
- data/ext/pg_query/include/protobuf/pg_query.pb.h +112443 -91222
- data/ext/pg_query/include/regex/regex.h +9 -6
- data/ext/pg_query/include/replication/logicallauncher.h +6 -1
- data/ext/pg_query/include/replication/logicalproto.h +30 -10
- data/ext/pg_query/include/replication/logicalworker.h +14 -1
- data/ext/pg_query/include/replication/origin.h +4 -4
- data/ext/pg_query/include/replication/reorderbuffer.h +113 -45
- data/ext/pg_query/include/replication/slot.h +25 -6
- data/ext/pg_query/include/replication/syncrep.h +2 -8
- data/ext/pg_query/include/replication/walreceiver.h +15 -9
- data/ext/pg_query/include/replication/walsender.h +13 -13
- data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -4
- data/ext/pg_query/include/rewrite/rewriteManip.h +11 -2
- data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/src_backend_nodes_copyfuncs.funcs.c +5321 -0
- data/ext/pg_query/include/src_backend_nodes_equalfuncs.funcs.c +3354 -0
- data/ext/pg_query/include/storage/backendid.h +1 -1
- data/ext/pg_query/include/storage/block.h +24 -31
- data/ext/pg_query/include/storage/buf.h +1 -1
- data/ext/pg_query/include/storage/bufmgr.h +183 -87
- data/ext/pg_query/include/storage/bufpage.h +146 -93
- data/ext/pg_query/include/storage/condition_variable.h +2 -2
- data/ext/pg_query/include/storage/dsm.h +3 -6
- data/ext/pg_query/include/storage/dsm_impl.h +4 -1
- data/ext/pg_query/include/storage/fd.h +24 -20
- data/ext/pg_query/include/storage/fileset.h +1 -1
- data/ext/pg_query/include/storage/ipc.h +1 -1
- data/ext/pg_query/include/storage/item.h +1 -1
- data/ext/pg_query/include/storage/itemid.h +1 -1
- data/ext/pg_query/include/storage/itemptr.h +94 -57
- data/ext/pg_query/include/storage/large_object.h +1 -1
- data/ext/pg_query/include/storage/latch.h +9 -1
- data/ext/pg_query/include/storage/lmgr.h +6 -1
- data/ext/pg_query/include/storage/lock.h +21 -13
- data/ext/pg_query/include/storage/lockdefs.h +3 -3
- data/ext/pg_query/include/storage/lwlock.h +16 -2
- data/ext/pg_query/include/storage/off.h +1 -1
- data/ext/pg_query/include/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/storage/pg_shmem.h +1 -1
- data/ext/pg_query/include/storage/pmsignal.h +1 -1
- data/ext/pg_query/include/storage/predicate.h +2 -2
- data/ext/pg_query/include/storage/proc.h +22 -17
- data/ext/pg_query/include/storage/procarray.h +3 -2
- data/ext/pg_query/include/storage/proclist_types.h +1 -1
- data/ext/pg_query/include/storage/procsignal.h +3 -1
- data/ext/pg_query/include/storage/relfilelocator.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +66 -309
- data/ext/pg_query/include/storage/sharedfileset.h +1 -1
- data/ext/pg_query/include/storage/shm_mq.h +1 -1
- data/ext/pg_query/include/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/storage/shmem.h +1 -23
- data/ext/pg_query/include/storage/sinval.h +3 -3
- data/ext/pg_query/include/storage/sinvaladt.h +4 -2
- data/ext/pg_query/include/storage/smgr.h +12 -10
- data/ext/pg_query/include/storage/spin.h +1 -1
- data/ext/pg_query/include/storage/standby.h +9 -8
- data/ext/pg_query/include/storage/standbydefs.h +1 -1
- data/ext/pg_query/include/storage/sync.h +3 -3
- data/ext/pg_query/include/tcop/cmdtag.h +7 -2
- data/ext/pg_query/include/tcop/cmdtaglist.h +1 -1
- data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
- data/ext/pg_query/include/tcop/dest.h +1 -3
- data/ext/pg_query/include/tcop/fastpath.h +1 -1
- data/ext/pg_query/include/tcop/pquery.h +1 -1
- data/ext/pg_query/include/tcop/tcopprot.h +1 -4
- data/ext/pg_query/include/tcop/utility.h +1 -1
- data/ext/pg_query/include/tsearch/ts_cache.h +2 -4
- data/ext/pg_query/include/utils/acl.h +26 -81
- data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/utils/array.h +19 -1
- data/ext/pg_query/include/utils/backend_progress.h +2 -1
- data/ext/pg_query/include/utils/backend_status.h +24 -3
- data/ext/pg_query/include/utils/builtins.h +14 -5
- data/ext/pg_query/include/utils/bytea.h +1 -1
- data/ext/pg_query/include/utils/catcache.h +1 -1
- data/ext/pg_query/include/utils/date.h +37 -9
- data/ext/pg_query/include/utils/datetime.h +41 -21
- data/ext/pg_query/include/utils/datum.h +1 -1
- data/ext/pg_query/include/utils/dsa.h +5 -1
- data/ext/pg_query/include/utils/elog.h +101 -26
- data/ext/pg_query/include/utils/expandeddatum.h +14 -3
- data/ext/pg_query/include/utils/expandedrecord.h +14 -4
- data/ext/pg_query/include/utils/float.h +7 -6
- data/ext/pg_query/include/utils/fmgroids.h +54 -1
- data/ext/pg_query/include/utils/fmgrprotos.h +45 -3
- data/ext/pg_query/include/utils/fmgrtab.h +1 -1
- data/ext/pg_query/include/utils/guc.h +55 -82
- data/ext/pg_query/include/utils/guc_hooks.h +163 -0
- data/ext/pg_query/include/utils/guc_tables.h +49 -3
- data/ext/pg_query/include/utils/hsearch.h +1 -1
- data/ext/pg_query/include/utils/inval.h +3 -3
- data/ext/pg_query/include/utils/logtape.h +77 -0
- data/ext/pg_query/include/utils/lsyscache.h +5 -1
- data/ext/pg_query/include/utils/memdebug.h +1 -1
- data/ext/pg_query/include/utils/memutils.h +5 -49
- data/ext/pg_query/include/utils/memutils_internal.h +136 -0
- data/ext/pg_query/include/utils/memutils_memorychunk.h +237 -0
- data/ext/pg_query/include/utils/numeric.h +20 -5
- data/ext/pg_query/include/utils/palloc.h +8 -1
- data/ext/pg_query/include/utils/partcache.h +3 -2
- data/ext/pg_query/include/utils/pg_locale.h +22 -14
- data/ext/pg_query/include/utils/pgstat_internal.h +37 -7
- data/ext/pg_query/include/utils/pidfile.h +1 -1
- data/ext/pg_query/include/utils/plancache.h +1 -1
- data/ext/pg_query/include/utils/portal.h +1 -1
- data/ext/pg_query/include/utils/probes.h +6 -6
- data/ext/pg_query/include/utils/ps_status.h +23 -1
- data/ext/pg_query/include/utils/queryenvironment.h +1 -1
- data/ext/pg_query/include/utils/regproc.h +3 -3
- data/ext/pg_query/include/utils/rel.h +60 -43
- data/ext/pg_query/include/utils/relcache.h +13 -8
- data/ext/pg_query/include/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/utils/resowner.h +1 -1
- data/ext/pg_query/include/utils/ruleutils.h +6 -1
- data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/utils/snapmgr.h +4 -2
- data/ext/pg_query/include/utils/snapshot.h +1 -1
- data/ext/pg_query/include/utils/sortsupport.h +2 -2
- data/ext/pg_query/include/utils/syscache.h +4 -1
- data/ext/pg_query/include/utils/timeout.h +1 -1
- data/ext/pg_query/include/utils/timestamp.h +41 -11
- data/ext/pg_query/include/utils/tuplesort.h +189 -35
- data/ext/pg_query/include/utils/tuplestore.h +1 -1
- data/ext/pg_query/include/utils/typcache.h +1 -1
- data/ext/pg_query/include/utils/varlena.h +13 -1
- data/ext/pg_query/include/utils/wait_event.h +9 -4
- data/ext/pg_query/include/utils/xml.h +15 -5
- data/ext/pg_query/include/varatt.h +358 -0
- data/ext/pg_query/pg_query.c +1 -1
- data/ext/pg_query/pg_query.pb-c.c +19755 -17757
- data/ext/pg_query/pg_query_fingerprint.c +8 -3
- data/ext/pg_query/pg_query_fingerprint.h +1 -1
- data/ext/pg_query/pg_query_internal.h +1 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +1 -0
- data/ext/pg_query/pg_query_normalize.c +1 -1
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +2 -2
- data/ext/pg_query/pg_query_parse.c +46 -4
- data/ext/pg_query/pg_query_parse_plpgsql.c +1 -1
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/pg_query_split.c +2 -2
- data/ext/pg_query/postgres_deparse.c +503 -105
- data/ext/pg_query/src_backend_catalog_namespace.c +7 -2
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -1
- data/ext/pg_query/src_backend_commands_define.c +1 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +11 -70
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +14 -2
- data/ext/pg_query/src_backend_nodes_makefuncs.c +95 -1
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +283 -132
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +33208 -31806
- data/ext/pg_query/src_backend_parser_parser.c +28 -2
- data/ext/pg_query/src_backend_parser_scan.c +4318 -3329
- data/ext/pg_query/src_backend_parser_scansup.c +1 -1
- data/ext/pg_query/src_backend_postmaster_postmaster.c +129 -110
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +66 -87
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_datum.c +5 -7
- 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 +489 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +79 -5
- data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
- data/ext/pg_query/src_backend_utils_error_elog.c +354 -97
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +33 -1
- data/ext/pg_query/src_backend_utils_init_globals.c +5 -2
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +13 -4
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +494 -0
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +163 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +449 -312
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +398 -49
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +1021 -0
- data/ext/pg_query/src_common_encnames.c +4 -1
- 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 +534 -510
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_stringinfo.c +4 -4
- data/ext/pg_query/src_common_wchar.c +9 -8
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +661 -694
- 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 +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
- data/ext/pg_query/src_port_pg_bitutils.c +1 -1
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +3 -7
- data/ext/pg_query/src_port_strerror.c +1 -1
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/pg_query_pb.rb +166 -3191
- data/lib/pg_query/treewalker.rb +7 -2
- data/lib/pg_query/version.rb +1 -1
- metadata +43 -24
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
- data/ext/pg_query/include/commands/variable.h +0 -38
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/parser/gram.h +0 -1101
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/utils/dynahash.h +0 -20
- data/ext/pg_query/include/utils/pg_lsn.h +0 -29
- data/ext/pg_query/include/utils/rls.h +0 -50
- data/ext/pg_query/include/utils/tzparser.h +0 -39
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
- data/ext/pg_query/src_common_pg_prng.c +0 -152
- data/ext/pg_query/src_common_string.c +0 -92
- data/ext/pg_query/src_port_pgsleep.c +0 -69
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* - is_log_level_output
|
|
14
14
|
* - should_output_to_client
|
|
15
15
|
* - recursion_depth
|
|
16
|
+
* - get_error_stack_entry
|
|
17
|
+
* - set_stack_entry_domain
|
|
16
18
|
* - errmsg_internal
|
|
17
19
|
* - errcode
|
|
18
20
|
* - errmsg
|
|
@@ -25,9 +27,14 @@
|
|
|
25
27
|
* - emit_log_hook
|
|
26
28
|
* - send_message_to_server_log
|
|
27
29
|
* - send_message_to_frontend
|
|
30
|
+
* - set_stack_entry_location
|
|
28
31
|
* - matches_backtrace_functions
|
|
32
|
+
* - backtrace_symbol_list
|
|
29
33
|
* - set_backtrace
|
|
34
|
+
* - FreeErrorDataContents
|
|
30
35
|
* - geterrcode
|
|
36
|
+
* - errsave_start
|
|
37
|
+
* - errsave_finish
|
|
31
38
|
* - errhint
|
|
32
39
|
* - errposition
|
|
33
40
|
* - internalerrposition
|
|
@@ -86,7 +93,7 @@
|
|
|
86
93
|
* overflow.)
|
|
87
94
|
*
|
|
88
95
|
*
|
|
89
|
-
* Portions Copyright (c) 1996-
|
|
96
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
90
97
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
91
98
|
*
|
|
92
99
|
*
|
|
@@ -114,6 +121,7 @@
|
|
|
114
121
|
#include "libpq/libpq.h"
|
|
115
122
|
#include "libpq/pqformat.h"
|
|
116
123
|
#include "mb/pg_wchar.h"
|
|
124
|
+
#include "nodes/miscnodes.h"
|
|
117
125
|
#include "miscadmin.h"
|
|
118
126
|
#include "pgstat.h"
|
|
119
127
|
#include "postmaster/bgworker.h"
|
|
@@ -122,9 +130,10 @@
|
|
|
122
130
|
#include "storage/ipc.h"
|
|
123
131
|
#include "storage/proc.h"
|
|
124
132
|
#include "tcop/tcopprot.h"
|
|
125
|
-
#include "utils/
|
|
133
|
+
#include "utils/guc_hooks.h"
|
|
126
134
|
#include "utils/memutils.h"
|
|
127
135
|
#include "utils/ps_status.h"
|
|
136
|
+
#include "utils/varlena.h"
|
|
128
137
|
|
|
129
138
|
|
|
130
139
|
/* In this module, access gettext() via err_gettext() */
|
|
@@ -159,6 +168,10 @@ __thread emit_log_hook_type emit_log_hook = NULL;
|
|
|
159
168
|
|
|
160
169
|
|
|
161
170
|
|
|
171
|
+
/* Processed form of backtrace_symbols GUC */
|
|
172
|
+
static __thread char *backtrace_symbol_list;
|
|
173
|
+
|
|
174
|
+
|
|
162
175
|
#ifdef HAVE_SYSLOG
|
|
163
176
|
|
|
164
177
|
/*
|
|
@@ -221,10 +234,17 @@ static __thread int recursion_depth = 0;
|
|
|
221
234
|
|
|
222
235
|
|
|
223
236
|
static const char *err_gettext(const char *str) pg_attribute_format_arg(1);
|
|
237
|
+
static ErrorData *get_error_stack_entry(void);
|
|
238
|
+
static void set_stack_entry_domain(ErrorData *edata, const char *domain);
|
|
239
|
+
static void set_stack_entry_location(ErrorData *edata,
|
|
240
|
+
const char *filename, int lineno,
|
|
241
|
+
const char *funcname);
|
|
242
|
+
static bool matches_backtrace_functions(const char *funcname);
|
|
224
243
|
static pg_noinline void set_backtrace(ErrorData *edata, int num_skip);
|
|
225
244
|
static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);
|
|
245
|
+
static void FreeErrorDataContents(ErrorData *edata);
|
|
226
246
|
static void write_console(const char *line, int len);
|
|
227
|
-
static const char *process_log_prefix_padding(const char *p, int *
|
|
247
|
+
static const char *process_log_prefix_padding(const char *p, int *ppadding);
|
|
228
248
|
static void log_line_prefix(StringInfo buf, ErrorData *edata);
|
|
229
249
|
static void send_message_to_server_log(ErrorData *edata);
|
|
230
250
|
static void send_message_to_frontend(ErrorData *edata);
|
|
@@ -468,27 +488,13 @@ errstart(int elevel, const char *domain)
|
|
|
468
488
|
debug_query_string = NULL;
|
|
469
489
|
}
|
|
470
490
|
}
|
|
471
|
-
if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)
|
|
472
|
-
{
|
|
473
|
-
/*
|
|
474
|
-
* Wups, stack not big enough. We treat this as a PANIC condition
|
|
475
|
-
* because it suggests an infinite loop of errors during error
|
|
476
|
-
* recovery.
|
|
477
|
-
*/
|
|
478
|
-
errordata_stack_depth = -1; /* make room on stack */
|
|
479
|
-
ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
|
|
480
|
-
}
|
|
481
491
|
|
|
482
492
|
/* Initialize data for this error frame */
|
|
483
|
-
edata =
|
|
484
|
-
MemSet(edata, 0, sizeof(ErrorData));
|
|
493
|
+
edata = get_error_stack_entry();
|
|
485
494
|
edata->elevel = elevel;
|
|
486
495
|
edata->output_to_server = output_to_server;
|
|
487
496
|
edata->output_to_client = output_to_client;
|
|
488
|
-
|
|
489
|
-
edata->domain = domain ? domain : PG_TEXTDOMAIN("postgres");
|
|
490
|
-
/* initialize context_domain the same way (see set_errcontext_domain()) */
|
|
491
|
-
edata->context_domain = edata->domain;
|
|
497
|
+
set_stack_entry_domain(edata, domain);
|
|
492
498
|
/* Select default errcode based on elevel */
|
|
493
499
|
if (elevel >= ERROR)
|
|
494
500
|
edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
|
|
@@ -496,8 +502,6 @@ errstart(int elevel, const char *domain)
|
|
|
496
502
|
edata->sqlerrcode = ERRCODE_WARNING;
|
|
497
503
|
else
|
|
498
504
|
edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;
|
|
499
|
-
/* errno is saved here so that error parameter eval can't change it */
|
|
500
|
-
edata->saved_errno = errno;
|
|
501
505
|
|
|
502
506
|
/*
|
|
503
507
|
* Any allocations for this error state level should go into ErrorContext
|
|
@@ -508,32 +512,6 @@ errstart(int elevel, const char *domain)
|
|
|
508
512
|
return true;
|
|
509
513
|
}
|
|
510
514
|
|
|
511
|
-
/*
|
|
512
|
-
* Checks whether the given funcname matches backtrace_functions; see
|
|
513
|
-
* check_backtrace_functions.
|
|
514
|
-
*/
|
|
515
|
-
static bool
|
|
516
|
-
matches_backtrace_functions(const char *funcname)
|
|
517
|
-
{
|
|
518
|
-
char *p;
|
|
519
|
-
|
|
520
|
-
if (!backtrace_symbol_list || funcname == NULL || funcname[0] == '\0')
|
|
521
|
-
return false;
|
|
522
|
-
|
|
523
|
-
p = backtrace_symbol_list;
|
|
524
|
-
for (;;)
|
|
525
|
-
{
|
|
526
|
-
if (*p == '\0') /* end of backtrace_symbol_list */
|
|
527
|
-
break;
|
|
528
|
-
|
|
529
|
-
if (strcmp(funcname, p) == 0)
|
|
530
|
-
return true;
|
|
531
|
-
p += strlen(p) + 1;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
return false;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
515
|
/*
|
|
538
516
|
* errfinish --- end an error-reporting cycle
|
|
539
517
|
*
|
|
@@ -554,23 +532,7 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
554
532
|
CHECK_STACK_DEPTH();
|
|
555
533
|
|
|
556
534
|
/* Save the last few bits of error state into the stack entry */
|
|
557
|
-
|
|
558
|
-
{
|
|
559
|
-
const char *slash;
|
|
560
|
-
|
|
561
|
-
/* keep only base name, useful especially for vpath builds */
|
|
562
|
-
slash = strrchr(filename, '/');
|
|
563
|
-
if (slash)
|
|
564
|
-
filename = slash + 1;
|
|
565
|
-
/* Some Windows compilers use backslashes in __FILE__ strings */
|
|
566
|
-
slash = strrchr(filename, '\\');
|
|
567
|
-
if (slash)
|
|
568
|
-
filename = slash + 1;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
edata->filename = filename;
|
|
572
|
-
edata->lineno = lineno;
|
|
573
|
-
edata->funcname = funcname;
|
|
535
|
+
set_stack_entry_location(edata, filename, lineno, funcname);
|
|
574
536
|
|
|
575
537
|
elevel = edata->elevel;
|
|
576
538
|
|
|
@@ -580,6 +542,7 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
580
542
|
*/
|
|
581
543
|
oldcontext = MemoryContextSwitchTo(ErrorContext);
|
|
582
544
|
|
|
545
|
+
/* Collect backtrace, if enabled and we didn't already */
|
|
583
546
|
if (!edata->backtrace &&
|
|
584
547
|
edata->funcname &&
|
|
585
548
|
backtrace_functions &&
|
|
@@ -630,31 +593,7 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
630
593
|
EmitErrorReport();
|
|
631
594
|
|
|
632
595
|
/* Now free up subsidiary data attached to stack entry, and release it */
|
|
633
|
-
|
|
634
|
-
pfree(edata->message);
|
|
635
|
-
if (edata->detail)
|
|
636
|
-
pfree(edata->detail);
|
|
637
|
-
if (edata->detail_log)
|
|
638
|
-
pfree(edata->detail_log);
|
|
639
|
-
if (edata->hint)
|
|
640
|
-
pfree(edata->hint);
|
|
641
|
-
if (edata->context)
|
|
642
|
-
pfree(edata->context);
|
|
643
|
-
if (edata->backtrace)
|
|
644
|
-
pfree(edata->backtrace);
|
|
645
|
-
if (edata->schema_name)
|
|
646
|
-
pfree(edata->schema_name);
|
|
647
|
-
if (edata->table_name)
|
|
648
|
-
pfree(edata->table_name);
|
|
649
|
-
if (edata->column_name)
|
|
650
|
-
pfree(edata->column_name);
|
|
651
|
-
if (edata->datatype_name)
|
|
652
|
-
pfree(edata->datatype_name);
|
|
653
|
-
if (edata->constraint_name)
|
|
654
|
-
pfree(edata->constraint_name);
|
|
655
|
-
if (edata->internalquery)
|
|
656
|
-
pfree(edata->internalquery);
|
|
657
|
-
|
|
596
|
+
FreeErrorDataContents(edata);
|
|
658
597
|
errordata_stack_depth--;
|
|
659
598
|
|
|
660
599
|
/* Exit error-handling context */
|
|
@@ -681,8 +620,7 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
681
620
|
* Any other code you might be tempted to add here should probably be
|
|
682
621
|
* in an on_proc_exit or on_shmem_exit callback instead.
|
|
683
622
|
*/
|
|
684
|
-
fflush(
|
|
685
|
-
fflush(stderr);
|
|
623
|
+
fflush(NULL);
|
|
686
624
|
|
|
687
625
|
/*
|
|
688
626
|
* Let the cumulative stats system know. Only mark the session as
|
|
@@ -708,8 +646,7 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
708
646
|
* XXX: what if we are *in* the postmaster? abort() won't kill our
|
|
709
647
|
* children...
|
|
710
648
|
*/
|
|
711
|
-
fflush(
|
|
712
|
-
fflush(stderr);
|
|
649
|
+
fflush(NULL);
|
|
713
650
|
abort();
|
|
714
651
|
}
|
|
715
652
|
|
|
@@ -722,6 +659,242 @@ errfinish(const char *filename, int lineno, const char *funcname)
|
|
|
722
659
|
}
|
|
723
660
|
|
|
724
661
|
|
|
662
|
+
/*
|
|
663
|
+
* errsave_start --- begin a "soft" error-reporting cycle
|
|
664
|
+
*
|
|
665
|
+
* If "context" isn't an ErrorSaveContext node, this behaves as
|
|
666
|
+
* errstart(ERROR, domain), and the errsave() macro ends up acting
|
|
667
|
+
* exactly like ereport(ERROR, ...).
|
|
668
|
+
*
|
|
669
|
+
* If "context" is an ErrorSaveContext node, but the node creator only wants
|
|
670
|
+
* notification of the fact of a soft error without any details, we just set
|
|
671
|
+
* the error_occurred flag in the ErrorSaveContext node and return false,
|
|
672
|
+
* which will cause us to skip the remaining error processing steps.
|
|
673
|
+
*
|
|
674
|
+
* Otherwise, create and initialize error stack entry and return true.
|
|
675
|
+
* Subsequently, errmsg() and perhaps other routines will be called to further
|
|
676
|
+
* populate the stack entry. Finally, errsave_finish() will be called to
|
|
677
|
+
* tidy up.
|
|
678
|
+
*/
|
|
679
|
+
bool
|
|
680
|
+
errsave_start(struct Node *context, const char *domain)
|
|
681
|
+
{
|
|
682
|
+
ErrorSaveContext *escontext;
|
|
683
|
+
ErrorData *edata;
|
|
684
|
+
|
|
685
|
+
/*
|
|
686
|
+
* Do we have a context for soft error reporting? If not, just punt to
|
|
687
|
+
* errstart().
|
|
688
|
+
*/
|
|
689
|
+
if (context == NULL || !IsA(context, ErrorSaveContext))
|
|
690
|
+
return errstart(ERROR, domain);
|
|
691
|
+
|
|
692
|
+
/* Report that a soft error was detected */
|
|
693
|
+
escontext = (ErrorSaveContext *) context;
|
|
694
|
+
escontext->error_occurred = true;
|
|
695
|
+
|
|
696
|
+
/* Nothing else to do if caller wants no further details */
|
|
697
|
+
if (!escontext->details_wanted)
|
|
698
|
+
return false;
|
|
699
|
+
|
|
700
|
+
/*
|
|
701
|
+
* Okay, crank up a stack entry to store the info in.
|
|
702
|
+
*/
|
|
703
|
+
|
|
704
|
+
recursion_depth++;
|
|
705
|
+
|
|
706
|
+
/* Initialize data for this error frame */
|
|
707
|
+
edata = get_error_stack_entry();
|
|
708
|
+
edata->elevel = LOG; /* signal all is well to errsave_finish */
|
|
709
|
+
set_stack_entry_domain(edata, domain);
|
|
710
|
+
/* Select default errcode based on the assumed elevel of ERROR */
|
|
711
|
+
edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;
|
|
712
|
+
|
|
713
|
+
/*
|
|
714
|
+
* Any allocations for this error state level should go into the caller's
|
|
715
|
+
* context. We don't need to pollute ErrorContext, or even require it to
|
|
716
|
+
* exist, in this code path.
|
|
717
|
+
*/
|
|
718
|
+
edata->assoc_context = CurrentMemoryContext;
|
|
719
|
+
|
|
720
|
+
recursion_depth--;
|
|
721
|
+
return true;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/*
|
|
725
|
+
* errsave_finish --- end a "soft" error-reporting cycle
|
|
726
|
+
*
|
|
727
|
+
* If errsave_start() decided this was a regular error, behave as
|
|
728
|
+
* errfinish(). Otherwise, package up the error details and save
|
|
729
|
+
* them in the ErrorSaveContext node.
|
|
730
|
+
*/
|
|
731
|
+
void
|
|
732
|
+
errsave_finish(struct Node *context, const char *filename, int lineno,
|
|
733
|
+
const char *funcname)
|
|
734
|
+
{
|
|
735
|
+
ErrorSaveContext *escontext = (ErrorSaveContext *) context;
|
|
736
|
+
ErrorData *edata = &errordata[errordata_stack_depth];
|
|
737
|
+
|
|
738
|
+
/* verify stack depth before accessing *edata */
|
|
739
|
+
CHECK_STACK_DEPTH();
|
|
740
|
+
|
|
741
|
+
/*
|
|
742
|
+
* If errsave_start punted to errstart, then elevel will be ERROR or
|
|
743
|
+
* perhaps even PANIC. Punt likewise to errfinish.
|
|
744
|
+
*/
|
|
745
|
+
if (edata->elevel >= ERROR)
|
|
746
|
+
{
|
|
747
|
+
errfinish(filename, lineno, funcname);
|
|
748
|
+
pg_unreachable();
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
/*
|
|
752
|
+
* Else, we should package up the stack entry contents and deliver them to
|
|
753
|
+
* the caller.
|
|
754
|
+
*/
|
|
755
|
+
recursion_depth++;
|
|
756
|
+
|
|
757
|
+
/* Save the last few bits of error state into the stack entry */
|
|
758
|
+
set_stack_entry_location(edata, filename, lineno, funcname);
|
|
759
|
+
|
|
760
|
+
/* Replace the LOG value that errsave_start inserted */
|
|
761
|
+
edata->elevel = ERROR;
|
|
762
|
+
|
|
763
|
+
/*
|
|
764
|
+
* We skip calling backtrace and context functions, which are more likely
|
|
765
|
+
* to cause trouble than provide useful context; they might act on the
|
|
766
|
+
* assumption that a transaction abort is about to occur.
|
|
767
|
+
*/
|
|
768
|
+
|
|
769
|
+
/*
|
|
770
|
+
* Make a copy of the error info for the caller. All the subsidiary
|
|
771
|
+
* strings are already in the caller's context, so it's sufficient to
|
|
772
|
+
* flat-copy the stack entry.
|
|
773
|
+
*/
|
|
774
|
+
escontext->error_data = palloc_object(ErrorData);
|
|
775
|
+
memcpy(escontext->error_data, edata, sizeof(ErrorData));
|
|
776
|
+
|
|
777
|
+
/* Exit error-handling context */
|
|
778
|
+
errordata_stack_depth--;
|
|
779
|
+
recursion_depth--;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
|
|
783
|
+
/*
|
|
784
|
+
* get_error_stack_entry --- allocate and initialize a new stack entry
|
|
785
|
+
*
|
|
786
|
+
* The entry should be freed, when we're done with it, by calling
|
|
787
|
+
* FreeErrorDataContents() and then decrementing errordata_stack_depth.
|
|
788
|
+
*
|
|
789
|
+
* Returning the entry's address is just a notational convenience,
|
|
790
|
+
* since it had better be errordata[errordata_stack_depth].
|
|
791
|
+
*
|
|
792
|
+
* Although the error stack is not large, we don't expect to run out of space.
|
|
793
|
+
* Using more than one entry implies a new error report during error recovery,
|
|
794
|
+
* which is possible but already suggests we're in trouble. If we exhaust the
|
|
795
|
+
* stack, almost certainly we are in an infinite loop of errors during error
|
|
796
|
+
* recovery, so we give up and PANIC.
|
|
797
|
+
*
|
|
798
|
+
* (Note that this is distinct from the recursion_depth checks, which
|
|
799
|
+
* guard against recursion while handling a single stack entry.)
|
|
800
|
+
*/
|
|
801
|
+
static ErrorData *
|
|
802
|
+
get_error_stack_entry(void)
|
|
803
|
+
{
|
|
804
|
+
ErrorData *edata;
|
|
805
|
+
|
|
806
|
+
/* Allocate error frame */
|
|
807
|
+
errordata_stack_depth++;
|
|
808
|
+
if (unlikely(errordata_stack_depth >= ERRORDATA_STACK_SIZE))
|
|
809
|
+
{
|
|
810
|
+
/* Wups, stack not big enough */
|
|
811
|
+
errordata_stack_depth = -1; /* make room on stack */
|
|
812
|
+
ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/* Initialize error frame to all zeroes/NULLs */
|
|
816
|
+
edata = &errordata[errordata_stack_depth];
|
|
817
|
+
memset(edata, 0, sizeof(ErrorData));
|
|
818
|
+
|
|
819
|
+
/* Save errno immediately to ensure error parameter eval can't change it */
|
|
820
|
+
edata->saved_errno = errno;
|
|
821
|
+
|
|
822
|
+
return edata;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/*
|
|
826
|
+
* set_stack_entry_domain --- fill in the internationalization domain
|
|
827
|
+
*/
|
|
828
|
+
static void
|
|
829
|
+
set_stack_entry_domain(ErrorData *edata, const char *domain)
|
|
830
|
+
{
|
|
831
|
+
/* the default text domain is the backend's */
|
|
832
|
+
edata->domain = domain ? domain : PG_TEXTDOMAIN("postgres");
|
|
833
|
+
/* initialize context_domain the same way (see set_errcontext_domain()) */
|
|
834
|
+
edata->context_domain = edata->domain;
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
/*
|
|
838
|
+
* set_stack_entry_location --- fill in code-location details
|
|
839
|
+
*
|
|
840
|
+
* Store the values of __FILE__, __LINE__, and __func__ from the call site.
|
|
841
|
+
* We make an effort to normalize __FILE__, since compilers are inconsistent
|
|
842
|
+
* about how much of the path they'll include, and we'd prefer that the
|
|
843
|
+
* behavior not depend on that (especially, that it not vary with build path).
|
|
844
|
+
*/
|
|
845
|
+
static void
|
|
846
|
+
set_stack_entry_location(ErrorData *edata,
|
|
847
|
+
const char *filename, int lineno,
|
|
848
|
+
const char *funcname)
|
|
849
|
+
{
|
|
850
|
+
if (filename)
|
|
851
|
+
{
|
|
852
|
+
const char *slash;
|
|
853
|
+
|
|
854
|
+
/* keep only base name, useful especially for vpath builds */
|
|
855
|
+
slash = strrchr(filename, '/');
|
|
856
|
+
if (slash)
|
|
857
|
+
filename = slash + 1;
|
|
858
|
+
/* Some Windows compilers use backslashes in __FILE__ strings */
|
|
859
|
+
slash = strrchr(filename, '\\');
|
|
860
|
+
if (slash)
|
|
861
|
+
filename = slash + 1;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
edata->filename = filename;
|
|
865
|
+
edata->lineno = lineno;
|
|
866
|
+
edata->funcname = funcname;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/*
|
|
870
|
+
* matches_backtrace_functions --- checks whether the given funcname matches
|
|
871
|
+
* backtrace_functions
|
|
872
|
+
*
|
|
873
|
+
* See check_backtrace_functions.
|
|
874
|
+
*/
|
|
875
|
+
static bool
|
|
876
|
+
matches_backtrace_functions(const char *funcname)
|
|
877
|
+
{
|
|
878
|
+
const char *p;
|
|
879
|
+
|
|
880
|
+
if (!backtrace_symbol_list || funcname == NULL || funcname[0] == '\0')
|
|
881
|
+
return false;
|
|
882
|
+
|
|
883
|
+
p = backtrace_symbol_list;
|
|
884
|
+
for (;;)
|
|
885
|
+
{
|
|
886
|
+
if (*p == '\0') /* end of backtrace_symbol_list */
|
|
887
|
+
break;
|
|
888
|
+
|
|
889
|
+
if (strcmp(funcname, p) == 0)
|
|
890
|
+
return true;
|
|
891
|
+
p += strlen(p) + 1;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
return false;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
|
|
725
898
|
/*
|
|
726
899
|
* errcode --- add SQLSTATE error code to the current error
|
|
727
900
|
*
|
|
@@ -1391,6 +1564,40 @@ CopyErrorData(void)
|
|
|
1391
1564
|
*/
|
|
1392
1565
|
|
|
1393
1566
|
|
|
1567
|
+
/*
|
|
1568
|
+
* FreeErrorDataContents --- free the subsidiary data of an ErrorData.
|
|
1569
|
+
*
|
|
1570
|
+
* This can be used on either an error stack entry or a copied ErrorData.
|
|
1571
|
+
*/
|
|
1572
|
+
static void
|
|
1573
|
+
FreeErrorDataContents(ErrorData *edata)
|
|
1574
|
+
{
|
|
1575
|
+
if (edata->message)
|
|
1576
|
+
pfree(edata->message);
|
|
1577
|
+
if (edata->detail)
|
|
1578
|
+
pfree(edata->detail);
|
|
1579
|
+
if (edata->detail_log)
|
|
1580
|
+
pfree(edata->detail_log);
|
|
1581
|
+
if (edata->hint)
|
|
1582
|
+
pfree(edata->hint);
|
|
1583
|
+
if (edata->context)
|
|
1584
|
+
pfree(edata->context);
|
|
1585
|
+
if (edata->backtrace)
|
|
1586
|
+
pfree(edata->backtrace);
|
|
1587
|
+
if (edata->schema_name)
|
|
1588
|
+
pfree(edata->schema_name);
|
|
1589
|
+
if (edata->table_name)
|
|
1590
|
+
pfree(edata->table_name);
|
|
1591
|
+
if (edata->column_name)
|
|
1592
|
+
pfree(edata->column_name);
|
|
1593
|
+
if (edata->datatype_name)
|
|
1594
|
+
pfree(edata->datatype_name);
|
|
1595
|
+
if (edata->constraint_name)
|
|
1596
|
+
pfree(edata->constraint_name);
|
|
1597
|
+
if (edata->internalquery)
|
|
1598
|
+
pfree(edata->internalquery);
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1394
1601
|
/*
|
|
1395
1602
|
* FlushErrorState --- flush the error state after error recovery
|
|
1396
1603
|
*
|
|
@@ -1479,8 +1686,7 @@ pg_re_throw(void)
|
|
|
1479
1686
|
}
|
|
1480
1687
|
|
|
1481
1688
|
/* Doesn't return ... */
|
|
1482
|
-
ExceptionalCondition("pg_re_throw tried to return",
|
|
1483
|
-
__FILE__, __LINE__);
|
|
1689
|
+
ExceptionalCondition("pg_re_throw tried to return", __FILE__, __LINE__);
|
|
1484
1690
|
}
|
|
1485
1691
|
|
|
1486
1692
|
|
|
@@ -1504,13 +1710,49 @@ pg_re_throw(void)
|
|
|
1504
1710
|
|
|
1505
1711
|
|
|
1506
1712
|
|
|
1713
|
+
/*
|
|
1714
|
+
* GUC check_hook for backtrace_functions
|
|
1715
|
+
*
|
|
1716
|
+
* We split the input string, where commas separate function names
|
|
1717
|
+
* and certain whitespace chars are ignored, into a \0-separated (and
|
|
1718
|
+
* \0\0-terminated) list of function names. This formulation allows
|
|
1719
|
+
* easy scanning when an error is thrown while avoiding the use of
|
|
1720
|
+
* non-reentrant strtok(), as well as keeping the output data in a
|
|
1721
|
+
* single palloc() chunk.
|
|
1722
|
+
*/
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
/*
|
|
1726
|
+
* GUC assign_hook for backtrace_functions
|
|
1727
|
+
*/
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
/*
|
|
1731
|
+
* GUC check_hook for log_destination
|
|
1732
|
+
*/
|
|
1507
1733
|
#ifdef HAVE_SYSLOG
|
|
1734
|
+
#endif
|
|
1735
|
+
#ifdef WIN32
|
|
1736
|
+
#endif
|
|
1737
|
+
|
|
1738
|
+
/*
|
|
1739
|
+
* GUC assign_hook for log_destination
|
|
1740
|
+
*/
|
|
1741
|
+
|
|
1508
1742
|
|
|
1509
1743
|
/*
|
|
1510
|
-
*
|
|
1744
|
+
* GUC assign_hook for syslog_ident
|
|
1511
1745
|
*/
|
|
1746
|
+
#ifdef HAVE_SYSLOG
|
|
1747
|
+
#endif
|
|
1512
1748
|
|
|
1749
|
+
/*
|
|
1750
|
+
* GUC assign_hook for syslog_facility
|
|
1751
|
+
*/
|
|
1752
|
+
#ifdef HAVE_SYSLOG
|
|
1753
|
+
#endif
|
|
1513
1754
|
|
|
1755
|
+
#ifdef HAVE_SYSLOG
|
|
1514
1756
|
|
|
1515
1757
|
/*
|
|
1516
1758
|
* Write a message line to syslog
|
|
@@ -1677,7 +1919,12 @@ write_eventlog(int level, const char *line, int len)
|
|
|
1677
1919
|
|
|
1678
1920
|
|
|
1679
1921
|
/*
|
|
1680
|
-
* Format
|
|
1922
|
+
* Format log status information using Log_line_prefix.
|
|
1923
|
+
*/
|
|
1924
|
+
|
|
1925
|
+
|
|
1926
|
+
/*
|
|
1927
|
+
* Format log status info; append to the provided buffer.
|
|
1681
1928
|
*/
|
|
1682
1929
|
|
|
1683
1930
|
|
|
@@ -1803,6 +2050,16 @@ write_stderr(const char *fmt,...)
|
|
|
1803
2050
|
}
|
|
1804
2051
|
|
|
1805
2052
|
|
|
2053
|
+
/*
|
|
2054
|
+
* Write a message to STDERR using only async-signal-safe functions. This can
|
|
2055
|
+
* be used to safely emit a message from a signal handler.
|
|
2056
|
+
*
|
|
2057
|
+
* TODO: It is likely possible to safely do a limited amount of string
|
|
2058
|
+
* interpolation (e.g., %s and %d), but that is not presently supported.
|
|
2059
|
+
*/
|
|
2060
|
+
|
|
2061
|
+
|
|
2062
|
+
|
|
1806
2063
|
/*
|
|
1807
2064
|
* Adjust the level of a recovery-related message per trace_recovery_messages.
|
|
1808
2065
|
*
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* fmgr.c
|
|
10
10
|
* The Postgres function manager.
|
|
11
11
|
*
|
|
12
|
-
* Portions Copyright (c) 1996-
|
|
12
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
13
13
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
14
14
|
*
|
|
15
15
|
*
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
#include "lib/stringinfo.h"
|
|
30
30
|
#include "miscadmin.h"
|
|
31
31
|
#include "nodes/makefuncs.h"
|
|
32
|
+
#include "nodes/miscnodes.h"
|
|
32
33
|
#include "nodes/nodeFuncs.h"
|
|
33
34
|
#include "pgstat.h"
|
|
34
35
|
#include "utils/acl.h"
|
|
@@ -366,6 +367,37 @@ FunctionCall6Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2,
|
|
|
366
367
|
*/
|
|
367
368
|
|
|
368
369
|
|
|
370
|
+
/*
|
|
371
|
+
* Call a previously-looked-up datatype input function, with non-exception
|
|
372
|
+
* handling of "soft" errors.
|
|
373
|
+
*
|
|
374
|
+
* This is basically like InputFunctionCall, but the converted Datum is
|
|
375
|
+
* returned into *result while the function result is true for success or
|
|
376
|
+
* false for failure. Also, the caller may pass an ErrorSaveContext node.
|
|
377
|
+
* (We declare that as "fmNodePtr" to avoid including nodes.h in fmgr.h.)
|
|
378
|
+
*
|
|
379
|
+
* If escontext points to an ErrorSaveContext, any "soft" errors detected by
|
|
380
|
+
* the input function will be reported by filling the escontext struct and
|
|
381
|
+
* returning false. (The caller can choose to test SOFT_ERROR_OCCURRED(),
|
|
382
|
+
* but checking the function result instead is usually cheaper.)
|
|
383
|
+
*
|
|
384
|
+
* If escontext does not point to an ErrorSaveContext, errors are reported
|
|
385
|
+
* via ereport(ERROR), so that there is no functional difference from
|
|
386
|
+
* InputFunctionCall; the result will always be true if control returns.
|
|
387
|
+
*/
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
/*
|
|
391
|
+
* Call a directly-named datatype input function, with non-exception
|
|
392
|
+
* handling of "soft" errors.
|
|
393
|
+
*
|
|
394
|
+
* This is like InputFunctionCallSafe, except that it is given a direct
|
|
395
|
+
* pointer to the C function to call. We assume that that function is
|
|
396
|
+
* strict. Also, the function cannot be one that needs to
|
|
397
|
+
* look at FmgrInfo, since there won't be any.
|
|
398
|
+
*/
|
|
399
|
+
|
|
400
|
+
|
|
369
401
|
/*
|
|
370
402
|
* Call a previously-looked-up datatype output function.
|
|
371
403
|
*
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* globals.c
|
|
14
14
|
* global variable declarations
|
|
15
15
|
*
|
|
16
|
-
* Portions Copyright (c) 1996-
|
|
16
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
17
17
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
18
18
|
*
|
|
19
19
|
*
|
|
@@ -154,7 +154,10 @@ __thread bool ExitOnAnyError = false;
|
|
|
154
154
|
|
|
155
155
|
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
/* GUC parameters for vacuum */
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
158
161
|
|
|
159
162
|
|
|
160
163
|
|