gitlab-pg_query 1.3.1 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +217 -99
- data/README.md +92 -69
- data/Rakefile +85 -5
- data/ext/pg_query/extconf.rb +3 -40
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +246 -0
- data/ext/pg_query/include/access/attmap.h +52 -0
- data/ext/pg_query/include/access/attnum.h +64 -0
- data/ext/pg_query/include/access/clog.h +61 -0
- data/ext/pg_query/include/access/commit_ts.h +77 -0
- data/ext/pg_query/include/access/detoast.h +92 -0
- data/ext/pg_query/include/access/genam.h +228 -0
- data/ext/pg_query/include/access/gin.h +78 -0
- data/ext/pg_query/include/access/htup.h +89 -0
- data/ext/pg_query/include/access/htup_details.h +819 -0
- data/ext/pg_query/include/access/itup.h +161 -0
- data/ext/pg_query/include/access/parallel.h +82 -0
- data/ext/pg_query/include/access/printtup.h +35 -0
- data/ext/pg_query/include/access/relation.h +28 -0
- data/ext/pg_query/include/access/relscan.h +176 -0
- data/ext/pg_query/include/access/rmgr.h +35 -0
- data/ext/pg_query/include/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/access/sdir.h +58 -0
- data/ext/pg_query/include/access/skey.h +151 -0
- data/ext/pg_query/include/access/stratnum.h +83 -0
- data/ext/pg_query/include/access/sysattr.h +29 -0
- data/ext/pg_query/include/access/table.h +27 -0
- data/ext/pg_query/include/access/tableam.h +1825 -0
- data/ext/pg_query/include/access/transam.h +265 -0
- data/ext/pg_query/include/access/tupconvert.h +51 -0
- data/ext/pg_query/include/access/tupdesc.h +154 -0
- data/ext/pg_query/include/access/tupmacs.h +247 -0
- data/ext/pg_query/include/access/twophase.h +61 -0
- data/ext/pg_query/include/access/xact.h +463 -0
- data/ext/pg_query/include/access/xlog.h +398 -0
- data/ext/pg_query/include/access/xlog_internal.h +330 -0
- data/ext/pg_query/include/access/xlogdefs.h +109 -0
- data/ext/pg_query/include/access/xloginsert.h +64 -0
- data/ext/pg_query/include/access/xlogreader.h +327 -0
- data/ext/pg_query/include/access/xlogrecord.h +227 -0
- data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
- data/ext/pg_query/include/c.h +1322 -0
- data/ext/pg_query/include/catalog/catalog.h +42 -0
- data/ext/pg_query/include/catalog/catversion.h +58 -0
- data/ext/pg_query/include/catalog/dependency.h +275 -0
- data/ext/pg_query/include/catalog/genbki.h +64 -0
- data/ext/pg_query/include/catalog/index.h +199 -0
- data/ext/pg_query/include/catalog/indexing.h +366 -0
- data/ext/pg_query/include/catalog/namespace.h +188 -0
- data/ext/pg_query/include/catalog/objectaccess.h +197 -0
- data/ext/pg_query/include/catalog/objectaddress.h +84 -0
- data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
- data/ext/pg_query/include/catalog/pg_am.h +60 -0
- data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
- data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
- data/ext/pg_query/include/catalog/pg_authid.h +58 -0
- data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_class.h +200 -0
- data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
- data/ext/pg_query/include/catalog/pg_collation.h +73 -0
- data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
- data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
- data/ext/pg_query/include/catalog/pg_control.h +250 -0
- data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
- data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_depend.h +73 -0
- data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_index.h +80 -0
- data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
- data/ext/pg_query/include/catalog/pg_language.h +67 -0
- data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
- data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
- data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
- data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_operator.h +102 -0
- data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_proc.h +211 -0
- data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
- data/ext/pg_query/include/catalog/pg_publication.h +115 -0
- data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
- data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
- data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
- data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
- data/ext/pg_query/include/catalog/pg_transform.h +45 -0
- data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
- data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
- data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_type.h +372 -0
- data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
- data/ext/pg_query/include/catalog/storage.h +48 -0
- data/ext/pg_query/include/commands/async.h +54 -0
- data/ext/pg_query/include/commands/dbcommands.h +35 -0
- data/ext/pg_query/include/commands/defrem.h +173 -0
- data/ext/pg_query/include/commands/event_trigger.h +88 -0
- data/ext/pg_query/include/commands/explain.h +127 -0
- data/ext/pg_query/include/commands/prepare.h +61 -0
- data/ext/pg_query/include/commands/tablespace.h +67 -0
- data/ext/pg_query/include/commands/trigger.h +277 -0
- data/ext/pg_query/include/commands/user.h +37 -0
- data/ext/pg_query/include/commands/vacuum.h +293 -0
- data/ext/pg_query/include/commands/variable.h +38 -0
- data/ext/pg_query/include/common/file_perm.h +56 -0
- data/ext/pg_query/include/common/hashfn.h +104 -0
- data/ext/pg_query/include/common/ip.h +37 -0
- data/ext/pg_query/include/common/keywords.h +33 -0
- data/ext/pg_query/include/common/kwlookup.h +44 -0
- data/ext/pg_query/include/common/relpath.h +90 -0
- data/ext/pg_query/include/common/string.h +19 -0
- data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
- data/ext/pg_query/include/datatype/timestamp.h +197 -0
- data/ext/pg_query/include/executor/execdesc.h +70 -0
- data/ext/pg_query/include/executor/executor.h +614 -0
- data/ext/pg_query/include/executor/functions.h +41 -0
- data/ext/pg_query/include/executor/instrument.h +101 -0
- data/ext/pg_query/include/executor/spi.h +175 -0
- data/ext/pg_query/include/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/executor/tuptable.h +487 -0
- data/ext/pg_query/include/fmgr.h +775 -0
- data/ext/pg_query/include/funcapi.h +348 -0
- data/ext/pg_query/include/getaddrinfo.h +162 -0
- data/ext/pg_query/include/jit/jit.h +105 -0
- data/ext/pg_query/include/kwlist_d.h +1072 -0
- data/ext/pg_query/include/lib/ilist.h +727 -0
- data/ext/pg_query/include/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/lib/simplehash.h +1059 -0
- data/ext/pg_query/include/lib/stringinfo.h +161 -0
- data/ext/pg_query/include/libpq/auth.h +29 -0
- data/ext/pg_query/include/libpq/crypt.h +46 -0
- data/ext/pg_query/include/libpq/hba.h +140 -0
- data/ext/pg_query/include/libpq/libpq-be.h +326 -0
- data/ext/pg_query/include/libpq/libpq.h +133 -0
- data/ext/pg_query/include/libpq/pqcomm.h +208 -0
- data/ext/pg_query/include/libpq/pqformat.h +210 -0
- data/ext/pg_query/include/libpq/pqsignal.h +42 -0
- data/ext/pg_query/include/mb/pg_wchar.h +672 -0
- data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/miscadmin.h +476 -0
- data/ext/pg_query/include/nodes/bitmapset.h +122 -0
- data/ext/pg_query/include/nodes/execnodes.h +2520 -0
- data/ext/pg_query/include/nodes/extensible.h +160 -0
- data/ext/pg_query/include/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/nodes/makefuncs.h +108 -0
- data/ext/pg_query/include/nodes/memnodes.h +108 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
- data/ext/pg_query/include/nodes/nodes.h +842 -0
- data/ext/pg_query/include/nodes/params.h +170 -0
- data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
- data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
- data/ext/pg_query/include/nodes/pg_list.h +605 -0
- data/ext/pg_query/include/nodes/plannodes.h +1251 -0
- data/ext/pg_query/include/nodes/primnodes.h +1541 -0
- data/ext/pg_query/include/nodes/print.h +34 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/nodes/value.h +61 -0
- data/ext/pg_query/include/optimizer/cost.h +206 -0
- data/ext/pg_query/include/optimizer/geqo.h +88 -0
- data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/optimizer/optimizer.h +199 -0
- data/ext/pg_query/include/optimizer/paths.h +249 -0
- data/ext/pg_query/include/optimizer/planmain.h +119 -0
- data/ext/pg_query/include/parser/analyze.h +49 -0
- data/ext/pg_query/include/parser/gram.h +1067 -0
- data/ext/pg_query/include/parser/gramparse.h +75 -0
- data/ext/pg_query/include/parser/kwlist.h +477 -0
- data/ext/pg_query/include/parser/parse_agg.h +68 -0
- data/ext/pg_query/include/parser/parse_clause.h +54 -0
- data/ext/pg_query/include/parser/parse_coerce.h +97 -0
- data/ext/pg_query/include/parser/parse_collate.h +27 -0
- data/ext/pg_query/include/parser/parse_expr.h +26 -0
- data/ext/pg_query/include/parser/parse_func.h +73 -0
- data/ext/pg_query/include/parser/parse_node.h +327 -0
- data/ext/pg_query/include/parser/parse_oper.h +67 -0
- data/ext/pg_query/include/parser/parse_relation.h +123 -0
- data/ext/pg_query/include/parser/parse_target.h +46 -0
- data/ext/pg_query/include/parser/parse_type.h +60 -0
- data/ext/pg_query/include/parser/parser.h +41 -0
- data/ext/pg_query/include/parser/parsetree.h +61 -0
- data/ext/pg_query/include/parser/scanner.h +152 -0
- data/ext/pg_query/include/parser/scansup.h +30 -0
- data/ext/pg_query/include/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/pg_config.h +989 -0
- data/ext/pg_query/include/pg_config_ext.h +8 -0
- data/ext/pg_query/include/pg_config_manual.h +350 -0
- data/ext/pg_query/include/pg_config_os.h +8 -0
- data/ext/pg_query/include/pg_getopt.h +56 -0
- data/ext/pg_query/include/pg_query.h +121 -0
- data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
- data/ext/pg_query/include/pg_query_json_helper.c +61 -0
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
- data/ext/pg_query/include/pg_trace.h +17 -0
- data/ext/pg_query/include/pgstat.h +1487 -0
- data/ext/pg_query/include/pgtime.h +84 -0
- data/ext/pg_query/include/pl_gram.h +385 -0
- data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/plerrcodes.h +990 -0
- data/ext/pg_query/include/plpgsql.h +1347 -0
- data/ext/pg_query/include/port.h +524 -0
- data/ext/pg_query/include/port/atomics.h +524 -0
- data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
- data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
- data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
- data/ext/pg_query/include/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
- data/ext/pg_query/include/port/atomics/generic.h +401 -0
- data/ext/pg_query/include/port/pg_bitutils.h +226 -0
- data/ext/pg_query/include/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/port/pg_crc32c.h +101 -0
- data/ext/pg_query/include/portability/instr_time.h +256 -0
- data/ext/pg_query/include/postgres.h +764 -0
- data/ext/pg_query/include/postgres_ext.h +74 -0
- data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
- data/ext/pg_query/include/postmaster/bgworker.h +161 -0
- data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
- data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postmaster/fork_process.h +17 -0
- data/ext/pg_query/include/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postmaster/pgarch.h +39 -0
- data/ext/pg_query/include/postmaster/postmaster.h +77 -0
- data/ext/pg_query/include/postmaster/syslogger.h +98 -0
- data/ext/pg_query/include/postmaster/walwriter.h +21 -0
- data/ext/pg_query/include/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
- data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
- data/ext/pg_query/include/regex/regex.h +184 -0
- data/ext/pg_query/include/replication/logicallauncher.h +31 -0
- data/ext/pg_query/include/replication/logicalproto.h +110 -0
- data/ext/pg_query/include/replication/logicalworker.h +19 -0
- data/ext/pg_query/include/replication/origin.h +73 -0
- data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
- data/ext/pg_query/include/replication/slot.h +219 -0
- data/ext/pg_query/include/replication/syncrep.h +115 -0
- data/ext/pg_query/include/replication/walreceiver.h +340 -0
- data/ext/pg_query/include/replication/walsender.h +74 -0
- data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
- data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
- data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/storage/backendid.h +37 -0
- data/ext/pg_query/include/storage/block.h +121 -0
- data/ext/pg_query/include/storage/buf.h +46 -0
- data/ext/pg_query/include/storage/bufmgr.h +292 -0
- data/ext/pg_query/include/storage/bufpage.h +459 -0
- data/ext/pg_query/include/storage/condition_variable.h +62 -0
- data/ext/pg_query/include/storage/dsm.h +61 -0
- data/ext/pg_query/include/storage/dsm_impl.h +75 -0
- data/ext/pg_query/include/storage/fd.h +168 -0
- data/ext/pg_query/include/storage/ipc.h +81 -0
- data/ext/pg_query/include/storage/item.h +19 -0
- data/ext/pg_query/include/storage/itemid.h +184 -0
- data/ext/pg_query/include/storage/itemptr.h +206 -0
- data/ext/pg_query/include/storage/large_object.h +100 -0
- data/ext/pg_query/include/storage/latch.h +190 -0
- data/ext/pg_query/include/storage/lmgr.h +114 -0
- data/ext/pg_query/include/storage/lock.h +612 -0
- data/ext/pg_query/include/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/storage/lwlock.h +232 -0
- data/ext/pg_query/include/storage/lwlocknames.h +51 -0
- data/ext/pg_query/include/storage/off.h +57 -0
- data/ext/pg_query/include/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/storage/pg_shmem.h +90 -0
- data/ext/pg_query/include/storage/pmsignal.h +94 -0
- data/ext/pg_query/include/storage/predicate.h +87 -0
- data/ext/pg_query/include/storage/proc.h +333 -0
- data/ext/pg_query/include/storage/proclist_types.h +51 -0
- data/ext/pg_query/include/storage/procsignal.h +75 -0
- data/ext/pg_query/include/storage/relfilenode.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +1047 -0
- data/ext/pg_query/include/storage/sharedfileset.h +45 -0
- data/ext/pg_query/include/storage/shm_mq.h +85 -0
- data/ext/pg_query/include/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/storage/shmem.h +81 -0
- data/ext/pg_query/include/storage/sinval.h +153 -0
- data/ext/pg_query/include/storage/sinvaladt.h +43 -0
- data/ext/pg_query/include/storage/smgr.h +109 -0
- data/ext/pg_query/include/storage/spin.h +77 -0
- data/ext/pg_query/include/storage/standby.h +91 -0
- data/ext/pg_query/include/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/storage/sync.h +62 -0
- data/ext/pg_query/include/tcop/cmdtag.h +58 -0
- data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
- data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/tcop/dest.h +149 -0
- data/ext/pg_query/include/tcop/fastpath.h +21 -0
- data/ext/pg_query/include/tcop/pquery.h +45 -0
- data/ext/pg_query/include/tcop/tcopprot.h +89 -0
- data/ext/pg_query/include/tcop/utility.h +108 -0
- data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
- data/ext/pg_query/include/utils/acl.h +312 -0
- data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/utils/array.h +458 -0
- data/ext/pg_query/include/utils/builtins.h +127 -0
- data/ext/pg_query/include/utils/bytea.h +27 -0
- data/ext/pg_query/include/utils/catcache.h +231 -0
- data/ext/pg_query/include/utils/date.h +90 -0
- data/ext/pg_query/include/utils/datetime.h +343 -0
- data/ext/pg_query/include/utils/datum.h +68 -0
- data/ext/pg_query/include/utils/dsa.h +123 -0
- data/ext/pg_query/include/utils/dynahash.h +19 -0
- data/ext/pg_query/include/utils/elog.h +439 -0
- data/ext/pg_query/include/utils/errcodes.h +352 -0
- data/ext/pg_query/include/utils/expandeddatum.h +159 -0
- data/ext/pg_query/include/utils/expandedrecord.h +231 -0
- data/ext/pg_query/include/utils/float.h +356 -0
- data/ext/pg_query/include/utils/fmgroids.h +2657 -0
- data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
- data/ext/pg_query/include/utils/fmgrtab.h +48 -0
- data/ext/pg_query/include/utils/guc.h +443 -0
- data/ext/pg_query/include/utils/guc_tables.h +272 -0
- data/ext/pg_query/include/utils/hsearch.h +149 -0
- data/ext/pg_query/include/utils/inval.h +64 -0
- data/ext/pg_query/include/utils/lsyscache.h +197 -0
- data/ext/pg_query/include/utils/memdebug.h +82 -0
- data/ext/pg_query/include/utils/memutils.h +225 -0
- data/ext/pg_query/include/utils/numeric.h +76 -0
- data/ext/pg_query/include/utils/palloc.h +136 -0
- data/ext/pg_query/include/utils/partcache.h +102 -0
- data/ext/pg_query/include/utils/pg_locale.h +119 -0
- data/ext/pg_query/include/utils/pg_lsn.h +29 -0
- data/ext/pg_query/include/utils/pidfile.h +56 -0
- data/ext/pg_query/include/utils/plancache.h +235 -0
- data/ext/pg_query/include/utils/portal.h +241 -0
- data/ext/pg_query/include/utils/probes.h +114 -0
- data/ext/pg_query/include/utils/ps_status.h +25 -0
- data/ext/pg_query/include/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/utils/regproc.h +28 -0
- data/ext/pg_query/include/utils/rel.h +644 -0
- data/ext/pg_query/include/utils/relcache.h +151 -0
- data/ext/pg_query/include/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/utils/resowner.h +86 -0
- data/ext/pg_query/include/utils/rls.h +50 -0
- data/ext/pg_query/include/utils/ruleutils.h +44 -0
- data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/utils/snapmgr.h +158 -0
- data/ext/pg_query/include/utils/snapshot.h +206 -0
- data/ext/pg_query/include/utils/sortsupport.h +276 -0
- data/ext/pg_query/include/utils/syscache.h +219 -0
- data/ext/pg_query/include/utils/timeout.h +88 -0
- data/ext/pg_query/include/utils/timestamp.h +116 -0
- data/ext/pg_query/include/utils/tuplesort.h +277 -0
- data/ext/pg_query/include/utils/tuplestore.h +91 -0
- data/ext/pg_query/include/utils/typcache.h +202 -0
- data/ext/pg_query/include/utils/tzparser.h +39 -0
- data/ext/pg_query/include/utils/varlena.h +39 -0
- data/ext/pg_query/include/utils/xml.h +84 -0
- data/ext/pg_query/include/xxhash.h +5445 -0
- data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
- data/ext/pg_query/pg_query.c +104 -0
- data/ext/pg_query/pg_query.pb-c.c +37628 -0
- data/ext/pg_query/pg_query_deparse.c +9959 -0
- data/ext/pg_query/pg_query_fingerprint.c +295 -0
- data/ext/pg_query/pg_query_fingerprint.h +8 -0
- data/ext/pg_query/pg_query_internal.h +24 -0
- data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
- data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
- data/ext/pg_query/pg_query_normalize.c +439 -0
- data/ext/pg_query/pg_query_outfuncs.h +10 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
- data/ext/pg_query/pg_query_parse.c +148 -0
- data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
- data/ext/pg_query/pg_query_readfuncs.h +11 -0
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
- data/ext/pg_query/pg_query_ruby.c +108 -12
- data/ext/pg_query/pg_query_scan.c +173 -0
- data/ext/pg_query/pg_query_split.c +221 -0
- data/ext/pg_query/protobuf-c.c +3660 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
- data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
- data/ext/pg_query/src_backend_commands_define.c +117 -0
- data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
- data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
- data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
- data/ext/pg_query/src_backend_nodes_list.c +922 -0
- data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
- data/ext/pg_query/src_backend_nodes_value.c +84 -0
- data/ext/pg_query/src_backend_parser_gram.c +47456 -0
- data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
- data/ext/pg_query/src_backend_parser_parser.c +497 -0
- data/ext/pg_query/src_backend_parser_scan.c +7091 -0
- data/ext/pg_query/src_backend_parser_scansup.c +160 -0
- data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
- data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
- data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
- data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
- data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
- data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
- data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
- data/ext/pg_query/src_common_encnames.c +158 -0
- data/ext/pg_query/src_common_keywords.c +39 -0
- data/ext/pg_query/src_common_kwlist_d.h +1081 -0
- data/ext/pg_query/src_common_kwlookup.c +91 -0
- data/ext/pg_query/src_common_psprintf.c +158 -0
- data/ext/pg_query/src_common_string.c +86 -0
- data/ext/pg_query/src_common_stringinfo.c +336 -0
- data/ext/pg_query/src_common_wchar.c +1651 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
- data/ext/pg_query/src_port_erand48.c +127 -0
- data/ext/pg_query/src_port_pg_bitutils.c +246 -0
- data/ext/pg_query/src_port_pgsleep.c +69 -0
- data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
- data/ext/pg_query/src_port_qsort.c +240 -0
- data/ext/pg_query/src_port_random.c +31 -0
- data/ext/pg_query/src_port_snprintf.c +1449 -0
- data/ext/pg_query/src_port_strerror.c +324 -0
- data/ext/pg_query/src_port_strnlen.c +39 -0
- data/ext/pg_query/xxhash.c +43 -0
- data/lib/pg_query.rb +7 -4
- data/lib/pg_query/constants.rb +21 -0
- data/lib/pg_query/deparse.rb +15 -1581
- data/lib/pg_query/filter_columns.rb +88 -85
- data/lib/pg_query/fingerprint.rb +122 -87
- data/lib/pg_query/json_field_names.rb +1402 -0
- data/lib/pg_query/node.rb +31 -0
- data/lib/pg_query/param_refs.rb +42 -37
- data/lib/pg_query/parse.rb +220 -203
- data/lib/pg_query/parse_error.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +3211 -0
- data/lib/pg_query/scan.rb +23 -0
- data/lib/pg_query/treewalker.rb +24 -40
- data/lib/pg_query/truncate.rb +71 -42
- data/lib/pg_query/version.rb +2 -2
- metadata +472 -11
- data/ext/pg_query/pg_query_ruby.h +0 -10
- data/lib/pg_query/deep_dup.rb +0 -16
- data/lib/pg_query/deparse/alter_table.rb +0 -42
- data/lib/pg_query/deparse/interval.rb +0 -105
- data/lib/pg_query/deparse/keywords.rb +0 -159
- data/lib/pg_query/deparse/rename.rb +0 -41
- data/lib/pg_query/legacy_parsetree.rb +0 -109
- data/lib/pg_query/node_types.rb +0 -296
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
* slot.h
|
|
3
|
+
* Replication slot management.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2012-2020, PostgreSQL Global Development Group
|
|
6
|
+
*
|
|
7
|
+
*-------------------------------------------------------------------------
|
|
8
|
+
*/
|
|
9
|
+
#ifndef SLOT_H
|
|
10
|
+
#define SLOT_H
|
|
11
|
+
|
|
12
|
+
#include "access/xlog.h"
|
|
13
|
+
#include "access/xlogreader.h"
|
|
14
|
+
#include "storage/condition_variable.h"
|
|
15
|
+
#include "storage/lwlock.h"
|
|
16
|
+
#include "storage/shmem.h"
|
|
17
|
+
#include "storage/spin.h"
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Behaviour of replication slots, upon release or crash.
|
|
21
|
+
*
|
|
22
|
+
* Slots marked as PERSISTENT are crash-safe and will not be dropped when
|
|
23
|
+
* released. Slots marked as EPHEMERAL will be dropped when released or after
|
|
24
|
+
* restarts. Slots marked TEMPORARY will be dropped at the end of a session
|
|
25
|
+
* or on error.
|
|
26
|
+
*
|
|
27
|
+
* EPHEMERAL is used as a not-quite-ready state when creating persistent
|
|
28
|
+
* slots. EPHEMERAL slots can be made PERSISTENT by calling
|
|
29
|
+
* ReplicationSlotPersist(). For a slot that goes away at the end of a
|
|
30
|
+
* session, TEMPORARY is the appropriate choice.
|
|
31
|
+
*/
|
|
32
|
+
typedef enum ReplicationSlotPersistency
|
|
33
|
+
{
|
|
34
|
+
RS_PERSISTENT,
|
|
35
|
+
RS_EPHEMERAL,
|
|
36
|
+
RS_TEMPORARY
|
|
37
|
+
} ReplicationSlotPersistency;
|
|
38
|
+
|
|
39
|
+
/* For ReplicationSlotAcquire, q.v. */
|
|
40
|
+
typedef enum SlotAcquireBehavior
|
|
41
|
+
{
|
|
42
|
+
SAB_Error,
|
|
43
|
+
SAB_Block,
|
|
44
|
+
SAB_Inquire
|
|
45
|
+
} SlotAcquireBehavior;
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* On-Disk data of a replication slot, preserved across restarts.
|
|
49
|
+
*/
|
|
50
|
+
typedef struct ReplicationSlotPersistentData
|
|
51
|
+
{
|
|
52
|
+
/* The slot's identifier */
|
|
53
|
+
NameData name;
|
|
54
|
+
|
|
55
|
+
/* database the slot is active on */
|
|
56
|
+
Oid database;
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* The slot's behaviour when being dropped (or restored after a crash).
|
|
60
|
+
*/
|
|
61
|
+
ReplicationSlotPersistency persistency;
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* xmin horizon for data
|
|
65
|
+
*
|
|
66
|
+
* NB: This may represent a value that hasn't been written to disk yet;
|
|
67
|
+
* see notes for effective_xmin, below.
|
|
68
|
+
*/
|
|
69
|
+
TransactionId xmin;
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* xmin horizon for catalog tuples
|
|
73
|
+
*
|
|
74
|
+
* NB: This may represent a value that hasn't been written to disk yet;
|
|
75
|
+
* see notes for effective_xmin, below.
|
|
76
|
+
*/
|
|
77
|
+
TransactionId catalog_xmin;
|
|
78
|
+
|
|
79
|
+
/* oldest LSN that might be required by this replication slot */
|
|
80
|
+
XLogRecPtr restart_lsn;
|
|
81
|
+
|
|
82
|
+
/* restart_lsn is copied here when the slot is invalidated */
|
|
83
|
+
XLogRecPtr invalidated_at;
|
|
84
|
+
|
|
85
|
+
/*
|
|
86
|
+
* Oldest LSN that the client has acked receipt for. This is used as the
|
|
87
|
+
* start_lsn point in case the client doesn't specify one, and also as a
|
|
88
|
+
* safety measure to jump forwards in case the client specifies a
|
|
89
|
+
* start_lsn that's further in the past than this value.
|
|
90
|
+
*/
|
|
91
|
+
XLogRecPtr confirmed_flush;
|
|
92
|
+
|
|
93
|
+
/* plugin name */
|
|
94
|
+
NameData plugin;
|
|
95
|
+
} ReplicationSlotPersistentData;
|
|
96
|
+
|
|
97
|
+
/*
|
|
98
|
+
* Shared memory state of a single replication slot.
|
|
99
|
+
*
|
|
100
|
+
* The in-memory data of replication slots follows a locking model based
|
|
101
|
+
* on two linked concepts:
|
|
102
|
+
* - A replication slot's in_use flag is switched when added or discarded using
|
|
103
|
+
* the LWLock ReplicationSlotControlLock, which needs to be hold in exclusive
|
|
104
|
+
* mode when updating the flag by the backend owning the slot and doing the
|
|
105
|
+
* operation, while readers (concurrent backends not owning the slot) need
|
|
106
|
+
* to hold it in shared mode when looking at replication slot data.
|
|
107
|
+
* - Individual fields are protected by mutex where only the backend owning
|
|
108
|
+
* the slot is authorized to update the fields from its own slot. The
|
|
109
|
+
* backend owning the slot does not need to take this lock when reading its
|
|
110
|
+
* own fields, while concurrent backends not owning this slot should take the
|
|
111
|
+
* lock when reading this slot's data.
|
|
112
|
+
*/
|
|
113
|
+
typedef struct ReplicationSlot
|
|
114
|
+
{
|
|
115
|
+
/* lock, on same cacheline as effective_xmin */
|
|
116
|
+
slock_t mutex;
|
|
117
|
+
|
|
118
|
+
/* is this slot defined */
|
|
119
|
+
bool in_use;
|
|
120
|
+
|
|
121
|
+
/* Who is streaming out changes for this slot? 0 in unused slots. */
|
|
122
|
+
pid_t active_pid;
|
|
123
|
+
|
|
124
|
+
/* any outstanding modifications? */
|
|
125
|
+
bool just_dirtied;
|
|
126
|
+
bool dirty;
|
|
127
|
+
|
|
128
|
+
/*
|
|
129
|
+
* For logical decoding, it's extremely important that we never remove any
|
|
130
|
+
* data that's still needed for decoding purposes, even after a crash;
|
|
131
|
+
* otherwise, decoding will produce wrong answers. Ordinary streaming
|
|
132
|
+
* replication also needs to prevent old row versions from being removed
|
|
133
|
+
* too soon, but the worst consequence we might encounter there is
|
|
134
|
+
* unwanted query cancellations on the standby. Thus, for logical
|
|
135
|
+
* decoding, this value represents the latest xmin that has actually been
|
|
136
|
+
* written to disk, whereas for streaming replication, it's just the same
|
|
137
|
+
* as the persistent value (data.xmin).
|
|
138
|
+
*/
|
|
139
|
+
TransactionId effective_xmin;
|
|
140
|
+
TransactionId effective_catalog_xmin;
|
|
141
|
+
|
|
142
|
+
/* data surviving shutdowns and crashes */
|
|
143
|
+
ReplicationSlotPersistentData data;
|
|
144
|
+
|
|
145
|
+
/* is somebody performing io on this slot? */
|
|
146
|
+
LWLock io_in_progress_lock;
|
|
147
|
+
|
|
148
|
+
/* Condition variable signaled when active_pid changes */
|
|
149
|
+
ConditionVariable active_cv;
|
|
150
|
+
|
|
151
|
+
/* all the remaining data is only used for logical slots */
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* When the client has confirmed flushes >= candidate_xmin_lsn we can
|
|
155
|
+
* advance the catalog xmin. When restart_valid has been passed,
|
|
156
|
+
* restart_lsn can be increased.
|
|
157
|
+
*/
|
|
158
|
+
TransactionId candidate_catalog_xmin;
|
|
159
|
+
XLogRecPtr candidate_xmin_lsn;
|
|
160
|
+
XLogRecPtr candidate_restart_valid;
|
|
161
|
+
XLogRecPtr candidate_restart_lsn;
|
|
162
|
+
} ReplicationSlot;
|
|
163
|
+
|
|
164
|
+
#define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
|
|
165
|
+
#define SlotIsLogical(slot) ((slot)->data.database != InvalidOid)
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* Shared memory control area for all of replication slots.
|
|
169
|
+
*/
|
|
170
|
+
typedef struct ReplicationSlotCtlData
|
|
171
|
+
{
|
|
172
|
+
/*
|
|
173
|
+
* This array should be declared [FLEXIBLE_ARRAY_MEMBER], but for some
|
|
174
|
+
* reason you can't do that in an otherwise-empty struct.
|
|
175
|
+
*/
|
|
176
|
+
ReplicationSlot replication_slots[1];
|
|
177
|
+
} ReplicationSlotCtlData;
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
* Pointers to shared memory
|
|
181
|
+
*/
|
|
182
|
+
extern PGDLLIMPORT ReplicationSlotCtlData *ReplicationSlotCtl;
|
|
183
|
+
extern PGDLLIMPORT ReplicationSlot *MyReplicationSlot;
|
|
184
|
+
|
|
185
|
+
/* GUCs */
|
|
186
|
+
extern PGDLLIMPORT int max_replication_slots;
|
|
187
|
+
|
|
188
|
+
/* shmem initialization functions */
|
|
189
|
+
extern Size ReplicationSlotsShmemSize(void);
|
|
190
|
+
extern void ReplicationSlotsShmemInit(void);
|
|
191
|
+
|
|
192
|
+
/* management of individual slots */
|
|
193
|
+
extern void ReplicationSlotCreate(const char *name, bool db_specific,
|
|
194
|
+
ReplicationSlotPersistency p);
|
|
195
|
+
extern void ReplicationSlotPersist(void);
|
|
196
|
+
extern void ReplicationSlotDrop(const char *name, bool nowait);
|
|
197
|
+
|
|
198
|
+
extern int ReplicationSlotAcquire(const char *name, SlotAcquireBehavior behavior);
|
|
199
|
+
extern void ReplicationSlotRelease(void);
|
|
200
|
+
extern void ReplicationSlotCleanup(void);
|
|
201
|
+
extern void ReplicationSlotSave(void);
|
|
202
|
+
extern void ReplicationSlotMarkDirty(void);
|
|
203
|
+
|
|
204
|
+
/* misc stuff */
|
|
205
|
+
extern bool ReplicationSlotValidateName(const char *name, int elevel);
|
|
206
|
+
extern void ReplicationSlotReserveWal(void);
|
|
207
|
+
extern void ReplicationSlotsComputeRequiredXmin(bool already_locked);
|
|
208
|
+
extern void ReplicationSlotsComputeRequiredLSN(void);
|
|
209
|
+
extern XLogRecPtr ReplicationSlotsComputeLogicalRestartLSN(void);
|
|
210
|
+
extern bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive);
|
|
211
|
+
extern void ReplicationSlotsDropDBSlots(Oid dboid);
|
|
212
|
+
extern void InvalidateObsoleteReplicationSlots(XLogSegNo oldestSegno);
|
|
213
|
+
|
|
214
|
+
extern void StartupReplicationSlots(void);
|
|
215
|
+
extern void CheckPointReplicationSlots(void);
|
|
216
|
+
|
|
217
|
+
extern void CheckSlotRequirements(void);
|
|
218
|
+
|
|
219
|
+
#endif /* SLOT_H */
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* syncrep.h
|
|
4
|
+
* Exports from replication/syncrep.c.
|
|
5
|
+
*
|
|
6
|
+
* Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group
|
|
7
|
+
*
|
|
8
|
+
* IDENTIFICATION
|
|
9
|
+
* src/include/replication/syncrep.h
|
|
10
|
+
*
|
|
11
|
+
*-------------------------------------------------------------------------
|
|
12
|
+
*/
|
|
13
|
+
#ifndef _SYNCREP_H
|
|
14
|
+
#define _SYNCREP_H
|
|
15
|
+
|
|
16
|
+
#include "access/xlogdefs.h"
|
|
17
|
+
#include "utils/guc.h"
|
|
18
|
+
|
|
19
|
+
#define SyncRepRequested() \
|
|
20
|
+
(max_wal_senders > 0 && synchronous_commit > SYNCHRONOUS_COMMIT_LOCAL_FLUSH)
|
|
21
|
+
|
|
22
|
+
/* SyncRepWaitMode */
|
|
23
|
+
#define SYNC_REP_NO_WAIT (-1)
|
|
24
|
+
#define SYNC_REP_WAIT_WRITE 0
|
|
25
|
+
#define SYNC_REP_WAIT_FLUSH 1
|
|
26
|
+
#define SYNC_REP_WAIT_APPLY 2
|
|
27
|
+
|
|
28
|
+
#define NUM_SYNC_REP_WAIT_MODE 3
|
|
29
|
+
|
|
30
|
+
/* syncRepState */
|
|
31
|
+
#define SYNC_REP_NOT_WAITING 0
|
|
32
|
+
#define SYNC_REP_WAITING 1
|
|
33
|
+
#define SYNC_REP_WAIT_COMPLETE 2
|
|
34
|
+
|
|
35
|
+
/* syncrep_method of SyncRepConfigData */
|
|
36
|
+
#define SYNC_REP_PRIORITY 0
|
|
37
|
+
#define SYNC_REP_QUORUM 1
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* SyncRepGetCandidateStandbys returns an array of these structs,
|
|
41
|
+
* one per candidate synchronous walsender.
|
|
42
|
+
*/
|
|
43
|
+
typedef struct SyncRepStandbyData
|
|
44
|
+
{
|
|
45
|
+
/* Copies of relevant fields from WalSnd shared-memory struct */
|
|
46
|
+
pid_t pid;
|
|
47
|
+
XLogRecPtr write;
|
|
48
|
+
XLogRecPtr flush;
|
|
49
|
+
XLogRecPtr apply;
|
|
50
|
+
int sync_standby_priority;
|
|
51
|
+
/* Index of this walsender in the WalSnd shared-memory array */
|
|
52
|
+
int walsnd_index;
|
|
53
|
+
/* This flag indicates whether this struct is about our own process */
|
|
54
|
+
bool is_me;
|
|
55
|
+
} SyncRepStandbyData;
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* Struct for the configuration of synchronous replication.
|
|
59
|
+
*
|
|
60
|
+
* Note: this must be a flat representation that can be held in a single
|
|
61
|
+
* chunk of malloc'd memory, so that it can be stored as the "extra" data
|
|
62
|
+
* for the synchronous_standby_names GUC.
|
|
63
|
+
*/
|
|
64
|
+
typedef struct SyncRepConfigData
|
|
65
|
+
{
|
|
66
|
+
int config_size; /* total size of this struct, in bytes */
|
|
67
|
+
int num_sync; /* number of sync standbys that we need to
|
|
68
|
+
* wait for */
|
|
69
|
+
uint8 syncrep_method; /* method to choose sync standbys */
|
|
70
|
+
int nmembers; /* number of members in the following list */
|
|
71
|
+
/* member_names contains nmembers consecutive nul-terminated C strings */
|
|
72
|
+
char member_names[FLEXIBLE_ARRAY_MEMBER];
|
|
73
|
+
} SyncRepConfigData;
|
|
74
|
+
|
|
75
|
+
extern SyncRepConfigData *SyncRepConfig;
|
|
76
|
+
|
|
77
|
+
/* communication variables for parsing synchronous_standby_names GUC */
|
|
78
|
+
extern SyncRepConfigData *syncrep_parse_result;
|
|
79
|
+
extern char *syncrep_parse_error_msg;
|
|
80
|
+
|
|
81
|
+
/* user-settable parameters for synchronous replication */
|
|
82
|
+
extern char *SyncRepStandbyNames;
|
|
83
|
+
|
|
84
|
+
/* called by user backend */
|
|
85
|
+
extern void SyncRepWaitForLSN(XLogRecPtr lsn, bool commit);
|
|
86
|
+
|
|
87
|
+
/* called at backend exit */
|
|
88
|
+
extern void SyncRepCleanupAtProcExit(void);
|
|
89
|
+
|
|
90
|
+
/* called by wal sender */
|
|
91
|
+
extern void SyncRepInitConfig(void);
|
|
92
|
+
extern void SyncRepReleaseWaiters(void);
|
|
93
|
+
|
|
94
|
+
/* called by wal sender and user backend */
|
|
95
|
+
extern int SyncRepGetCandidateStandbys(SyncRepStandbyData **standbys);
|
|
96
|
+
|
|
97
|
+
/* called by checkpointer */
|
|
98
|
+
extern void SyncRepUpdateSyncStandbysDefined(void);
|
|
99
|
+
|
|
100
|
+
/* GUC infrastructure */
|
|
101
|
+
extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source);
|
|
102
|
+
extern void assign_synchronous_standby_names(const char *newval, void *extra);
|
|
103
|
+
extern void assign_synchronous_commit(int newval, void *extra);
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Internal functions for parsing synchronous_standby_names grammar,
|
|
107
|
+
* in syncrep_gram.y and syncrep_scanner.l
|
|
108
|
+
*/
|
|
109
|
+
extern int syncrep_yyparse(void);
|
|
110
|
+
extern int syncrep_yylex(void);
|
|
111
|
+
extern void syncrep_yyerror(const char *str);
|
|
112
|
+
extern void syncrep_scanner_init(const char *query_string);
|
|
113
|
+
extern void syncrep_scanner_finish(void);
|
|
114
|
+
|
|
115
|
+
#endif /* _SYNCREP_H */
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* walreceiver.h
|
|
4
|
+
* Exports from replication/walreceiverfuncs.c.
|
|
5
|
+
*
|
|
6
|
+
* Portions Copyright (c) 2010-2020, PostgreSQL Global Development Group
|
|
7
|
+
*
|
|
8
|
+
* src/include/replication/walreceiver.h
|
|
9
|
+
*
|
|
10
|
+
*-------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
#ifndef _WALRECEIVER_H
|
|
13
|
+
#define _WALRECEIVER_H
|
|
14
|
+
|
|
15
|
+
#include "access/xlog.h"
|
|
16
|
+
#include "access/xlogdefs.h"
|
|
17
|
+
#include "getaddrinfo.h" /* for NI_MAXHOST */
|
|
18
|
+
#include "pgtime.h"
|
|
19
|
+
#include "port/atomics.h"
|
|
20
|
+
#include "replication/logicalproto.h"
|
|
21
|
+
#include "replication/walsender.h"
|
|
22
|
+
#include "storage/latch.h"
|
|
23
|
+
#include "storage/spin.h"
|
|
24
|
+
#include "utils/tuplestore.h"
|
|
25
|
+
|
|
26
|
+
/* user-settable parameters */
|
|
27
|
+
extern int wal_receiver_status_interval;
|
|
28
|
+
extern int wal_receiver_timeout;
|
|
29
|
+
extern bool hot_standby_feedback;
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* MAXCONNINFO: maximum size of a connection string.
|
|
33
|
+
*
|
|
34
|
+
* XXX: Should this move to pg_config_manual.h?
|
|
35
|
+
*/
|
|
36
|
+
#define MAXCONNINFO 1024
|
|
37
|
+
|
|
38
|
+
/* Can we allow the standby to accept replication connection from another standby? */
|
|
39
|
+
#define AllowCascadeReplication() (EnableHotStandby && max_wal_senders > 0)
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Values for WalRcv->walRcvState.
|
|
43
|
+
*/
|
|
44
|
+
typedef enum
|
|
45
|
+
{
|
|
46
|
+
WALRCV_STOPPED, /* stopped and mustn't start up again */
|
|
47
|
+
WALRCV_STARTING, /* launched, but the process hasn't
|
|
48
|
+
* initialized yet */
|
|
49
|
+
WALRCV_STREAMING, /* walreceiver is streaming */
|
|
50
|
+
WALRCV_WAITING, /* stopped streaming, waiting for orders */
|
|
51
|
+
WALRCV_RESTARTING, /* asked to restart streaming */
|
|
52
|
+
WALRCV_STOPPING /* requested to stop, but still running */
|
|
53
|
+
} WalRcvState;
|
|
54
|
+
|
|
55
|
+
/* Shared memory area for management of walreceiver process */
|
|
56
|
+
typedef struct
|
|
57
|
+
{
|
|
58
|
+
/*
|
|
59
|
+
* PID of currently active walreceiver process, its current state and
|
|
60
|
+
* start time (actually, the time at which it was requested to be
|
|
61
|
+
* started).
|
|
62
|
+
*/
|
|
63
|
+
pid_t pid;
|
|
64
|
+
WalRcvState walRcvState;
|
|
65
|
+
pg_time_t startTime;
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* receiveStart and receiveStartTLI indicate the first byte position and
|
|
69
|
+
* timeline that will be received. When startup process starts the
|
|
70
|
+
* walreceiver, it sets these to the point where it wants the streaming to
|
|
71
|
+
* begin.
|
|
72
|
+
*/
|
|
73
|
+
XLogRecPtr receiveStart;
|
|
74
|
+
TimeLineID receiveStartTLI;
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* flushedUpto-1 is the last byte position that has already been received,
|
|
78
|
+
* and receivedTLI is the timeline it came from. At the first startup of
|
|
79
|
+
* walreceiver, these are set to receiveStart and receiveStartTLI. After
|
|
80
|
+
* that, walreceiver updates these whenever it flushes the received WAL to
|
|
81
|
+
* disk.
|
|
82
|
+
*/
|
|
83
|
+
XLogRecPtr flushedUpto;
|
|
84
|
+
TimeLineID receivedTLI;
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* latestChunkStart is the starting byte position of the current "batch"
|
|
88
|
+
* of received WAL. It's actually the same as the previous value of
|
|
89
|
+
* flushedUpto before the last flush to disk. Startup process can use
|
|
90
|
+
* this to detect whether it's keeping up or not.
|
|
91
|
+
*/
|
|
92
|
+
XLogRecPtr latestChunkStart;
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* Time of send and receive of any message received.
|
|
96
|
+
*/
|
|
97
|
+
TimestampTz lastMsgSendTime;
|
|
98
|
+
TimestampTz lastMsgReceiptTime;
|
|
99
|
+
|
|
100
|
+
/*
|
|
101
|
+
* Latest reported end of WAL on the sender
|
|
102
|
+
*/
|
|
103
|
+
XLogRecPtr latestWalEnd;
|
|
104
|
+
TimestampTz latestWalEndTime;
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* connection string; initially set to connect to the primary, and later
|
|
108
|
+
* clobbered to hide security-sensitive fields.
|
|
109
|
+
*/
|
|
110
|
+
char conninfo[MAXCONNINFO];
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Host name (this can be a host name, an IP address, or a directory path)
|
|
114
|
+
* and port number of the active replication connection.
|
|
115
|
+
*/
|
|
116
|
+
char sender_host[NI_MAXHOST];
|
|
117
|
+
int sender_port;
|
|
118
|
+
|
|
119
|
+
/*
|
|
120
|
+
* replication slot name; is also used for walreceiver to connect with the
|
|
121
|
+
* primary
|
|
122
|
+
*/
|
|
123
|
+
char slotname[NAMEDATALEN];
|
|
124
|
+
|
|
125
|
+
/*
|
|
126
|
+
* If it's a temporary replication slot, it needs to be recreated when
|
|
127
|
+
* connecting.
|
|
128
|
+
*/
|
|
129
|
+
bool is_temp_slot;
|
|
130
|
+
|
|
131
|
+
/* set true once conninfo is ready to display (obfuscated pwds etc) */
|
|
132
|
+
bool ready_to_display;
|
|
133
|
+
|
|
134
|
+
/*
|
|
135
|
+
* Latch used by startup process to wake up walreceiver after telling it
|
|
136
|
+
* where to start streaming (after setting receiveStart and
|
|
137
|
+
* receiveStartTLI), and also to tell it to send apply feedback to the
|
|
138
|
+
* primary whenever specially marked commit records are applied. This is
|
|
139
|
+
* normally mapped to procLatch when walreceiver is running.
|
|
140
|
+
*/
|
|
141
|
+
Latch *latch;
|
|
142
|
+
|
|
143
|
+
slock_t mutex; /* locks shared variables shown above */
|
|
144
|
+
|
|
145
|
+
/*
|
|
146
|
+
* Like flushedUpto, but advanced after writing and before flushing,
|
|
147
|
+
* without the need to acquire the spin lock. Data can be read by another
|
|
148
|
+
* process up to this point, but shouldn't be used for data integrity
|
|
149
|
+
* purposes.
|
|
150
|
+
*/
|
|
151
|
+
pg_atomic_uint64 writtenUpto;
|
|
152
|
+
|
|
153
|
+
/*
|
|
154
|
+
* force walreceiver reply? This doesn't need to be locked; memory
|
|
155
|
+
* barriers for ordering are sufficient. But we do need atomic fetch and
|
|
156
|
+
* store semantics, so use sig_atomic_t.
|
|
157
|
+
*/
|
|
158
|
+
sig_atomic_t force_reply; /* used as a bool */
|
|
159
|
+
} WalRcvData;
|
|
160
|
+
|
|
161
|
+
extern WalRcvData *WalRcv;
|
|
162
|
+
|
|
163
|
+
typedef struct
|
|
164
|
+
{
|
|
165
|
+
bool logical; /* True if this is logical replication stream,
|
|
166
|
+
* false if physical stream. */
|
|
167
|
+
char *slotname; /* Name of the replication slot or NULL. */
|
|
168
|
+
XLogRecPtr startpoint; /* LSN of starting point. */
|
|
169
|
+
|
|
170
|
+
union
|
|
171
|
+
{
|
|
172
|
+
struct
|
|
173
|
+
{
|
|
174
|
+
TimeLineID startpointTLI; /* Starting timeline */
|
|
175
|
+
} physical;
|
|
176
|
+
struct
|
|
177
|
+
{
|
|
178
|
+
uint32 proto_version; /* Logical protocol version */
|
|
179
|
+
List *publication_names; /* String list of publications */
|
|
180
|
+
} logical;
|
|
181
|
+
} proto;
|
|
182
|
+
} WalRcvStreamOptions;
|
|
183
|
+
|
|
184
|
+
struct WalReceiverConn;
|
|
185
|
+
typedef struct WalReceiverConn WalReceiverConn;
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* Status of walreceiver query execution.
|
|
189
|
+
*
|
|
190
|
+
* We only define statuses that are currently used.
|
|
191
|
+
*/
|
|
192
|
+
typedef enum
|
|
193
|
+
{
|
|
194
|
+
WALRCV_ERROR, /* There was error when executing the query. */
|
|
195
|
+
WALRCV_OK_COMMAND, /* Query executed utility or replication
|
|
196
|
+
* command. */
|
|
197
|
+
WALRCV_OK_TUPLES, /* Query returned tuples. */
|
|
198
|
+
WALRCV_OK_COPY_IN, /* Query started COPY FROM. */
|
|
199
|
+
WALRCV_OK_COPY_OUT, /* Query started COPY TO. */
|
|
200
|
+
WALRCV_OK_COPY_BOTH /* Query started COPY BOTH replication
|
|
201
|
+
* protocol. */
|
|
202
|
+
} WalRcvExecStatus;
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* Return value for walrcv_exec, returns the status of the execution and
|
|
206
|
+
* tuples if any.
|
|
207
|
+
*/
|
|
208
|
+
typedef struct WalRcvExecResult
|
|
209
|
+
{
|
|
210
|
+
WalRcvExecStatus status;
|
|
211
|
+
char *err;
|
|
212
|
+
Tuplestorestate *tuplestore;
|
|
213
|
+
TupleDesc tupledesc;
|
|
214
|
+
} WalRcvExecResult;
|
|
215
|
+
|
|
216
|
+
/* libpqwalreceiver hooks */
|
|
217
|
+
typedef WalReceiverConn *(*walrcv_connect_fn) (const char *conninfo, bool logical,
|
|
218
|
+
const char *appname,
|
|
219
|
+
char **err);
|
|
220
|
+
typedef void (*walrcv_check_conninfo_fn) (const char *conninfo);
|
|
221
|
+
typedef char *(*walrcv_get_conninfo_fn) (WalReceiverConn *conn);
|
|
222
|
+
typedef void (*walrcv_get_senderinfo_fn) (WalReceiverConn *conn,
|
|
223
|
+
char **sender_host,
|
|
224
|
+
int *sender_port);
|
|
225
|
+
typedef char *(*walrcv_identify_system_fn) (WalReceiverConn *conn,
|
|
226
|
+
TimeLineID *primary_tli);
|
|
227
|
+
typedef int (*walrcv_server_version_fn) (WalReceiverConn *conn);
|
|
228
|
+
typedef void (*walrcv_readtimelinehistoryfile_fn) (WalReceiverConn *conn,
|
|
229
|
+
TimeLineID tli,
|
|
230
|
+
char **filename,
|
|
231
|
+
char **content, int *size);
|
|
232
|
+
typedef bool (*walrcv_startstreaming_fn) (WalReceiverConn *conn,
|
|
233
|
+
const WalRcvStreamOptions *options);
|
|
234
|
+
typedef void (*walrcv_endstreaming_fn) (WalReceiverConn *conn,
|
|
235
|
+
TimeLineID *next_tli);
|
|
236
|
+
typedef int (*walrcv_receive_fn) (WalReceiverConn *conn, char **buffer,
|
|
237
|
+
pgsocket *wait_fd);
|
|
238
|
+
typedef void (*walrcv_send_fn) (WalReceiverConn *conn, const char *buffer,
|
|
239
|
+
int nbytes);
|
|
240
|
+
typedef char *(*walrcv_create_slot_fn) (WalReceiverConn *conn,
|
|
241
|
+
const char *slotname, bool temporary,
|
|
242
|
+
CRSSnapshotAction snapshot_action,
|
|
243
|
+
XLogRecPtr *lsn);
|
|
244
|
+
typedef pid_t (*walrcv_get_backend_pid_fn) (WalReceiverConn *conn);
|
|
245
|
+
typedef WalRcvExecResult *(*walrcv_exec_fn) (WalReceiverConn *conn,
|
|
246
|
+
const char *query,
|
|
247
|
+
const int nRetTypes,
|
|
248
|
+
const Oid *retTypes);
|
|
249
|
+
typedef void (*walrcv_disconnect_fn) (WalReceiverConn *conn);
|
|
250
|
+
|
|
251
|
+
typedef struct WalReceiverFunctionsType
|
|
252
|
+
{
|
|
253
|
+
walrcv_connect_fn walrcv_connect;
|
|
254
|
+
walrcv_check_conninfo_fn walrcv_check_conninfo;
|
|
255
|
+
walrcv_get_conninfo_fn walrcv_get_conninfo;
|
|
256
|
+
walrcv_get_senderinfo_fn walrcv_get_senderinfo;
|
|
257
|
+
walrcv_identify_system_fn walrcv_identify_system;
|
|
258
|
+
walrcv_server_version_fn walrcv_server_version;
|
|
259
|
+
walrcv_readtimelinehistoryfile_fn walrcv_readtimelinehistoryfile;
|
|
260
|
+
walrcv_startstreaming_fn walrcv_startstreaming;
|
|
261
|
+
walrcv_endstreaming_fn walrcv_endstreaming;
|
|
262
|
+
walrcv_receive_fn walrcv_receive;
|
|
263
|
+
walrcv_send_fn walrcv_send;
|
|
264
|
+
walrcv_create_slot_fn walrcv_create_slot;
|
|
265
|
+
walrcv_get_backend_pid_fn walrcv_get_backend_pid;
|
|
266
|
+
walrcv_exec_fn walrcv_exec;
|
|
267
|
+
walrcv_disconnect_fn walrcv_disconnect;
|
|
268
|
+
} WalReceiverFunctionsType;
|
|
269
|
+
|
|
270
|
+
extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions;
|
|
271
|
+
|
|
272
|
+
#define walrcv_connect(conninfo, logical, appname, err) \
|
|
273
|
+
WalReceiverFunctions->walrcv_connect(conninfo, logical, appname, err)
|
|
274
|
+
#define walrcv_check_conninfo(conninfo) \
|
|
275
|
+
WalReceiverFunctions->walrcv_check_conninfo(conninfo)
|
|
276
|
+
#define walrcv_get_conninfo(conn) \
|
|
277
|
+
WalReceiverFunctions->walrcv_get_conninfo(conn)
|
|
278
|
+
#define walrcv_get_senderinfo(conn, sender_host, sender_port) \
|
|
279
|
+
WalReceiverFunctions->walrcv_get_senderinfo(conn, sender_host, sender_port)
|
|
280
|
+
#define walrcv_identify_system(conn, primary_tli) \
|
|
281
|
+
WalReceiverFunctions->walrcv_identify_system(conn, primary_tli)
|
|
282
|
+
#define walrcv_server_version(conn) \
|
|
283
|
+
WalReceiverFunctions->walrcv_server_version(conn)
|
|
284
|
+
#define walrcv_readtimelinehistoryfile(conn, tli, filename, content, size) \
|
|
285
|
+
WalReceiverFunctions->walrcv_readtimelinehistoryfile(conn, tli, filename, content, size)
|
|
286
|
+
#define walrcv_startstreaming(conn, options) \
|
|
287
|
+
WalReceiverFunctions->walrcv_startstreaming(conn, options)
|
|
288
|
+
#define walrcv_endstreaming(conn, next_tli) \
|
|
289
|
+
WalReceiverFunctions->walrcv_endstreaming(conn, next_tli)
|
|
290
|
+
#define walrcv_receive(conn, buffer, wait_fd) \
|
|
291
|
+
WalReceiverFunctions->walrcv_receive(conn, buffer, wait_fd)
|
|
292
|
+
#define walrcv_send(conn, buffer, nbytes) \
|
|
293
|
+
WalReceiverFunctions->walrcv_send(conn, buffer, nbytes)
|
|
294
|
+
#define walrcv_create_slot(conn, slotname, temporary, snapshot_action, lsn) \
|
|
295
|
+
WalReceiverFunctions->walrcv_create_slot(conn, slotname, temporary, snapshot_action, lsn)
|
|
296
|
+
#define walrcv_get_backend_pid(conn) \
|
|
297
|
+
WalReceiverFunctions->walrcv_get_backend_pid(conn)
|
|
298
|
+
#define walrcv_exec(conn, exec, nRetTypes, retTypes) \
|
|
299
|
+
WalReceiverFunctions->walrcv_exec(conn, exec, nRetTypes, retTypes)
|
|
300
|
+
#define walrcv_disconnect(conn) \
|
|
301
|
+
WalReceiverFunctions->walrcv_disconnect(conn)
|
|
302
|
+
|
|
303
|
+
static inline void
|
|
304
|
+
walrcv_clear_result(WalRcvExecResult *walres)
|
|
305
|
+
{
|
|
306
|
+
if (!walres)
|
|
307
|
+
return;
|
|
308
|
+
|
|
309
|
+
if (walres->err)
|
|
310
|
+
pfree(walres->err);
|
|
311
|
+
|
|
312
|
+
if (walres->tuplestore)
|
|
313
|
+
tuplestore_end(walres->tuplestore);
|
|
314
|
+
|
|
315
|
+
if (walres->tupledesc)
|
|
316
|
+
FreeTupleDesc(walres->tupledesc);
|
|
317
|
+
|
|
318
|
+
pfree(walres);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* prototypes for functions in walreceiver.c */
|
|
322
|
+
extern void WalReceiverMain(void) pg_attribute_noreturn();
|
|
323
|
+
extern void ProcessWalRcvInterrupts(void);
|
|
324
|
+
|
|
325
|
+
/* prototypes for functions in walreceiverfuncs.c */
|
|
326
|
+
extern Size WalRcvShmemSize(void);
|
|
327
|
+
extern void WalRcvShmemInit(void);
|
|
328
|
+
extern void ShutdownWalRcv(void);
|
|
329
|
+
extern bool WalRcvStreaming(void);
|
|
330
|
+
extern bool WalRcvRunning(void);
|
|
331
|
+
extern void RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr,
|
|
332
|
+
const char *conninfo, const char *slotname,
|
|
333
|
+
bool create_temp_slot);
|
|
334
|
+
extern XLogRecPtr GetWalRcvFlushRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI);
|
|
335
|
+
extern XLogRecPtr GetWalRcvWriteRecPtr(void);
|
|
336
|
+
extern int GetReplicationApplyDelay(void);
|
|
337
|
+
extern int GetReplicationTransferLatency(void);
|
|
338
|
+
extern void WalRcvForceReply(void);
|
|
339
|
+
|
|
340
|
+
#endif /* _WALRECEIVER_H */
|