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
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/*-------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* relfilenode.h
|
|
4
|
-
* Physical access information for relations.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
|
-
*
|
|
10
|
-
* src/include/storage/relfilenode.h
|
|
11
|
-
*
|
|
12
|
-
*-------------------------------------------------------------------------
|
|
13
|
-
*/
|
|
14
|
-
#ifndef RELFILENODE_H
|
|
15
|
-
#define RELFILENODE_H
|
|
16
|
-
|
|
17
|
-
#include "common/relpath.h"
|
|
18
|
-
#include "storage/backendid.h"
|
|
19
|
-
|
|
20
|
-
/*
|
|
21
|
-
* RelFileNode must provide all that we need to know to physically access
|
|
22
|
-
* a relation, with the exception of the backend ID, which can be provided
|
|
23
|
-
* separately. Note, however, that a "physical" relation is comprised of
|
|
24
|
-
* multiple files on the filesystem, as each fork is stored as a separate
|
|
25
|
-
* file, and each fork can be divided into multiple segments. See md.c.
|
|
26
|
-
*
|
|
27
|
-
* spcNode identifies the tablespace of the relation. It corresponds to
|
|
28
|
-
* pg_tablespace.oid.
|
|
29
|
-
*
|
|
30
|
-
* dbNode identifies the database of the relation. It is zero for
|
|
31
|
-
* "shared" relations (those common to all databases of a cluster).
|
|
32
|
-
* Nonzero dbNode values correspond to pg_database.oid.
|
|
33
|
-
*
|
|
34
|
-
* relNode identifies the specific relation. relNode corresponds to
|
|
35
|
-
* pg_class.relfilenode (NOT pg_class.oid, because we need to be able
|
|
36
|
-
* to assign new physical files to relations in some situations).
|
|
37
|
-
* Notice that relNode is only unique within a database in a particular
|
|
38
|
-
* tablespace.
|
|
39
|
-
*
|
|
40
|
-
* Note: spcNode must be GLOBALTABLESPACE_OID if and only if dbNode is
|
|
41
|
-
* zero. We support shared relations only in the "global" tablespace.
|
|
42
|
-
*
|
|
43
|
-
* Note: in pg_class we allow reltablespace == 0 to denote that the
|
|
44
|
-
* relation is stored in its database's "default" tablespace (as
|
|
45
|
-
* identified by pg_database.dattablespace). However this shorthand
|
|
46
|
-
* is NOT allowed in RelFileNode structs --- the real tablespace ID
|
|
47
|
-
* must be supplied when setting spcNode.
|
|
48
|
-
*
|
|
49
|
-
* Note: in pg_class, relfilenode can be zero to denote that the relation
|
|
50
|
-
* is a "mapped" relation, whose current true filenode number is available
|
|
51
|
-
* from relmapper.c. Again, this case is NOT allowed in RelFileNodes.
|
|
52
|
-
*
|
|
53
|
-
* Note: various places use RelFileNode in hashtable keys. Therefore,
|
|
54
|
-
* there *must not* be any unused padding bytes in this struct. That
|
|
55
|
-
* should be safe as long as all the fields are of type Oid.
|
|
56
|
-
*/
|
|
57
|
-
typedef struct RelFileNode
|
|
58
|
-
{
|
|
59
|
-
Oid spcNode; /* tablespace */
|
|
60
|
-
Oid dbNode; /* database */
|
|
61
|
-
Oid relNode; /* relation */
|
|
62
|
-
} RelFileNode;
|
|
63
|
-
|
|
64
|
-
/*
|
|
65
|
-
* Augmenting a relfilenode with the backend ID provides all the information
|
|
66
|
-
* we need to locate the physical storage. The backend ID is InvalidBackendId
|
|
67
|
-
* for regular relations (those accessible to more than one backend), or the
|
|
68
|
-
* owning backend's ID for backend-local relations. Backend-local relations
|
|
69
|
-
* are always transient and removed in case of a database crash; they are
|
|
70
|
-
* never WAL-logged or fsync'd.
|
|
71
|
-
*/
|
|
72
|
-
typedef struct RelFileNodeBackend
|
|
73
|
-
{
|
|
74
|
-
RelFileNode node;
|
|
75
|
-
BackendId backend;
|
|
76
|
-
} RelFileNodeBackend;
|
|
77
|
-
|
|
78
|
-
#define RelFileNodeBackendIsTemp(rnode) \
|
|
79
|
-
((rnode).backend != InvalidBackendId)
|
|
80
|
-
|
|
81
|
-
/*
|
|
82
|
-
* Note: RelFileNodeEquals and RelFileNodeBackendEquals compare relNode first
|
|
83
|
-
* since that is most likely to be different in two unequal RelFileNodes. It
|
|
84
|
-
* is probably redundant to compare spcNode if the other fields are found equal,
|
|
85
|
-
* but do it anyway to be sure. Likewise for checking the backend ID in
|
|
86
|
-
* RelFileNodeBackendEquals.
|
|
87
|
-
*/
|
|
88
|
-
#define RelFileNodeEquals(node1, node2) \
|
|
89
|
-
((node1).relNode == (node2).relNode && \
|
|
90
|
-
(node1).dbNode == (node2).dbNode && \
|
|
91
|
-
(node1).spcNode == (node2).spcNode)
|
|
92
|
-
|
|
93
|
-
#define RelFileNodeBackendEquals(node1, node2) \
|
|
94
|
-
((node1).node.relNode == (node2).node.relNode && \
|
|
95
|
-
(node1).node.dbNode == (node2).node.dbNode && \
|
|
96
|
-
(node1).backend == (node2).backend && \
|
|
97
|
-
(node1).node.spcNode == (node2).node.spcNode)
|
|
98
|
-
|
|
99
|
-
#endif /* RELFILENODE_H */
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/*-------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* dynahash.h
|
|
4
|
-
* POSTGRES dynahash.h file definitions
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
|
-
*
|
|
10
|
-
* IDENTIFICATION
|
|
11
|
-
* src/include/utils/dynahash.h
|
|
12
|
-
*
|
|
13
|
-
*-------------------------------------------------------------------------
|
|
14
|
-
*/
|
|
15
|
-
#ifndef DYNAHASH_H
|
|
16
|
-
#define DYNAHASH_H
|
|
17
|
-
|
|
18
|
-
extern int my_log2(long num);
|
|
19
|
-
|
|
20
|
-
#endif /* DYNAHASH_H */
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/*-------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* pg_lsn.h
|
|
4
|
-
* Declarations for operations on log sequence numbers (LSNs) of
|
|
5
|
-
* PostgreSQL.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
9
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
|
10
|
-
*
|
|
11
|
-
* src/include/utils/pg_lsn.h
|
|
12
|
-
*
|
|
13
|
-
*-------------------------------------------------------------------------
|
|
14
|
-
*/
|
|
15
|
-
#ifndef PG_LSN_H
|
|
16
|
-
#define PG_LSN_H
|
|
17
|
-
|
|
18
|
-
#include "access/xlogdefs.h"
|
|
19
|
-
#include "fmgr.h"
|
|
20
|
-
|
|
21
|
-
#define DatumGetLSN(X) ((XLogRecPtr) DatumGetInt64(X))
|
|
22
|
-
#define LSNGetDatum(X) (Int64GetDatum((int64) (X)))
|
|
23
|
-
|
|
24
|
-
#define PG_GETARG_LSN(n) DatumGetLSN(PG_GETARG_DATUM(n))
|
|
25
|
-
#define PG_RETURN_LSN(x) return LSNGetDatum(x)
|
|
26
|
-
|
|
27
|
-
extern XLogRecPtr pg_lsn_in_internal(const char *str, bool *have_error);
|
|
28
|
-
|
|
29
|
-
#endif /* PG_LSN_H */
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/*-------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* rls.h
|
|
4
|
-
* Header file for Row Level Security (RLS) utility commands to be used
|
|
5
|
-
* with the rowsecurity feature.
|
|
6
|
-
*
|
|
7
|
-
* Copyright (c) 2007-2022, PostgreSQL Global Development Group
|
|
8
|
-
*
|
|
9
|
-
* src/include/utils/rls.h
|
|
10
|
-
*
|
|
11
|
-
*-------------------------------------------------------------------------
|
|
12
|
-
*/
|
|
13
|
-
#ifndef RLS_H
|
|
14
|
-
#define RLS_H
|
|
15
|
-
|
|
16
|
-
/* GUC variable */
|
|
17
|
-
extern PGDLLIMPORT bool row_security;
|
|
18
|
-
|
|
19
|
-
/*
|
|
20
|
-
* Used by callers of check_enable_rls.
|
|
21
|
-
*
|
|
22
|
-
* RLS could be completely disabled on the tables involved in the query,
|
|
23
|
-
* which is the simple case, or it may depend on the current environment
|
|
24
|
-
* (the role which is running the query or the value of the row_security
|
|
25
|
-
* GUC), or it might be simply enabled as usual.
|
|
26
|
-
*
|
|
27
|
-
* If RLS isn't on the table involved then RLS_NONE is returned to indicate
|
|
28
|
-
* that we don't need to worry about invalidating the query plan for RLS
|
|
29
|
-
* reasons. If RLS is on the table, but we are bypassing it for now, then
|
|
30
|
-
* we return RLS_NONE_ENV to indicate that, if the environment changes,
|
|
31
|
-
* we need to invalidate and replan. Finally, if RLS should be turned on
|
|
32
|
-
* for the query, then we return RLS_ENABLED, which means we also need to
|
|
33
|
-
* invalidate if the environment changes.
|
|
34
|
-
*
|
|
35
|
-
* Note that RLS_ENABLED will also be returned if noError is true
|
|
36
|
-
* (indicating that the caller simply want to know if RLS should be applied
|
|
37
|
-
* for this user but doesn't want an error thrown if it is; this is used
|
|
38
|
-
* by other error cases where we're just trying to decide if data from the
|
|
39
|
-
* table should be passed back to the user or not).
|
|
40
|
-
*/
|
|
41
|
-
enum CheckEnableRlsResult
|
|
42
|
-
{
|
|
43
|
-
RLS_NONE,
|
|
44
|
-
RLS_NONE_ENV,
|
|
45
|
-
RLS_ENABLED
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
extern int check_enable_rls(Oid relid, Oid checkAsUser, bool noError);
|
|
49
|
-
|
|
50
|
-
#endif /* RLS_H */
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/*-------------------------------------------------------------------------
|
|
2
|
-
*
|
|
3
|
-
* tzparser.h
|
|
4
|
-
* Timezone offset file parsing definitions.
|
|
5
|
-
*
|
|
6
|
-
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
7
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
|
8
|
-
*
|
|
9
|
-
* src/include/utils/tzparser.h
|
|
10
|
-
*
|
|
11
|
-
*-------------------------------------------------------------------------
|
|
12
|
-
*/
|
|
13
|
-
#ifndef TZPARSER_H
|
|
14
|
-
#define TZPARSER_H
|
|
15
|
-
|
|
16
|
-
#include "utils/datetime.h"
|
|
17
|
-
|
|
18
|
-
/*
|
|
19
|
-
* The result of parsing a timezone configuration file is an array of
|
|
20
|
-
* these structs, in order by abbrev. We export this because datetime.c
|
|
21
|
-
* needs it.
|
|
22
|
-
*/
|
|
23
|
-
typedef struct tzEntry
|
|
24
|
-
{
|
|
25
|
-
/* the actual data */
|
|
26
|
-
char *abbrev; /* TZ abbreviation (downcased) */
|
|
27
|
-
char *zone; /* zone name if dynamic abbrev, else NULL */
|
|
28
|
-
/* for a dynamic abbreviation, offset/is_dst are not used */
|
|
29
|
-
int offset; /* offset in seconds from UTC */
|
|
30
|
-
bool is_dst; /* true if a DST abbreviation */
|
|
31
|
-
/* source information (for error messages) */
|
|
32
|
-
int lineno;
|
|
33
|
-
const char *filename;
|
|
34
|
-
} tzEntry;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
extern TimeZoneAbbrevTable *load_tzoffsets(const char *filename);
|
|
38
|
-
|
|
39
|
-
#endif /* TZPARSER_H */
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/*--------------------------------------------------------------------
|
|
2
|
-
* Symbols referenced in this file:
|
|
3
|
-
* - s_lock
|
|
4
|
-
* - perform_spin_delay
|
|
5
|
-
* - spins_per_delay
|
|
6
|
-
* - s_lock_stuck
|
|
7
|
-
* - finish_spin_delay
|
|
8
|
-
*--------------------------------------------------------------------
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/*-------------------------------------------------------------------------
|
|
12
|
-
*
|
|
13
|
-
* s_lock.c
|
|
14
|
-
* Hardware-dependent implementation of spinlocks.
|
|
15
|
-
*
|
|
16
|
-
* When waiting for a contended spinlock we loop tightly for awhile, then
|
|
17
|
-
* delay using pg_usleep() and try again. Preferably, "awhile" should be a
|
|
18
|
-
* small multiple of the maximum time we expect a spinlock to be held. 100
|
|
19
|
-
* iterations seems about right as an initial guess. However, on a
|
|
20
|
-
* uniprocessor the loop is a waste of cycles, while in a multi-CPU scenario
|
|
21
|
-
* it's usually better to spin a bit longer than to call the kernel, so we try
|
|
22
|
-
* to adapt the spin loop count depending on whether we seem to be in a
|
|
23
|
-
* uniprocessor or multiprocessor.
|
|
24
|
-
*
|
|
25
|
-
* Note: you might think MIN_SPINS_PER_DELAY should be just 1, but you'd
|
|
26
|
-
* be wrong; there are platforms where that can result in a "stuck
|
|
27
|
-
* spinlock" failure. This has been seen particularly on Alphas; it seems
|
|
28
|
-
* that the first TAS after returning from kernel space will always fail
|
|
29
|
-
* on that hardware.
|
|
30
|
-
*
|
|
31
|
-
* Once we do decide to block, we use randomly increasing pg_usleep()
|
|
32
|
-
* delays. The first delay is 1 msec, then the delay randomly increases to
|
|
33
|
-
* about one second, after which we reset to 1 msec and start again. The
|
|
34
|
-
* idea here is that in the presence of heavy contention we need to
|
|
35
|
-
* increase the delay, else the spinlock holder may never get to run and
|
|
36
|
-
* release the lock. (Consider situation where spinlock holder has been
|
|
37
|
-
* nice'd down in priority by the scheduler --- it will not get scheduled
|
|
38
|
-
* until all would-be acquirers are sleeping, so if we always use a 1-msec
|
|
39
|
-
* sleep, there is a real possibility of starvation.) But we can't just
|
|
40
|
-
* clamp the delay to an upper bound, else it would take a long time to
|
|
41
|
-
* make a reasonable number of tries.
|
|
42
|
-
*
|
|
43
|
-
* We time out and declare error after NUM_DELAYS delays (thus, exactly
|
|
44
|
-
* that many tries). With the given settings, this will usually take 2 or
|
|
45
|
-
* so minutes. It seems better to fix the total number of tries (and thus
|
|
46
|
-
* the probability of unintended failure) than to fix the total time
|
|
47
|
-
* spent.
|
|
48
|
-
*
|
|
49
|
-
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
50
|
-
* Portions Copyright (c) 1994, Regents of the University of California
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* IDENTIFICATION
|
|
54
|
-
* src/backend/storage/lmgr/s_lock.c
|
|
55
|
-
*
|
|
56
|
-
*-------------------------------------------------------------------------
|
|
57
|
-
*/
|
|
58
|
-
#include "postgres.h"
|
|
59
|
-
|
|
60
|
-
#include <time.h>
|
|
61
|
-
#include <unistd.h>
|
|
62
|
-
|
|
63
|
-
#include "common/pg_prng.h"
|
|
64
|
-
#include "port/atomics.h"
|
|
65
|
-
#include "storage/s_lock.h"
|
|
66
|
-
|
|
67
|
-
#define MIN_SPINS_PER_DELAY 10
|
|
68
|
-
#define MAX_SPINS_PER_DELAY 1000
|
|
69
|
-
#define NUM_DELAYS 1000
|
|
70
|
-
#define MIN_DELAY_USEC 1000L
|
|
71
|
-
#define MAX_DELAY_USEC 1000000L
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
static __thread int spins_per_delay = DEFAULT_SPINS_PER_DELAY;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
/*
|
|
81
|
-
* s_lock_stuck() - complain about a stuck spinlock
|
|
82
|
-
*/
|
|
83
|
-
static void
|
|
84
|
-
s_lock_stuck(const char *file, int line, const char *func)
|
|
85
|
-
{
|
|
86
|
-
if (!func)
|
|
87
|
-
func = "(unknown)";
|
|
88
|
-
#if defined(S_LOCK_TEST)
|
|
89
|
-
fprintf(stderr,
|
|
90
|
-
"\nStuck spinlock detected at %s, %s:%d.\n",
|
|
91
|
-
func, file, line);
|
|
92
|
-
exit(1);
|
|
93
|
-
#else
|
|
94
|
-
elog(PANIC, "stuck spinlock detected at %s, %s:%d",
|
|
95
|
-
func, file, line);
|
|
96
|
-
#endif
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/*
|
|
100
|
-
* s_lock(lock) - platform-independent portion of waiting for a spinlock.
|
|
101
|
-
*/
|
|
102
|
-
int
|
|
103
|
-
s_lock(volatile slock_t *lock, const char *file, int line, const char *func)
|
|
104
|
-
{
|
|
105
|
-
SpinDelayStatus delayStatus;
|
|
106
|
-
|
|
107
|
-
init_spin_delay(&delayStatus, file, line, func);
|
|
108
|
-
|
|
109
|
-
while (TAS_SPIN(lock))
|
|
110
|
-
{
|
|
111
|
-
perform_spin_delay(&delayStatus);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
finish_spin_delay(&delayStatus);
|
|
115
|
-
|
|
116
|
-
return delayStatus.delays;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
#ifdef USE_DEFAULT_S_UNLOCK
|
|
120
|
-
void
|
|
121
|
-
s_unlock(volatile slock_t *lock)
|
|
122
|
-
{
|
|
123
|
-
#ifdef TAS_ACTIVE_WORD
|
|
124
|
-
/* HP's PA-RISC */
|
|
125
|
-
*TAS_ACTIVE_WORD(lock) = -1;
|
|
126
|
-
#else
|
|
127
|
-
*lock = 0;
|
|
128
|
-
#endif
|
|
129
|
-
}
|
|
130
|
-
#endif
|
|
131
|
-
|
|
132
|
-
/*
|
|
133
|
-
* Wait while spinning on a contended spinlock.
|
|
134
|
-
*/
|
|
135
|
-
void
|
|
136
|
-
perform_spin_delay(SpinDelayStatus *status)
|
|
137
|
-
{
|
|
138
|
-
/* CPU-specific delay each time through the loop */
|
|
139
|
-
SPIN_DELAY();
|
|
140
|
-
|
|
141
|
-
/* Block the process every spins_per_delay tries */
|
|
142
|
-
if (++(status->spins) >= spins_per_delay)
|
|
143
|
-
{
|
|
144
|
-
if (++(status->delays) > NUM_DELAYS)
|
|
145
|
-
s_lock_stuck(status->file, status->line, status->func);
|
|
146
|
-
|
|
147
|
-
if (status->cur_delay == 0) /* first time to delay? */
|
|
148
|
-
status->cur_delay = MIN_DELAY_USEC;
|
|
149
|
-
|
|
150
|
-
pg_usleep(status->cur_delay);
|
|
151
|
-
|
|
152
|
-
#if defined(S_LOCK_TEST)
|
|
153
|
-
fprintf(stdout, "*");
|
|
154
|
-
fflush(stdout);
|
|
155
|
-
#endif
|
|
156
|
-
|
|
157
|
-
/* increase delay by a random fraction between 1X and 2X */
|
|
158
|
-
status->cur_delay += (int) (status->cur_delay *
|
|
159
|
-
pg_prng_double(&pg_global_prng_state) + 0.5);
|
|
160
|
-
/* wrap back to minimum delay when max is exceeded */
|
|
161
|
-
if (status->cur_delay > MAX_DELAY_USEC)
|
|
162
|
-
status->cur_delay = MIN_DELAY_USEC;
|
|
163
|
-
|
|
164
|
-
status->spins = 0;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/*
|
|
169
|
-
* After acquiring a spinlock, update estimates about how long to loop.
|
|
170
|
-
*
|
|
171
|
-
* If we were able to acquire the lock without delaying, it's a good
|
|
172
|
-
* indication we are in a multiprocessor. If we had to delay, it's a sign
|
|
173
|
-
* (but not a sure thing) that we are in a uniprocessor. Hence, we
|
|
174
|
-
* decrement spins_per_delay slowly when we had to delay, and increase it
|
|
175
|
-
* rapidly when we didn't. It's expected that spins_per_delay will
|
|
176
|
-
* converge to the minimum value on a uniprocessor and to the maximum
|
|
177
|
-
* value on a multiprocessor.
|
|
178
|
-
*
|
|
179
|
-
* Note: spins_per_delay is local within our current process. We want to
|
|
180
|
-
* average these observations across multiple backends, since it's
|
|
181
|
-
* relatively rare for this function to even get entered, and so a single
|
|
182
|
-
* backend might not live long enough to converge on a good value. That
|
|
183
|
-
* is handled by the two routines below.
|
|
184
|
-
*/
|
|
185
|
-
void
|
|
186
|
-
finish_spin_delay(SpinDelayStatus *status)
|
|
187
|
-
{
|
|
188
|
-
if (status->cur_delay == 0)
|
|
189
|
-
{
|
|
190
|
-
/* we never had to delay */
|
|
191
|
-
if (spins_per_delay < MAX_SPINS_PER_DELAY)
|
|
192
|
-
spins_per_delay = Min(spins_per_delay + 100, MAX_SPINS_PER_DELAY);
|
|
193
|
-
}
|
|
194
|
-
else
|
|
195
|
-
{
|
|
196
|
-
if (spins_per_delay > MIN_SPINS_PER_DELAY)
|
|
197
|
-
spins_per_delay = Max(spins_per_delay - 1, MIN_SPINS_PER_DELAY);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/*
|
|
202
|
-
* Set local copy of spins_per_delay during backend startup.
|
|
203
|
-
*
|
|
204
|
-
* NB: this has to be pretty fast as it is called while holding a spinlock
|
|
205
|
-
*/
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
/*
|
|
209
|
-
* Update shared estimate of spins_per_delay during backend exit.
|
|
210
|
-
*
|
|
211
|
-
* NB: this has to be pretty fast as it is called while holding a spinlock
|
|
212
|
-
*/
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
/*
|
|
217
|
-
* Various TAS implementations that cannot live in s_lock.h as no inline
|
|
218
|
-
* definition exists (yet).
|
|
219
|
-
* In the future, get rid of tas.[cso] and fold it into this file.
|
|
220
|
-
*
|
|
221
|
-
* If you change something here, you will likely need to modify s_lock.h too,
|
|
222
|
-
* because the definitions for these are split between this file and s_lock.h.
|
|
223
|
-
*/
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
#ifdef HAVE_SPINLOCKS /* skip spinlocks if requested */
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
#if defined(__GNUC__)
|
|
230
|
-
|
|
231
|
-
/*
|
|
232
|
-
* All the gcc flavors that are not inlined
|
|
233
|
-
*/
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
/*
|
|
237
|
-
* Note: all the if-tests here probably ought to be testing gcc version
|
|
238
|
-
* rather than platform, but I don't have adequate info to know what to
|
|
239
|
-
* write. Ideally we'd flush all this in favor of the inline version.
|
|
240
|
-
*/
|
|
241
|
-
#if defined(__m68k__) && !defined(__linux__)
|
|
242
|
-
/* really means: extern int tas(slock_t* **lock); */
|
|
243
|
-
static void
|
|
244
|
-
tas_dummy()
|
|
245
|
-
{
|
|
246
|
-
__asm__ __volatile__(
|
|
247
|
-
#if (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(__ELF__)
|
|
248
|
-
/* no underscore for label and % for registers */
|
|
249
|
-
"\
|
|
250
|
-
.global tas \n\
|
|
251
|
-
tas: \n\
|
|
252
|
-
movel %sp@(0x4),%a0 \n\
|
|
253
|
-
tas %a0@ \n\
|
|
254
|
-
beq _success \n\
|
|
255
|
-
moveq #-128,%d0 \n\
|
|
256
|
-
rts \n\
|
|
257
|
-
_success: \n\
|
|
258
|
-
moveq #0,%d0 \n\
|
|
259
|
-
rts \n"
|
|
260
|
-
#else
|
|
261
|
-
"\
|
|
262
|
-
.global _tas \n\
|
|
263
|
-
_tas: \n\
|
|
264
|
-
movel sp@(0x4),a0 \n\
|
|
265
|
-
tas a0@ \n\
|
|
266
|
-
beq _success \n\
|
|
267
|
-
moveq #-128,d0 \n\
|
|
268
|
-
rts \n\
|
|
269
|
-
_success: \n\
|
|
270
|
-
moveq #0,d0 \n\
|
|
271
|
-
rts \n"
|
|
272
|
-
#endif /* (__NetBSD__ || __OpenBSD__) && __ELF__ */
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
|
-
#endif /* __m68k__ && !__linux__ */
|
|
276
|
-
#endif /* not __GNUC__ */
|
|
277
|
-
#endif /* HAVE_SPINLOCKS */
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
/*****************************************************************************/
|
|
282
|
-
#if defined(S_LOCK_TEST)
|
|
283
|
-
|
|
284
|
-
/*
|
|
285
|
-
* test program for verifying a port's spinlock support.
|
|
286
|
-
*/
|
|
287
|
-
|
|
288
|
-
struct test_lock_struct
|
|
289
|
-
{
|
|
290
|
-
char pad1;
|
|
291
|
-
slock_t lock;
|
|
292
|
-
char pad2;
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
volatile struct test_lock_struct test_lock;
|
|
296
|
-
|
|
297
|
-
int
|
|
298
|
-
main()
|
|
299
|
-
{
|
|
300
|
-
pg_prng_seed(&pg_global_prng_state, (uint64) time(NULL));
|
|
301
|
-
|
|
302
|
-
test_lock.pad1 = test_lock.pad2 = 0x44;
|
|
303
|
-
|
|
304
|
-
S_INIT_LOCK(&test_lock.lock);
|
|
305
|
-
|
|
306
|
-
if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
|
|
307
|
-
{
|
|
308
|
-
printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
|
|
309
|
-
return 1;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
if (!S_LOCK_FREE(&test_lock.lock))
|
|
313
|
-
{
|
|
314
|
-
printf("S_LOCK_TEST: failed, lock not initialized\n");
|
|
315
|
-
return 1;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
S_LOCK(&test_lock.lock);
|
|
319
|
-
|
|
320
|
-
if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
|
|
321
|
-
{
|
|
322
|
-
printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
|
|
323
|
-
return 1;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (S_LOCK_FREE(&test_lock.lock))
|
|
327
|
-
{
|
|
328
|
-
printf("S_LOCK_TEST: failed, lock not locked\n");
|
|
329
|
-
return 1;
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
S_UNLOCK(&test_lock.lock);
|
|
333
|
-
|
|
334
|
-
if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
|
|
335
|
-
{
|
|
336
|
-
printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
|
|
337
|
-
return 1;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (!S_LOCK_FREE(&test_lock.lock))
|
|
341
|
-
{
|
|
342
|
-
printf("S_LOCK_TEST: failed, lock not unlocked\n");
|
|
343
|
-
return 1;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
S_LOCK(&test_lock.lock);
|
|
347
|
-
|
|
348
|
-
if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
|
|
349
|
-
{
|
|
350
|
-
printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
|
|
351
|
-
return 1;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
if (S_LOCK_FREE(&test_lock.lock))
|
|
355
|
-
{
|
|
356
|
-
printf("S_LOCK_TEST: failed, lock not re-locked\n");
|
|
357
|
-
return 1;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
printf("S_LOCK_TEST: this will print %d stars and then\n", NUM_DELAYS);
|
|
361
|
-
printf(" exit with a 'stuck spinlock' message\n");
|
|
362
|
-
printf(" if S_LOCK() and TAS() are working.\n");
|
|
363
|
-
fflush(stdout);
|
|
364
|
-
|
|
365
|
-
s_lock(&test_lock.lock, __FILE__, __LINE__, PG_FUNCNAME_MACRO);
|
|
366
|
-
|
|
367
|
-
printf("S_LOCK_TEST: failed, lock not locked\n");
|
|
368
|
-
return 1;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
#endif /* S_LOCK_TEST */
|