pg_query 2.1.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +104 -0
- data/README.md +59 -31
- data/Rakefile +2 -2
- data/ext/pg_query/extconf.rb +8 -2
- data/ext/pg_query/include/access/amapi.h +45 -1
- data/ext/pg_query/include/access/attmap.h +1 -1
- data/ext/pg_query/include/access/attnum.h +2 -2
- data/ext/pg_query/include/access/clog.h +4 -2
- data/ext/pg_query/include/access/commit_ts.h +6 -9
- data/ext/pg_query/include/access/detoast.h +1 -11
- data/ext/pg_query/include/access/genam.h +15 -12
- data/ext/pg_query/include/access/gin.h +2 -2
- data/ext/pg_query/include/access/htup.h +1 -1
- data/ext/pg_query/include/access/htup_details.h +75 -87
- data/ext/pg_query/include/access/itup.h +7 -1
- data/ext/pg_query/include/access/parallel.h +2 -2
- data/ext/pg_query/include/access/printtup.h +1 -1
- data/ext/pg_query/include/access/relation.h +1 -1
- data/ext/pg_query/include/access/relscan.h +17 -2
- data/ext/pg_query/include/access/rmgr.h +30 -3
- data/ext/pg_query/include/access/rmgrlist.h +23 -23
- data/ext/pg_query/include/access/sdir.h +1 -1
- data/ext/pg_query/include/access/skey.h +1 -1
- data/ext/pg_query/include/access/stratnum.h +4 -2
- data/ext/pg_query/include/access/sysattr.h +1 -1
- data/ext/pg_query/include/access/table.h +2 -1
- data/ext/pg_query/include/access/tableam.h +272 -20
- data/ext/pg_query/include/access/toast_compression.h +73 -0
- data/ext/pg_query/include/access/transam.h +123 -13
- data/ext/pg_query/include/access/tupconvert.h +1 -1
- data/ext/pg_query/include/access/tupdesc.h +1 -1
- data/ext/pg_query/include/access/tupmacs.h +3 -3
- data/ext/pg_query/include/access/twophase.h +5 -1
- data/ext/pg_query/include/access/xact.h +79 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +50 -14
- data/ext/pg_query/include/access/xlogdefs.h +8 -16
- data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/access/xlogreader.h +148 -32
- data/ext/pg_query/include/access/xlogrecord.h +18 -9
- data/ext/pg_query/include/access/xlogrecovery.h +157 -0
- data/ext/pg_query/include/c.h +101 -44
- data/ext/pg_query/include/catalog/catalog.h +3 -1
- data/ext/pg_query/include/catalog/catversion.h +2 -2
- data/ext/pg_query/include/catalog/dependency.h +10 -16
- data/ext/pg_query/include/catalog/genbki.h +83 -5
- data/ext/pg_query/include/catalog/index.h +18 -3
- data/ext/pg_query/include/catalog/indexing.h +12 -324
- data/ext/pg_query/include/catalog/namespace.h +4 -2
- data/ext/pg_query/include/catalog/objectaccess.h +70 -2
- data/ext/pg_query/include/catalog/objectaddress.h +11 -6
- data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_am.h +4 -1
- data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
- data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
- data/ext/pg_query/include/catalog/pg_authid.h +7 -2
- data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
- data/ext/pg_query/include/catalog/pg_class.h +45 -15
- data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
- data/ext/pg_query/include/catalog/pg_collation.h +33 -8
- data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
- data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
- data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/catalog/pg_control.h +5 -5
- data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
- data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_depend.h +11 -7
- data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_index.h +17 -7
- data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
- data/ext/pg_query/include/catalog/pg_language.h +10 -5
- data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
- data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
- data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_operator.h +21 -16
- data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
- data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_proc.h +20 -11
- data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
- data/ext/pg_query/include/catalog/pg_publication.h +50 -4
- data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
- data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/catalog/pg_transform.h +8 -5
- data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
- data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_type.h +56 -24
- data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
- data/ext/pg_query/include/catalog/storage.h +5 -3
- data/ext/pg_query/include/commands/async.h +4 -5
- data/ext/pg_query/include/commands/dbcommands.h +2 -1
- data/ext/pg_query/include/commands/defrem.h +11 -24
- data/ext/pg_query/include/commands/event_trigger.h +2 -2
- data/ext/pg_query/include/commands/explain.h +1 -1
- data/ext/pg_query/include/commands/prepare.h +1 -1
- data/ext/pg_query/include/commands/tablespace.h +3 -1
- data/ext/pg_query/include/commands/trigger.h +27 -17
- data/ext/pg_query/include/commands/user.h +2 -2
- data/ext/pg_query/include/commands/vacuum.h +88 -41
- data/ext/pg_query/include/commands/variable.h +1 -1
- data/ext/pg_query/include/common/file_perm.h +4 -4
- data/ext/pg_query/include/common/hashfn.h +1 -1
- data/ext/pg_query/include/common/ip.h +1 -7
- data/ext/pg_query/include/common/keywords.h +2 -6
- data/ext/pg_query/include/common/kwlookup.h +1 -1
- data/ext/pg_query/include/common/pg_prng.h +60 -0
- data/ext/pg_query/include/common/relpath.h +2 -2
- data/ext/pg_query/include/common/string.h +24 -1
- data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
- data/ext/pg_query/include/datatype/timestamp.h +40 -1
- data/ext/pg_query/include/executor/execdesc.h +1 -1
- data/ext/pg_query/include/executor/executor.h +65 -22
- data/ext/pg_query/include/executor/functions.h +17 -3
- data/ext/pg_query/include/executor/instrument.h +33 -16
- data/ext/pg_query/include/executor/spi.h +41 -3
- data/ext/pg_query/include/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/executor/tuptable.h +1 -1
- data/ext/pg_query/include/fmgr.h +13 -7
- data/ext/pg_query/include/funcapi.h +16 -4
- data/ext/pg_query/include/getaddrinfo.h +1 -1
- data/ext/pg_query/include/jit/jit.h +11 -11
- data/ext/pg_query/include/kwlist_d.h +517 -494
- data/ext/pg_query/include/lib/dshash.h +112 -0
- data/ext/pg_query/include/lib/ilist.h +20 -1
- data/ext/pg_query/include/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/lib/simplehash.h +150 -25
- data/ext/pg_query/include/lib/sort_template.h +432 -0
- data/ext/pg_query/include/lib/stringinfo.h +1 -1
- data/ext/pg_query/include/libpq/auth.h +6 -4
- data/ext/pg_query/include/libpq/crypt.h +5 -4
- data/ext/pg_query/include/libpq/hba.h +43 -4
- data/ext/pg_query/include/libpq/libpq-be.h +23 -6
- data/ext/pg_query/include/libpq/libpq.h +31 -20
- data/ext/pg_query/include/libpq/pqcomm.h +17 -31
- data/ext/pg_query/include/libpq/pqformat.h +1 -1
- data/ext/pg_query/include/libpq/pqsignal.h +4 -4
- data/ext/pg_query/include/mb/pg_wchar.h +106 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +71 -52
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +272 -80
- data/ext/pg_query/include/nodes/extensible.h +4 -2
- data/ext/pg_query/include/nodes/lockoptions.h +1 -1
- data/ext/pg_query/include/nodes/makefuncs.h +7 -6
- data/ext/pg_query/include/nodes/memnodes.h +5 -3
- data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/nodes/nodes.h +30 -11
- data/ext/pg_query/include/nodes/params.h +1 -1
- data/ext/pg_query/include/nodes/parsenodes.h +327 -94
- data/ext/pg_query/include/nodes/pathnodes.h +245 -67
- data/ext/pg_query/include/nodes/pg_list.h +75 -68
- data/ext/pg_query/include/nodes/plannodes.h +128 -30
- data/ext/pg_query/include/nodes/primnodes.h +99 -47
- data/ext/pg_query/include/nodes/print.h +1 -1
- data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/nodes/value.h +58 -39
- data/ext/pg_query/include/optimizer/cost.h +9 -2
- data/ext/pg_query/include/optimizer/geqo.h +9 -7
- data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/optimizer/optimizer.h +25 -22
- data/ext/pg_query/include/optimizer/paths.h +6 -6
- data/ext/pg_query/include/optimizer/planmain.h +15 -14
- data/ext/pg_query/include/parser/analyze.h +19 -5
- data/ext/pg_query/include/parser/gram.h +947 -913
- data/ext/pg_query/include/parser/gramparse.h +1 -1
- data/ext/pg_query/include/parser/kwlist.h +463 -453
- data/ext/pg_query/include/parser/parse_agg.h +2 -7
- data/ext/pg_query/include/parser/parse_coerce.h +4 -1
- data/ext/pg_query/include/parser/parse_expr.h +2 -3
- data/ext/pg_query/include/parser/parse_func.h +2 -1
- data/ext/pg_query/include/parser/parse_node.h +21 -9
- data/ext/pg_query/include/parser/parse_oper.h +1 -3
- data/ext/pg_query/include/parser/parse_relation.h +5 -4
- data/ext/pg_query/include/parser/parse_type.h +1 -1
- data/ext/pg_query/include/parser/parser.h +31 -4
- data/ext/pg_query/include/parser/parsetree.h +1 -1
- data/ext/pg_query/include/parser/scanner.h +1 -1
- data/ext/pg_query/include/parser/scansup.h +2 -5
- data/ext/pg_query/include/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/pg_config.h +94 -46
- data/ext/pg_query/include/pg_config_manual.h +74 -21
- data/ext/pg_query/include/pg_getopt.h +6 -6
- data/ext/pg_query/include/pg_query.h +5 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1237
- data/ext/pg_query/include/pgtime.h +14 -4
- data/ext/pg_query/include/pl_gram.h +126 -128
- data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/include/plerrcodes.h +9 -1
- data/ext/pg_query/include/plpgsql.h +52 -54
- data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
- data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
- data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
- data/ext/pg_query/include/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
- data/ext/pg_query/include/port/atomics/generic.h +1 -1
- data/ext/pg_query/include/port/atomics.h +1 -1
- data/ext/pg_query/include/port/pg_bitutils.h +88 -12
- data/ext/pg_query/include/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/port/pg_crc32c.h +1 -1
- data/ext/pg_query/include/port.h +72 -43
- data/ext/pg_query/include/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres.h +60 -16
- data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
- data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
- data/ext/pg_query/include/postmaster/bgworker.h +2 -1
- data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
- data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
- data/ext/pg_query/include/postmaster/fork_process.h +1 -1
- data/ext/pg_query/include/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postmaster/pgarch.h +42 -8
- data/ext/pg_query/include/postmaster/postmaster.h +18 -17
- data/ext/pg_query/include/postmaster/startup.h +39 -0
- data/ext/pg_query/include/postmaster/syslogger.h +15 -10
- data/ext/pg_query/include/postmaster/walwriter.h +3 -3
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
- data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
- data/ext/pg_query/include/regex/regex.h +18 -16
- data/ext/pg_query/include/replication/logicallauncher.h +3 -5
- data/ext/pg_query/include/replication/logicalproto.h +161 -17
- data/ext/pg_query/include/replication/logicalworker.h +1 -1
- data/ext/pg_query/include/replication/origin.h +7 -7
- data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
- data/ext/pg_query/include/replication/slot.h +23 -12
- data/ext/pg_query/include/replication/syncrep.h +5 -5
- data/ext/pg_query/include/replication/walreceiver.h +145 -13
- data/ext/pg_query/include/replication/walsender.h +8 -8
- data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
- data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/storage/backendid.h +3 -3
- data/ext/pg_query/include/storage/block.h +4 -10
- data/ext/pg_query/include/storage/buf.h +1 -1
- data/ext/pg_query/include/storage/bufmgr.h +19 -14
- data/ext/pg_query/include/storage/bufpage.h +6 -8
- data/ext/pg_query/include/storage/condition_variable.h +13 -2
- data/ext/pg_query/include/storage/dsm.h +4 -1
- data/ext/pg_query/include/storage/dsm_impl.h +3 -2
- data/ext/pg_query/include/storage/fd.h +33 -3
- data/ext/pg_query/include/storage/fileset.h +40 -0
- data/ext/pg_query/include/storage/ipc.h +4 -1
- data/ext/pg_query/include/storage/item.h +1 -1
- data/ext/pg_query/include/storage/itemid.h +1 -1
- data/ext/pg_query/include/storage/itemptr.h +3 -1
- data/ext/pg_query/include/storage/large_object.h +2 -2
- data/ext/pg_query/include/storage/latch.h +9 -13
- data/ext/pg_query/include/storage/lmgr.h +2 -1
- data/ext/pg_query/include/storage/lock.h +17 -13
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +6 -32
- data/ext/pg_query/include/storage/lwlocknames.h +0 -1
- data/ext/pg_query/include/storage/off.h +1 -1
- data/ext/pg_query/include/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/storage/pg_shmem.h +9 -7
- data/ext/pg_query/include/storage/pmsignal.h +15 -4
- data/ext/pg_query/include/storage/predicate.h +4 -4
- data/ext/pg_query/include/storage/proc.h +183 -55
- data/ext/pg_query/include/storage/procarray.h +98 -0
- data/ext/pg_query/include/storage/proclist_types.h +1 -1
- data/ext/pg_query/include/storage/procsignal.h +3 -7
- data/ext/pg_query/include/storage/relfilenode.h +1 -1
- data/ext/pg_query/include/storage/s_lock.h +67 -4
- data/ext/pg_query/include/storage/sharedfileset.h +3 -11
- data/ext/pg_query/include/storage/shm_mq.h +5 -4
- data/ext/pg_query/include/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/storage/shmem.h +1 -1
- data/ext/pg_query/include/storage/sinval.h +3 -3
- data/ext/pg_query/include/storage/sinvaladt.h +1 -1
- data/ext/pg_query/include/storage/smgr.h +10 -8
- data/ext/pg_query/include/storage/spin.h +2 -2
- data/ext/pg_query/include/storage/standby.h +13 -6
- data/ext/pg_query/include/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/storage/sync.h +7 -3
- data/ext/pg_query/include/tcop/cmdtag.h +1 -1
- data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
- data/ext/pg_query/include/tcop/dest.h +1 -1
- data/ext/pg_query/include/tcop/fastpath.h +1 -2
- data/ext/pg_query/include/tcop/pquery.h +7 -1
- data/ext/pg_query/include/tcop/tcopprot.h +19 -11
- data/ext/pg_query/include/tcop/utility.h +7 -3
- data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
- data/ext/pg_query/include/utils/acl.h +24 -3
- data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/utils/array.h +7 -2
- data/ext/pg_query/include/utils/backend_progress.h +44 -0
- data/ext/pg_query/include/utils/backend_status.h +321 -0
- data/ext/pg_query/include/utils/builtins.h +11 -11
- data/ext/pg_query/include/utils/bytea.h +3 -2
- data/ext/pg_query/include/utils/catcache.h +1 -1
- data/ext/pg_query/include/utils/date.h +1 -1
- data/ext/pg_query/include/utils/datetime.h +8 -7
- data/ext/pg_query/include/utils/datum.h +9 -1
- data/ext/pg_query/include/utils/dsa.h +1 -1
- data/ext/pg_query/include/utils/dynahash.h +4 -3
- data/ext/pg_query/include/utils/elog.h +52 -21
- data/ext/pg_query/include/utils/errcodes.h +2 -0
- data/ext/pg_query/include/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/utils/float.h +7 -7
- data/ext/pg_query/include/utils/fmgroids.h +1300 -696
- data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
- data/ext/pg_query/include/utils/fmgrtab.h +6 -5
- data/ext/pg_query/include/utils/guc.h +69 -43
- data/ext/pg_query/include/utils/guc_tables.h +23 -19
- data/ext/pg_query/include/utils/hsearch.h +15 -11
- data/ext/pg_query/include/utils/inval.h +5 -1
- data/ext/pg_query/include/utils/lsyscache.h +11 -1
- data/ext/pg_query/include/utils/memdebug.h +1 -1
- data/ext/pg_query/include/utils/memutils.h +8 -3
- data/ext/pg_query/include/utils/numeric.h +19 -5
- data/ext/pg_query/include/utils/palloc.h +25 -3
- data/ext/pg_query/include/utils/partcache.h +1 -1
- data/ext/pg_query/include/utils/pg_locale.h +17 -9
- data/ext/pg_query/include/utils/pg_lsn.h +1 -1
- data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
- data/ext/pg_query/include/utils/pidfile.h +1 -1
- data/ext/pg_query/include/utils/plancache.h +6 -5
- data/ext/pg_query/include/utils/portal.h +12 -1
- data/ext/pg_query/include/utils/ps_status.h +1 -1
- data/ext/pg_query/include/utils/queryenvironment.h +1 -1
- data/ext/pg_query/include/utils/queryjumble.h +88 -0
- data/ext/pg_query/include/utils/regproc.h +14 -3
- data/ext/pg_query/include/utils/rel.h +71 -20
- data/ext/pg_query/include/utils/relcache.h +9 -7
- data/ext/pg_query/include/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/utils/resowner.h +1 -1
- data/ext/pg_query/include/utils/rls.h +2 -2
- data/ext/pg_query/include/utils/ruleutils.h +4 -1
- data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/utils/snapmgr.h +35 -14
- data/ext/pg_query/include/utils/snapshot.h +14 -1
- data/ext/pg_query/include/utils/sortsupport.h +117 -2
- data/ext/pg_query/include/utils/syscache.h +6 -1
- data/ext/pg_query/include/utils/timeout.h +11 -4
- data/ext/pg_query/include/utils/timestamp.h +6 -5
- data/ext/pg_query/include/utils/tuplesort.h +25 -11
- data/ext/pg_query/include/utils/tuplestore.h +2 -2
- data/ext/pg_query/include/utils/typcache.h +24 -17
- data/ext/pg_query/include/utils/tzparser.h +1 -1
- data/ext/pg_query/include/utils/varlena.h +5 -3
- data/ext/pg_query/include/utils/wait_event.h +289 -0
- data/ext/pg_query/include/utils/xml.h +4 -4
- data/ext/pg_query/pg_query.pb-c.c +4318 -2307
- data/ext/pg_query/pg_query_deparse.c +1114 -381
- data/ext/pg_query/pg_query_fingerprint.c +46 -10
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
- data/ext/pg_query/pg_query_normalize.c +163 -20
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
- data/ext/pg_query/pg_query_parse.c +1 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
- data/ext/pg_query/pg_query_ruby.c +1 -1
- data/ext/pg_query/pg_query_scan.c +2 -1
- data/ext/pg_query/pg_query_split.c +3 -2
- data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
- data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
- data/ext/pg_query/src_backend_commands_define.c +11 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +86 -11
- data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +644 -441
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
- data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
- data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
- data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
- data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
- data/ext/pg_query/src_common_encnames.c +1 -1
- data/ext/pg_query/src_common_hashfn.c +3 -3
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +517 -494
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_pg_prng.c +152 -0
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_string.c +7 -1
- data/ext/pg_query/src_common_stringinfo.c +1 -1
- data/ext/pg_query/src_common_wchar.c +712 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/src_port_pg_bitutils.c +41 -52
- data/ext/pg_query/src_port_pgsleep.c +1 -1
- data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +46 -20
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +6 -4
- data/lib/pg_query/fingerprint.rb +18 -3
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +87 -51
- data/lib/pg_query/pg_query_pb.rb +1109 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- metadata +29 -18
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_random.c +0 -31
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* per-process shared memory data structures
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/storage/proc.h
|
|
@@ -35,32 +35,44 @@
|
|
|
35
35
|
*/
|
|
36
36
|
#define PGPROC_MAX_CACHED_SUBXIDS 64 /* XXX guessed-at value */
|
|
37
37
|
|
|
38
|
+
typedef struct XidCacheStatus
|
|
39
|
+
{
|
|
40
|
+
/* number of cached subxids, never more than PGPROC_MAX_CACHED_SUBXIDS */
|
|
41
|
+
uint8 count;
|
|
42
|
+
/* has PGPROC->subxids overflowed */
|
|
43
|
+
bool overflowed;
|
|
44
|
+
} XidCacheStatus;
|
|
45
|
+
|
|
38
46
|
struct XidCache
|
|
39
47
|
{
|
|
40
48
|
TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];
|
|
41
49
|
};
|
|
42
50
|
|
|
43
51
|
/*
|
|
44
|
-
* Flags for
|
|
45
|
-
*
|
|
46
|
-
* Note: If you modify these flags, you need to modify PROCARRAY_XXX flags
|
|
47
|
-
* in src/include/storage/procarray.h.
|
|
48
|
-
*
|
|
49
|
-
* PROC_RESERVED may later be assigned for use in vacuumFlags, but its value is
|
|
50
|
-
* used for PROCARRAY_SLOTS_XMIN in procarray.h, so GetOldestXmin won't be able
|
|
51
|
-
* to match and ignore processes with this flag set.
|
|
52
|
+
* Flags for PGPROC->statusFlags and PROC_HDR->statusFlags[]
|
|
52
53
|
*/
|
|
53
54
|
#define PROC_IS_AUTOVACUUM 0x01 /* is it an autovac worker? */
|
|
54
55
|
#define PROC_IN_VACUUM 0x02 /* currently running lazy vacuum */
|
|
55
|
-
#define
|
|
56
|
+
#define PROC_IN_SAFE_IC 0x04 /* currently running CREATE INDEX
|
|
57
|
+
* CONCURRENTLY or REINDEX
|
|
58
|
+
* CONCURRENTLY on non-expressional,
|
|
59
|
+
* non-partial index */
|
|
56
60
|
#define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */
|
|
57
61
|
#define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical
|
|
58
62
|
* decoding outside xact */
|
|
59
|
-
#define
|
|
63
|
+
#define PROC_AFFECTS_ALL_HORIZONS 0x20 /* this proc's xmin must be
|
|
64
|
+
* included in vacuum horizons
|
|
65
|
+
* in all databases */
|
|
60
66
|
|
|
61
67
|
/* flags reset at EOXact */
|
|
62
68
|
#define PROC_VACUUM_STATE_MASK \
|
|
63
|
-
(PROC_IN_VACUUM |
|
|
69
|
+
(PROC_IN_VACUUM | PROC_IN_SAFE_IC | PROC_VACUUM_FOR_WRAPAROUND)
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Xmin-related flags. Make sure any flags that affect how the process' Xmin
|
|
73
|
+
* value is interpreted by VACUUM are included here.
|
|
74
|
+
*/
|
|
75
|
+
#define PROC_XMIN_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC)
|
|
64
76
|
|
|
65
77
|
/*
|
|
66
78
|
* We allow a small number of "weak" relation locks (AccessShareLock,
|
|
@@ -76,6 +88,48 @@ struct XidCache
|
|
|
76
88
|
*/
|
|
77
89
|
#define INVALID_PGPROCNO PG_INT32_MAX
|
|
78
90
|
|
|
91
|
+
/*
|
|
92
|
+
* Flags for PGPROC.delayChkpt
|
|
93
|
+
*
|
|
94
|
+
* These flags can be used to delay the start or completion of a checkpoint
|
|
95
|
+
* for short periods. A flag is in effect if the corresponding bit is set in
|
|
96
|
+
* the PGPROC of any backend.
|
|
97
|
+
*
|
|
98
|
+
* For our purposes here, a checkpoint has three phases: (1) determine the
|
|
99
|
+
* location to which the redo pointer will be moved, (2) write all the
|
|
100
|
+
* data durably to disk, and (3) WAL-log the checkpoint.
|
|
101
|
+
*
|
|
102
|
+
* Setting DELAY_CHKPT_START prevents the system from moving from phase 1
|
|
103
|
+
* to phase 2. This is useful when we are performing a WAL-logged modification
|
|
104
|
+
* of data that will be flushed to disk in phase 2. By setting this flag
|
|
105
|
+
* before writing WAL and clearing it after we've both written WAL and
|
|
106
|
+
* performed the corresponding modification, we ensure that if the WAL record
|
|
107
|
+
* is inserted prior to the new redo point, the corresponding data changes will
|
|
108
|
+
* also be flushed to disk before the checkpoint can complete. (In the
|
|
109
|
+
* extremely common case where the data being modified is in shared buffers
|
|
110
|
+
* and we acquire an exclusive content lock on the relevant buffers before
|
|
111
|
+
* writing WAL, this mechanism is not needed, because phase 2 will block
|
|
112
|
+
* until we release the content lock and then flush the modified data to
|
|
113
|
+
* disk.)
|
|
114
|
+
*
|
|
115
|
+
* Setting DELAY_CHKPT_COMPLETE prevents the system from moving from phase 2
|
|
116
|
+
* to phase 3. This is useful if we are performing a WAL-logged operation that
|
|
117
|
+
* might invalidate buffers, such as relation truncation. In this case, we need
|
|
118
|
+
* to ensure that any buffers which were invalidated and thus not flushed by
|
|
119
|
+
* the checkpoint are actaully destroyed on disk. Replay can cope with a file
|
|
120
|
+
* or block that doesn't exist, but not with a block that has the wrong
|
|
121
|
+
* contents.
|
|
122
|
+
*/
|
|
123
|
+
#define DELAY_CHKPT_START (1<<0)
|
|
124
|
+
#define DELAY_CHKPT_COMPLETE (1<<1)
|
|
125
|
+
|
|
126
|
+
typedef enum
|
|
127
|
+
{
|
|
128
|
+
PROC_WAIT_STATUS_OK,
|
|
129
|
+
PROC_WAIT_STATUS_WAITING,
|
|
130
|
+
PROC_WAIT_STATUS_ERROR,
|
|
131
|
+
} ProcWaitStatus;
|
|
132
|
+
|
|
79
133
|
/*
|
|
80
134
|
* Each backend has a PGPROC struct in shared memory. There is also a list of
|
|
81
135
|
* currently-unused PGPROC structs that will be reallocated to new backends.
|
|
@@ -91,6 +145,22 @@ struct XidCache
|
|
|
91
145
|
* distinguished from a real one at need by the fact that it has pid == 0.
|
|
92
146
|
* The semaphore and lock-activity fields in a prepared-xact PGPROC are unused,
|
|
93
147
|
* but its myProcLocks[] lists are valid.
|
|
148
|
+
*
|
|
149
|
+
* We allow many fields of this struct to be accessed without locks, such as
|
|
150
|
+
* delayChkpt and isBackgroundWorker. However, keep in mind that writing
|
|
151
|
+
* mirrored ones (see below) requires holding ProcArrayLock or XidGenLock in
|
|
152
|
+
* at least shared mode, so that pgxactoff does not change concurrently.
|
|
153
|
+
*
|
|
154
|
+
* Mirrored fields:
|
|
155
|
+
*
|
|
156
|
+
* Some fields in PGPROC (see "mirrored in ..." comment) are mirrored into an
|
|
157
|
+
* element of more densely packed ProcGlobal arrays. These arrays are indexed
|
|
158
|
+
* by PGPROC->pgxactoff. Both copies need to be maintained coherently.
|
|
159
|
+
*
|
|
160
|
+
* NB: The pgxactoff indexed value can *never* be accessed without holding
|
|
161
|
+
* locks.
|
|
162
|
+
*
|
|
163
|
+
* See PROC_HDR for details.
|
|
94
164
|
*/
|
|
95
165
|
struct PGPROC
|
|
96
166
|
{
|
|
@@ -99,14 +169,28 @@ struct PGPROC
|
|
|
99
169
|
PGPROC **procgloballist; /* procglobal list that owns this PGPROC */
|
|
100
170
|
|
|
101
171
|
PGSemaphore sem; /* ONE semaphore to sleep on */
|
|
102
|
-
|
|
172
|
+
ProcWaitStatus waitStatus;
|
|
103
173
|
|
|
104
174
|
Latch procLatch; /* generic latch for process */
|
|
105
175
|
|
|
176
|
+
|
|
177
|
+
TransactionId xid; /* id of top-level transaction currently being
|
|
178
|
+
* executed by this proc, if running and XID
|
|
179
|
+
* is assigned; else InvalidTransactionId.
|
|
180
|
+
* mirrored in ProcGlobal->xids[pgxactoff] */
|
|
181
|
+
|
|
182
|
+
TransactionId xmin; /* minimal running XID as it was when we were
|
|
183
|
+
* starting our xact, excluding LAZY VACUUM:
|
|
184
|
+
* vacuum must not remove tuples deleted by
|
|
185
|
+
* xid >= xmin ! */
|
|
186
|
+
|
|
106
187
|
LocalTransactionId lxid; /* local id of top-level transaction currently
|
|
107
188
|
* being executed by this proc, if running;
|
|
108
189
|
* else InvalidLocalTransactionId */
|
|
109
190
|
int pid; /* Backend's process ID; 0 if prepared xact */
|
|
191
|
+
|
|
192
|
+
int pgxactoff; /* offset into various ProcGlobal->arrays with
|
|
193
|
+
* data mirrored from this PGPROC */
|
|
110
194
|
int pgprocno;
|
|
111
195
|
|
|
112
196
|
/* These fields are zero while a backend is still starting up: */
|
|
@@ -141,8 +225,14 @@ struct PGPROC
|
|
|
141
225
|
LOCKMODE waitLockMode; /* type of lock we're waiting for */
|
|
142
226
|
LOCKMASK heldLocks; /* bitmask for lock types already held on this
|
|
143
227
|
* lock object by this backend */
|
|
228
|
+
pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition
|
|
229
|
+
* started */
|
|
144
230
|
|
|
145
|
-
|
|
231
|
+
int delayChkptFlags; /* for DELAY_CHKPT_* flags */
|
|
232
|
+
|
|
233
|
+
uint8 statusFlags; /* this backend's status flags, see PROC_*
|
|
234
|
+
* above. mirrored in
|
|
235
|
+
* ProcGlobal->statusFlags[pgxactoff] */
|
|
146
236
|
|
|
147
237
|
/*
|
|
148
238
|
* Info to allow us to wait for synchronous replication, if needed.
|
|
@@ -161,6 +251,8 @@ struct PGPROC
|
|
|
161
251
|
*/
|
|
162
252
|
SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];
|
|
163
253
|
|
|
254
|
+
XidCacheStatus subxidStatus; /* mirrored with
|
|
255
|
+
* ProcGlobal->subxidStates[i] */
|
|
164
256
|
struct XidCache subxids; /* cache for subtransaction XIDs */
|
|
165
257
|
|
|
166
258
|
/* Support for group XID clearing. */
|
|
@@ -209,42 +301,81 @@ struct PGPROC
|
|
|
209
301
|
|
|
210
302
|
|
|
211
303
|
extern PGDLLIMPORT PGPROC *MyProc;
|
|
212
|
-
extern PGDLLIMPORT struct PGXACT *MyPgXact;
|
|
213
|
-
|
|
214
|
-
/*
|
|
215
|
-
* Prior to PostgreSQL 9.2, the fields below were stored as part of the
|
|
216
|
-
* PGPROC. However, benchmarking revealed that packing these particular
|
|
217
|
-
* members into a separate array as tightly as possible sped up GetSnapshotData
|
|
218
|
-
* considerably on systems with many CPU cores, by reducing the number of
|
|
219
|
-
* cache lines needing to be fetched. Thus, think very carefully before adding
|
|
220
|
-
* anything else here.
|
|
221
|
-
*/
|
|
222
|
-
typedef struct PGXACT
|
|
223
|
-
{
|
|
224
|
-
TransactionId xid; /* id of top-level transaction currently being
|
|
225
|
-
* executed by this proc, if running and XID
|
|
226
|
-
* is assigned; else InvalidTransactionId */
|
|
227
|
-
|
|
228
|
-
TransactionId xmin; /* minimal running XID as it was when we were
|
|
229
|
-
* starting our xact, excluding LAZY VACUUM:
|
|
230
|
-
* vacuum must not remove tuples deleted by
|
|
231
|
-
* xid >= xmin ! */
|
|
232
|
-
|
|
233
|
-
uint8 vacuumFlags; /* vacuum-related flags, see above */
|
|
234
|
-
bool overflowed;
|
|
235
|
-
|
|
236
|
-
uint8 nxids;
|
|
237
|
-
} PGXACT;
|
|
238
304
|
|
|
239
305
|
/*
|
|
240
306
|
* There is one ProcGlobal struct for the whole database cluster.
|
|
307
|
+
*
|
|
308
|
+
* Adding/Removing an entry into the procarray requires holding *both*
|
|
309
|
+
* ProcArrayLock and XidGenLock in exclusive mode (in that order). Both are
|
|
310
|
+
* needed because the dense arrays (see below) are accessed from
|
|
311
|
+
* GetNewTransactionId() and GetSnapshotData(), and we don't want to add
|
|
312
|
+
* further contention by both using the same lock. Adding/Removing a procarray
|
|
313
|
+
* entry is much less frequent.
|
|
314
|
+
*
|
|
315
|
+
* Some fields in PGPROC are mirrored into more densely packed arrays (e.g.
|
|
316
|
+
* xids), with one entry for each backend. These arrays only contain entries
|
|
317
|
+
* for PGPROCs that have been added to the shared array with ProcArrayAdd()
|
|
318
|
+
* (in contrast to PGPROC array which has unused PGPROCs interspersed).
|
|
319
|
+
*
|
|
320
|
+
* The dense arrays are indexed by PGPROC->pgxactoff. Any concurrent
|
|
321
|
+
* ProcArrayAdd() / ProcArrayRemove() can lead to pgxactoff of a procarray
|
|
322
|
+
* member to change. Therefore it is only safe to use PGPROC->pgxactoff to
|
|
323
|
+
* access the dense array while holding either ProcArrayLock or XidGenLock.
|
|
324
|
+
*
|
|
325
|
+
* As long as a PGPROC is in the procarray, the mirrored values need to be
|
|
326
|
+
* maintained in both places in a coherent manner.
|
|
327
|
+
*
|
|
328
|
+
* The denser separate arrays are beneficial for three main reasons: First, to
|
|
329
|
+
* allow for as tight loops accessing the data as possible. Second, to prevent
|
|
330
|
+
* updates of frequently changing data (e.g. xmin) from invalidating
|
|
331
|
+
* cachelines also containing less frequently changing data (e.g. xid,
|
|
332
|
+
* statusFlags). Third to condense frequently accessed data into as few
|
|
333
|
+
* cachelines as possible.
|
|
334
|
+
*
|
|
335
|
+
* There are two main reasons to have the data mirrored between these dense
|
|
336
|
+
* arrays and PGPROC. First, as explained above, a PGPROC's array entries can
|
|
337
|
+
* only be accessed with either ProcArrayLock or XidGenLock held, whereas the
|
|
338
|
+
* PGPROC entries do not require that (obviously there may still be locking
|
|
339
|
+
* requirements around the individual field, separate from the concerns
|
|
340
|
+
* here). That is particularly important for a backend to efficiently checks
|
|
341
|
+
* it own values, which it often can safely do without locking. Second, the
|
|
342
|
+
* PGPROC fields allow to avoid unnecessary accesses and modification to the
|
|
343
|
+
* dense arrays. A backend's own PGPROC is more likely to be in a local cache,
|
|
344
|
+
* whereas the cachelines for the dense array will be modified by other
|
|
345
|
+
* backends (often removing it from the cache for other cores/sockets). At
|
|
346
|
+
* commit/abort time a check of the PGPROC value can avoid accessing/dirtying
|
|
347
|
+
* the corresponding array value.
|
|
348
|
+
*
|
|
349
|
+
* Basically it makes sense to access the PGPROC variable when checking a
|
|
350
|
+
* single backend's data, especially when already looking at the PGPROC for
|
|
351
|
+
* other reasons already. It makes sense to look at the "dense" arrays if we
|
|
352
|
+
* need to look at many / most entries, because we then benefit from the
|
|
353
|
+
* reduced indirection and better cross-process cache-ability.
|
|
354
|
+
*
|
|
355
|
+
* When entering a PGPROC for 2PC transactions with ProcArrayAdd(), the data
|
|
356
|
+
* in the dense arrays is initialized from the PGPROC while it already holds
|
|
357
|
+
* ProcArrayLock.
|
|
241
358
|
*/
|
|
242
359
|
typedef struct PROC_HDR
|
|
243
360
|
{
|
|
244
361
|
/* Array of PGPROC structures (not including dummies for prepared txns) */
|
|
245
362
|
PGPROC *allProcs;
|
|
246
|
-
|
|
247
|
-
|
|
363
|
+
|
|
364
|
+
/* Array mirroring PGPROC.xid for each PGPROC currently in the procarray */
|
|
365
|
+
TransactionId *xids;
|
|
366
|
+
|
|
367
|
+
/*
|
|
368
|
+
* Array mirroring PGPROC.subxidStatus for each PGPROC currently in the
|
|
369
|
+
* procarray.
|
|
370
|
+
*/
|
|
371
|
+
XidCacheStatus *subxidStates;
|
|
372
|
+
|
|
373
|
+
/*
|
|
374
|
+
* Array mirroring PGPROC.statusFlags for each PGPROC currently in the
|
|
375
|
+
* procarray.
|
|
376
|
+
*/
|
|
377
|
+
uint8 *statusFlags;
|
|
378
|
+
|
|
248
379
|
/* Length of allProcs array */
|
|
249
380
|
uint32 allProcCount;
|
|
250
381
|
/* Head of list of free PGPROC structures */
|
|
@@ -265,16 +396,13 @@ typedef struct PROC_HDR
|
|
|
265
396
|
Latch *checkpointerLatch;
|
|
266
397
|
/* Current shared estimate of appropriate spins_per_delay value */
|
|
267
398
|
int spins_per_delay;
|
|
268
|
-
/* The proc of the Startup process, since not in ProcArray */
|
|
269
|
-
PGPROC *startupProc;
|
|
270
|
-
int startupProcPid;
|
|
271
399
|
/* Buffer id of the buffer that Startup process waits for pin on, or -1 */
|
|
272
400
|
int startupBufferPinWaitBufId;
|
|
273
401
|
} PROC_HDR;
|
|
274
402
|
|
|
275
403
|
extern PGDLLIMPORT PROC_HDR *ProcGlobal;
|
|
276
404
|
|
|
277
|
-
extern PGPROC *PreparedXactProcs;
|
|
405
|
+
extern PGDLLIMPORT PGPROC *PreparedXactProcs;
|
|
278
406
|
|
|
279
407
|
/* Accessor for PGPROC given a pgprocno. */
|
|
280
408
|
#define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)])
|
|
@@ -283,18 +411,19 @@ extern PGPROC *PreparedXactProcs;
|
|
|
283
411
|
* We set aside some extra PGPROC structures for auxiliary processes,
|
|
284
412
|
* ie things that aren't full-fledged backends but need shmem access.
|
|
285
413
|
*
|
|
286
|
-
* Background writer, checkpointer
|
|
287
|
-
* Startup process and WAL receiver also consume 2 slots, but WAL
|
|
288
|
-
* launched only after startup has exited, so we only need
|
|
414
|
+
* Background writer, checkpointer, WAL writer and archiver run during normal
|
|
415
|
+
* operation. Startup process and WAL receiver also consume 2 slots, but WAL
|
|
416
|
+
* writer is launched only after startup has exited, so we only need 5 slots.
|
|
289
417
|
*/
|
|
290
|
-
#define NUM_AUXILIARY_PROCS
|
|
418
|
+
#define NUM_AUXILIARY_PROCS 5
|
|
291
419
|
|
|
292
420
|
/* configurable options */
|
|
293
421
|
extern PGDLLIMPORT int DeadlockTimeout;
|
|
294
422
|
extern PGDLLIMPORT int StatementTimeout;
|
|
295
423
|
extern PGDLLIMPORT int LockTimeout;
|
|
296
424
|
extern PGDLLIMPORT int IdleInTransactionSessionTimeout;
|
|
297
|
-
extern
|
|
425
|
+
extern PGDLLIMPORT int IdleSessionTimeout;
|
|
426
|
+
extern PGDLLIMPORT bool log_lock_waits;
|
|
298
427
|
|
|
299
428
|
|
|
300
429
|
/*
|
|
@@ -307,7 +436,6 @@ extern void InitProcess(void);
|
|
|
307
436
|
extern void InitProcessPhase2(void);
|
|
308
437
|
extern void InitAuxiliaryProcess(void);
|
|
309
438
|
|
|
310
|
-
extern void PublishStartupProcessInformation(void);
|
|
311
439
|
extern void SetStartupBufferPinWaitBufId(int bufid);
|
|
312
440
|
extern int GetStartupBufferPinWaitBufId(void);
|
|
313
441
|
|
|
@@ -315,15 +443,15 @@ extern bool HaveNFreeProcs(int n);
|
|
|
315
443
|
extern void ProcReleaseLocks(bool isCommit);
|
|
316
444
|
|
|
317
445
|
extern void ProcQueueInit(PROC_QUEUE *queue);
|
|
318
|
-
extern
|
|
319
|
-
extern PGPROC *ProcWakeup(PGPROC *proc,
|
|
446
|
+
extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
|
|
447
|
+
extern PGPROC *ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus);
|
|
320
448
|
extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
|
|
321
449
|
extern void CheckDeadLockAlert(void);
|
|
322
450
|
extern bool IsWaitingForLock(void);
|
|
323
451
|
extern void LockErrorCleanup(void);
|
|
324
452
|
|
|
325
453
|
extern void ProcWaitForSignal(uint32 wait_event_info);
|
|
326
|
-
extern void ProcSendSignal(int
|
|
454
|
+
extern void ProcSendSignal(int pgprocno);
|
|
327
455
|
|
|
328
456
|
extern PGPROC *AuxiliaryPidGetProc(int pid);
|
|
329
457
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* procarray.h
|
|
4
|
+
* POSTGRES process array 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
|
+
* src/include/storage/procarray.h
|
|
11
|
+
*
|
|
12
|
+
*-------------------------------------------------------------------------
|
|
13
|
+
*/
|
|
14
|
+
#ifndef PROCARRAY_H
|
|
15
|
+
#define PROCARRAY_H
|
|
16
|
+
|
|
17
|
+
#include "storage/lock.h"
|
|
18
|
+
#include "storage/standby.h"
|
|
19
|
+
#include "utils/relcache.h"
|
|
20
|
+
#include "utils/snapshot.h"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
extern Size ProcArrayShmemSize(void);
|
|
24
|
+
extern void CreateSharedProcArray(void);
|
|
25
|
+
extern void ProcArrayAdd(PGPROC *proc);
|
|
26
|
+
extern void ProcArrayRemove(PGPROC *proc, TransactionId latestXid);
|
|
27
|
+
|
|
28
|
+
extern void ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid);
|
|
29
|
+
extern void ProcArrayClearTransaction(PGPROC *proc);
|
|
30
|
+
|
|
31
|
+
extern void ProcArrayInitRecovery(TransactionId initializedUptoXID);
|
|
32
|
+
extern void ProcArrayApplyRecoveryInfo(RunningTransactions running);
|
|
33
|
+
extern void ProcArrayApplyXidAssignment(TransactionId topxid,
|
|
34
|
+
int nsubxids, TransactionId *subxids);
|
|
35
|
+
|
|
36
|
+
extern void RecordKnownAssignedTransactionIds(TransactionId xid);
|
|
37
|
+
extern void ExpireTreeKnownAssignedTransactionIds(TransactionId xid,
|
|
38
|
+
int nsubxids, TransactionId *subxids,
|
|
39
|
+
TransactionId max_xid);
|
|
40
|
+
extern void ExpireAllKnownAssignedTransactionIds(void);
|
|
41
|
+
extern void ExpireOldKnownAssignedTransactionIds(TransactionId xid);
|
|
42
|
+
|
|
43
|
+
extern int GetMaxSnapshotXidCount(void);
|
|
44
|
+
extern int GetMaxSnapshotSubxidCount(void);
|
|
45
|
+
|
|
46
|
+
extern Snapshot GetSnapshotData(Snapshot snapshot);
|
|
47
|
+
|
|
48
|
+
extern bool ProcArrayInstallImportedXmin(TransactionId xmin,
|
|
49
|
+
VirtualTransactionId *sourcevxid);
|
|
50
|
+
extern bool ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc);
|
|
51
|
+
|
|
52
|
+
extern RunningTransactions GetRunningTransactionData(void);
|
|
53
|
+
|
|
54
|
+
extern bool TransactionIdIsInProgress(TransactionId xid);
|
|
55
|
+
extern bool TransactionIdIsActive(TransactionId xid);
|
|
56
|
+
extern TransactionId GetOldestNonRemovableTransactionId(Relation rel);
|
|
57
|
+
extern TransactionId GetOldestTransactionIdConsideredRunning(void);
|
|
58
|
+
extern TransactionId GetOldestActiveTransactionId(void);
|
|
59
|
+
extern TransactionId GetOldestSafeDecodingTransactionId(bool catalogOnly);
|
|
60
|
+
extern void GetReplicationHorizons(TransactionId *slot_xmin, TransactionId *catalog_xmin);
|
|
61
|
+
|
|
62
|
+
extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids, int type);
|
|
63
|
+
extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids,
|
|
64
|
+
int nvxids, int type);
|
|
65
|
+
|
|
66
|
+
extern PGPROC *BackendPidGetProc(int pid);
|
|
67
|
+
extern PGPROC *BackendPidGetProcWithLock(int pid);
|
|
68
|
+
extern int BackendXidGetPid(TransactionId xid);
|
|
69
|
+
extern bool IsBackendPid(int pid);
|
|
70
|
+
|
|
71
|
+
extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin,
|
|
72
|
+
bool excludeXmin0, bool allDbs, int excludeVacuum,
|
|
73
|
+
int *nvxids);
|
|
74
|
+
extern VirtualTransactionId *GetConflictingVirtualXIDs(TransactionId limitXmin, Oid dbOid);
|
|
75
|
+
extern pid_t CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode);
|
|
76
|
+
extern pid_t SignalVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode,
|
|
77
|
+
bool conflictPending);
|
|
78
|
+
|
|
79
|
+
extern bool MinimumActiveBackends(int min);
|
|
80
|
+
extern int CountDBBackends(Oid databaseid);
|
|
81
|
+
extern int CountDBConnections(Oid databaseid);
|
|
82
|
+
extern void CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending);
|
|
83
|
+
extern int CountUserBackends(Oid roleid);
|
|
84
|
+
extern bool CountOtherDBBackends(Oid databaseId,
|
|
85
|
+
int *nbackends, int *nprepared);
|
|
86
|
+
extern void TerminateOtherDBBackends(Oid databaseId);
|
|
87
|
+
|
|
88
|
+
extern void XidCacheRemoveRunningXids(TransactionId xid,
|
|
89
|
+
int nxids, const TransactionId *xids,
|
|
90
|
+
TransactionId latestXid);
|
|
91
|
+
|
|
92
|
+
extern void ProcArraySetReplicationSlotXmin(TransactionId xmin,
|
|
93
|
+
TransactionId catalog_xmin, bool already_locked);
|
|
94
|
+
|
|
95
|
+
extern void ProcArrayGetReplicationSlotXmin(TransactionId *xmin,
|
|
96
|
+
TransactionId *catalog_xmin);
|
|
97
|
+
|
|
98
|
+
#endif /* PROCARRAY_H */
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* See proclist.h for functions that operate on these types.
|
|
7
7
|
*
|
|
8
|
-
* Portions Copyright (c) 2016-
|
|
8
|
+
* Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group
|
|
9
9
|
*
|
|
10
10
|
* IDENTIFICATION
|
|
11
11
|
* src/include/storage/proclist_types.h
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Routines for interprocess signaling
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/storage/procsignal.h
|
|
@@ -34,6 +34,7 @@ typedef enum
|
|
|
34
34
|
PROCSIG_PARALLEL_MESSAGE, /* message from cooperating parallel backend */
|
|
35
35
|
PROCSIG_WALSND_INIT_STOPPING, /* ask walsenders to prepare for shutdown */
|
|
36
36
|
PROCSIG_BARRIER, /* global barrier interrupt */
|
|
37
|
+
PROCSIG_LOG_MEMORY_CONTEXT, /* ask backend to log the memory contexts */
|
|
37
38
|
|
|
38
39
|
/* Recovery conflict reasons */
|
|
39
40
|
PROCSIG_RECOVERY_CONFLICT_DATABASE,
|
|
@@ -48,12 +49,7 @@ typedef enum
|
|
|
48
49
|
|
|
49
50
|
typedef enum
|
|
50
51
|
{
|
|
51
|
-
/*
|
|
52
|
-
* XXX. PROCSIGNAL_BARRIER_PLACEHOLDER should be replaced when the first
|
|
53
|
-
* real user of the ProcSignalBarrier mechanism is added. It's just here
|
|
54
|
-
* for now because we can't have an empty enum.
|
|
55
|
-
*/
|
|
56
|
-
PROCSIGNAL_BARRIER_PLACEHOLDER = 0
|
|
52
|
+
PROCSIGNAL_BARRIER_SMGRRELEASE /* ask smgr to close files */
|
|
57
53
|
} ProcSignalBarrierType;
|
|
58
54
|
|
|
59
55
|
/*
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Physical access information for relations.
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/storage/relfilenode.h
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
* when using the SysV semaphore code.
|
|
87
87
|
*
|
|
88
88
|
*
|
|
89
|
-
* Portions Copyright (c) 1996-
|
|
89
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
90
90
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
91
91
|
*
|
|
92
92
|
* src/include/storage/s_lock.h
|
|
@@ -314,6 +314,7 @@ tas(volatile slock_t *lock)
|
|
|
314
314
|
#endif /* __INTEL_COMPILER */
|
|
315
315
|
#endif /* __ia64__ || __ia64 */
|
|
316
316
|
|
|
317
|
+
|
|
317
318
|
/*
|
|
318
319
|
* On ARM and ARM64, we use __sync_lock_test_and_set(int *, int) if available.
|
|
319
320
|
*
|
|
@@ -336,6 +337,23 @@ tas(volatile slock_t *lock)
|
|
|
336
337
|
|
|
337
338
|
#define S_UNLOCK(lock) __sync_lock_release(lock)
|
|
338
339
|
|
|
340
|
+
/*
|
|
341
|
+
* Using an ISB instruction to delay in spinlock loops appears beneficial on
|
|
342
|
+
* high-core-count ARM64 processors. It seems mostly a wash for smaller gear,
|
|
343
|
+
* and ISB doesn't exist at all on pre-v7 ARM chips.
|
|
344
|
+
*/
|
|
345
|
+
#if defined(__aarch64__) || defined(__aarch64)
|
|
346
|
+
|
|
347
|
+
#define SPIN_DELAY() spin_delay()
|
|
348
|
+
|
|
349
|
+
static __inline__ void
|
|
350
|
+
spin_delay(void)
|
|
351
|
+
{
|
|
352
|
+
__asm__ __volatile__(
|
|
353
|
+
" isb; \n");
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
#endif /* __aarch64__ || __aarch64 */
|
|
339
357
|
#endif /* HAVE_GCC__SYNC_INT32_TAS */
|
|
340
358
|
#endif /* __arm__ || __arm || __aarch64__ || __aarch64 */
|
|
341
359
|
|
|
@@ -724,6 +742,51 @@ tas(volatile slock_t *lock)
|
|
|
724
742
|
typedef unsigned char slock_t;
|
|
725
743
|
#endif
|
|
726
744
|
|
|
745
|
+
|
|
746
|
+
/*
|
|
747
|
+
* If we have no platform-specific knowledge, but we found that the compiler
|
|
748
|
+
* provides __sync_lock_test_and_set(), use that. Prefer the int-width
|
|
749
|
+
* version over the char-width version if we have both, on the rather dubious
|
|
750
|
+
* grounds that that's known to be more likely to work in the ARM ecosystem.
|
|
751
|
+
* (But we dealt with ARM above.)
|
|
752
|
+
*/
|
|
753
|
+
#if !defined(HAS_TEST_AND_SET)
|
|
754
|
+
|
|
755
|
+
#if defined(HAVE_GCC__SYNC_INT32_TAS)
|
|
756
|
+
#define HAS_TEST_AND_SET
|
|
757
|
+
|
|
758
|
+
#define TAS(lock) tas(lock)
|
|
759
|
+
|
|
760
|
+
typedef int slock_t;
|
|
761
|
+
|
|
762
|
+
static __inline__ int
|
|
763
|
+
tas(volatile slock_t *lock)
|
|
764
|
+
{
|
|
765
|
+
return __sync_lock_test_and_set(lock, 1);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
#define S_UNLOCK(lock) __sync_lock_release(lock)
|
|
769
|
+
|
|
770
|
+
#elif defined(HAVE_GCC__SYNC_CHAR_TAS)
|
|
771
|
+
#define HAS_TEST_AND_SET
|
|
772
|
+
|
|
773
|
+
#define TAS(lock) tas(lock)
|
|
774
|
+
|
|
775
|
+
typedef char slock_t;
|
|
776
|
+
|
|
777
|
+
static __inline__ int
|
|
778
|
+
tas(volatile slock_t *lock)
|
|
779
|
+
{
|
|
780
|
+
return __sync_lock_test_and_set(lock, 1);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
#define S_UNLOCK(lock) __sync_lock_release(lock)
|
|
784
|
+
|
|
785
|
+
#endif /* HAVE_GCC__SYNC_INT32_TAS */
|
|
786
|
+
|
|
787
|
+
#endif /* !defined(HAS_TEST_AND_SET) */
|
|
788
|
+
|
|
789
|
+
|
|
727
790
|
/*
|
|
728
791
|
* Default implementation of S_UNLOCK() for gcc/icc.
|
|
729
792
|
*
|
|
@@ -1001,7 +1064,7 @@ extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or
|
|
|
1001
1064
|
#define TAS_SPIN(lock) TAS(lock)
|
|
1002
1065
|
#endif /* TAS_SPIN */
|
|
1003
1066
|
|
|
1004
|
-
extern slock_t dummy_spinlock;
|
|
1067
|
+
extern PGDLLIMPORT slock_t dummy_spinlock;
|
|
1005
1068
|
|
|
1006
1069
|
/*
|
|
1007
1070
|
* Platform-independent out-of-line support routines
|
|
@@ -1041,7 +1104,7 @@ init_spin_delay(SpinDelayStatus *status,
|
|
|
1041
1104
|
}
|
|
1042
1105
|
|
|
1043
1106
|
#define init_local_spin_delay(status) init_spin_delay(status, __FILE__, __LINE__, PG_FUNCNAME_MACRO)
|
|
1044
|
-
void perform_spin_delay(SpinDelayStatus *status);
|
|
1045
|
-
void finish_spin_delay(SpinDelayStatus *status);
|
|
1107
|
+
extern void perform_spin_delay(SpinDelayStatus *status);
|
|
1108
|
+
extern void finish_spin_delay(SpinDelayStatus *status);
|
|
1046
1109
|
|
|
1047
1110
|
#endif /* S_LOCK_H */
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Shared temporary file management.
|
|
5
5
|
*
|
|
6
6
|
*
|
|
7
|
-
* Portions Copyright (c) 1996-
|
|
7
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
8
8
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
9
|
*
|
|
10
10
|
* src/include/storage/sharedfileset.h
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
#include "storage/dsm.h"
|
|
19
19
|
#include "storage/fd.h"
|
|
20
|
+
#include "storage/fileset.h"
|
|
20
21
|
#include "storage/spin.h"
|
|
21
22
|
|
|
22
23
|
/*
|
|
@@ -24,22 +25,13 @@
|
|
|
24
25
|
*/
|
|
25
26
|
typedef struct SharedFileSet
|
|
26
27
|
{
|
|
27
|
-
|
|
28
|
-
uint32 number; /* per-PID identifier */
|
|
28
|
+
FileSet fs;
|
|
29
29
|
slock_t mutex; /* mutex protecting the reference count */
|
|
30
30
|
int refcnt; /* number of attached backends */
|
|
31
|
-
int ntablespaces; /* number of tablespaces to use */
|
|
32
|
-
Oid tablespaces[8]; /* OIDs of tablespaces to use. Assumes that
|
|
33
|
-
* it's rare that there more than temp
|
|
34
|
-
* tablespaces. */
|
|
35
31
|
} SharedFileSet;
|
|
36
32
|
|
|
37
33
|
extern void SharedFileSetInit(SharedFileSet *fileset, dsm_segment *seg);
|
|
38
34
|
extern void SharedFileSetAttach(SharedFileSet *fileset, dsm_segment *seg);
|
|
39
|
-
extern File SharedFileSetCreate(SharedFileSet *fileset, const char *name);
|
|
40
|
-
extern File SharedFileSetOpen(SharedFileSet *fileset, const char *name);
|
|
41
|
-
extern bool SharedFileSetDelete(SharedFileSet *fileset, const char *name,
|
|
42
|
-
bool error_on_failure);
|
|
43
35
|
extern void SharedFileSetDeleteAll(SharedFileSet *fileset);
|
|
44
36
|
|
|
45
37
|
#endif
|