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,109 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xlogdefs.h
|
|
3
|
+
*
|
|
4
|
+
* Postgres write-ahead log manager record pointer and
|
|
5
|
+
* timeline number definitions
|
|
6
|
+
*
|
|
7
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
8
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
9
|
+
*
|
|
10
|
+
* src/include/access/xlogdefs.h
|
|
11
|
+
*/
|
|
12
|
+
#ifndef XLOG_DEFS_H
|
|
13
|
+
#define XLOG_DEFS_H
|
|
14
|
+
|
|
15
|
+
#include <fcntl.h> /* need open() flags */
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* Pointer to a location in the XLOG. These pointers are 64 bits wide,
|
|
19
|
+
* because we don't want them ever to overflow.
|
|
20
|
+
*/
|
|
21
|
+
typedef uint64 XLogRecPtr;
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* Zero is used indicate an invalid pointer. Bootstrap skips the first possible
|
|
25
|
+
* WAL segment, initializing the first WAL page at WAL segment size, so no XLOG
|
|
26
|
+
* record can begin at zero.
|
|
27
|
+
*/
|
|
28
|
+
#define InvalidXLogRecPtr 0
|
|
29
|
+
#define XLogRecPtrIsInvalid(r) ((r) == InvalidXLogRecPtr)
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* First LSN to use for "fake" LSNs.
|
|
33
|
+
*
|
|
34
|
+
* Values smaller than this can be used for special per-AM purposes.
|
|
35
|
+
*/
|
|
36
|
+
#define FirstNormalUnloggedLSN ((XLogRecPtr) 1000)
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* XLogSegNo - physical log file sequence number.
|
|
40
|
+
*/
|
|
41
|
+
typedef uint64 XLogSegNo;
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* TimeLineID (TLI) - identifies different database histories to prevent
|
|
45
|
+
* confusion after restoring a prior state of a database installation.
|
|
46
|
+
* TLI does not change in a normal stop/restart of the database (including
|
|
47
|
+
* crash-and-recover cases); but we must assign a new TLI after doing
|
|
48
|
+
* a recovery to a prior state, a/k/a point-in-time recovery. This makes
|
|
49
|
+
* the new WAL logfile sequence we generate distinguishable from the
|
|
50
|
+
* sequence that was generated in the previous incarnation.
|
|
51
|
+
*/
|
|
52
|
+
typedef uint32 TimeLineID;
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Replication origin id - this is located in this file to avoid having to
|
|
56
|
+
* include origin.h in a bunch of xlog related places.
|
|
57
|
+
*/
|
|
58
|
+
typedef uint16 RepOriginId;
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Because O_DIRECT bypasses the kernel buffers, and because we never
|
|
62
|
+
* read those buffers except during crash recovery or if wal_level != minimal,
|
|
63
|
+
* it is a win to use it in all cases where we sync on each write(). We could
|
|
64
|
+
* allow O_DIRECT with fsync(), but it is unclear if fsync() could process
|
|
65
|
+
* writes not buffered in the kernel. Also, O_DIRECT is never enough to force
|
|
66
|
+
* data to the drives, it merely tries to bypass the kernel cache, so we still
|
|
67
|
+
* need O_SYNC/O_DSYNC.
|
|
68
|
+
*/
|
|
69
|
+
#ifdef O_DIRECT
|
|
70
|
+
#define PG_O_DIRECT O_DIRECT
|
|
71
|
+
#else
|
|
72
|
+
#define PG_O_DIRECT 0
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* This chunk of hackery attempts to determine which file sync methods
|
|
77
|
+
* are available on the current platform, and to choose an appropriate
|
|
78
|
+
* default method. We assume that fsync() is always available, and that
|
|
79
|
+
* configure determined whether fdatasync() is.
|
|
80
|
+
*/
|
|
81
|
+
#if defined(O_SYNC)
|
|
82
|
+
#define OPEN_SYNC_FLAG O_SYNC
|
|
83
|
+
#elif defined(O_FSYNC)
|
|
84
|
+
#define OPEN_SYNC_FLAG O_FSYNC
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
#if defined(O_DSYNC)
|
|
88
|
+
#if defined(OPEN_SYNC_FLAG)
|
|
89
|
+
/* O_DSYNC is distinct? */
|
|
90
|
+
#if O_DSYNC != OPEN_SYNC_FLAG
|
|
91
|
+
#define OPEN_DATASYNC_FLAG O_DSYNC
|
|
92
|
+
#endif
|
|
93
|
+
#else /* !defined(OPEN_SYNC_FLAG) */
|
|
94
|
+
/* Win32 only has O_DSYNC */
|
|
95
|
+
#define OPEN_DATASYNC_FLAG O_DSYNC
|
|
96
|
+
#endif
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
#if defined(PLATFORM_DEFAULT_SYNC_METHOD)
|
|
100
|
+
#define DEFAULT_SYNC_METHOD PLATFORM_DEFAULT_SYNC_METHOD
|
|
101
|
+
#elif defined(OPEN_DATASYNC_FLAG)
|
|
102
|
+
#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN_DSYNC
|
|
103
|
+
#elif defined(HAVE_FDATASYNC)
|
|
104
|
+
#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC
|
|
105
|
+
#else
|
|
106
|
+
#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC
|
|
107
|
+
#endif
|
|
108
|
+
|
|
109
|
+
#endif /* XLOG_DEFS_H */
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xloginsert.h
|
|
3
|
+
*
|
|
4
|
+
* Functions for generating WAL records
|
|
5
|
+
*
|
|
6
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
7
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
8
|
+
*
|
|
9
|
+
* src/include/access/xloginsert.h
|
|
10
|
+
*/
|
|
11
|
+
#ifndef XLOGINSERT_H
|
|
12
|
+
#define XLOGINSERT_H
|
|
13
|
+
|
|
14
|
+
#include "access/rmgr.h"
|
|
15
|
+
#include "access/xlogdefs.h"
|
|
16
|
+
#include "storage/block.h"
|
|
17
|
+
#include "storage/buf.h"
|
|
18
|
+
#include "storage/relfilenode.h"
|
|
19
|
+
#include "utils/relcache.h"
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
* The minimum size of the WAL construction working area. If you need to
|
|
23
|
+
* register more than XLR_NORMAL_MAX_BLOCK_ID block references or have more
|
|
24
|
+
* than XLR_NORMAL_RDATAS data chunks in a single WAL record, you must call
|
|
25
|
+
* XLogEnsureRecordSpace() first to allocate more working memory.
|
|
26
|
+
*/
|
|
27
|
+
#define XLR_NORMAL_MAX_BLOCK_ID 4
|
|
28
|
+
#define XLR_NORMAL_RDATAS 20
|
|
29
|
+
|
|
30
|
+
/* flags for XLogRegisterBuffer */
|
|
31
|
+
#define REGBUF_FORCE_IMAGE 0x01 /* force a full-page image */
|
|
32
|
+
#define REGBUF_NO_IMAGE 0x02 /* don't take a full-page image */
|
|
33
|
+
#define REGBUF_WILL_INIT (0x04 | 0x02) /* page will be re-initialized at
|
|
34
|
+
* replay (implies NO_IMAGE) */
|
|
35
|
+
#define REGBUF_STANDARD 0x08 /* page follows "standard" page layout,
|
|
36
|
+
* (data between pd_lower and pd_upper
|
|
37
|
+
* will be skipped) */
|
|
38
|
+
#define REGBUF_KEEP_DATA 0x10 /* include data even if a full-page image
|
|
39
|
+
* is taken */
|
|
40
|
+
|
|
41
|
+
/* prototypes for public functions in xloginsert.c: */
|
|
42
|
+
extern void XLogBeginInsert(void);
|
|
43
|
+
extern void XLogSetRecordFlags(uint8 flags);
|
|
44
|
+
extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info);
|
|
45
|
+
extern void XLogEnsureRecordSpace(int max_block_id, int ndatas);
|
|
46
|
+
extern void XLogRegisterData(char *data, int len);
|
|
47
|
+
extern void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags);
|
|
48
|
+
extern void XLogRegisterBlock(uint8 block_id, RelFileNode *rnode,
|
|
49
|
+
ForkNumber forknum, BlockNumber blknum, char *page,
|
|
50
|
+
uint8 flags);
|
|
51
|
+
extern void XLogRegisterBufData(uint8 block_id, char *data, int len);
|
|
52
|
+
extern void XLogResetInsertion(void);
|
|
53
|
+
extern bool XLogCheckBufferNeedsBackup(Buffer buffer);
|
|
54
|
+
|
|
55
|
+
extern XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum,
|
|
56
|
+
BlockNumber blk, char *page, bool page_std);
|
|
57
|
+
extern XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std);
|
|
58
|
+
extern void log_newpage_range(Relation rel, ForkNumber forkNum,
|
|
59
|
+
BlockNumber startblk, BlockNumber endblk, bool page_std);
|
|
60
|
+
extern XLogRecPtr XLogSaveBufferForHint(Buffer buffer, bool buffer_std);
|
|
61
|
+
|
|
62
|
+
extern void InitXLogInsert(void);
|
|
63
|
+
|
|
64
|
+
#endif /* XLOGINSERT_H */
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* xlogreader.h
|
|
4
|
+
* Definitions for the generic XLog reading facility
|
|
5
|
+
*
|
|
6
|
+
* Portions Copyright (c) 2013-2020, PostgreSQL Global Development Group
|
|
7
|
+
*
|
|
8
|
+
* IDENTIFICATION
|
|
9
|
+
* src/include/access/xlogreader.h
|
|
10
|
+
*
|
|
11
|
+
* NOTES
|
|
12
|
+
* See the definition of the XLogReaderState struct for instructions on
|
|
13
|
+
* how to use the XLogReader infrastructure.
|
|
14
|
+
*
|
|
15
|
+
* The basic idea is to allocate an XLogReaderState via
|
|
16
|
+
* XLogReaderAllocate(), position the reader to the first record with
|
|
17
|
+
* XLogBeginRead() or XLogFindNextRecord(), and call XLogReadRecord()
|
|
18
|
+
* until it returns NULL.
|
|
19
|
+
*
|
|
20
|
+
* Callers supply a page_read callback if they want to to call
|
|
21
|
+
* XLogReadRecord or XLogFindNextRecord; it can be passed in as NULL
|
|
22
|
+
* otherwise. The WALRead function can be used as a helper to write
|
|
23
|
+
* page_read callbacks, but it is not mandatory; callers that use it,
|
|
24
|
+
* must supply segment_open callbacks. The segment_close callback
|
|
25
|
+
* must always be supplied.
|
|
26
|
+
*
|
|
27
|
+
* After reading a record with XLogReadRecord(), it's decomposed into
|
|
28
|
+
* the per-block and main data parts, and the parts can be accessed
|
|
29
|
+
* with the XLogRec* macros and functions. You can also decode a
|
|
30
|
+
* record that's already constructed in memory, without reading from
|
|
31
|
+
* disk, by calling the DecodeXLogRecord() function.
|
|
32
|
+
*-------------------------------------------------------------------------
|
|
33
|
+
*/
|
|
34
|
+
#ifndef XLOGREADER_H
|
|
35
|
+
#define XLOGREADER_H
|
|
36
|
+
|
|
37
|
+
#ifndef FRONTEND
|
|
38
|
+
#include "access/transam.h"
|
|
39
|
+
#endif
|
|
40
|
+
|
|
41
|
+
#include "access/xlogrecord.h"
|
|
42
|
+
|
|
43
|
+
/* WALOpenSegment represents a WAL segment being read. */
|
|
44
|
+
typedef struct WALOpenSegment
|
|
45
|
+
{
|
|
46
|
+
int ws_file; /* segment file descriptor */
|
|
47
|
+
XLogSegNo ws_segno; /* segment number */
|
|
48
|
+
TimeLineID ws_tli; /* timeline ID of the currently open file */
|
|
49
|
+
} WALOpenSegment;
|
|
50
|
+
|
|
51
|
+
/* WALSegmentContext carries context information about WAL segments to read */
|
|
52
|
+
typedef struct WALSegmentContext
|
|
53
|
+
{
|
|
54
|
+
char ws_dir[MAXPGPATH];
|
|
55
|
+
int ws_segsize;
|
|
56
|
+
} WALSegmentContext;
|
|
57
|
+
|
|
58
|
+
typedef struct XLogReaderState XLogReaderState;
|
|
59
|
+
|
|
60
|
+
/* Function type definitions for various xlogreader interactions */
|
|
61
|
+
typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader,
|
|
62
|
+
XLogRecPtr targetPagePtr,
|
|
63
|
+
int reqLen,
|
|
64
|
+
XLogRecPtr targetRecPtr,
|
|
65
|
+
char *readBuf);
|
|
66
|
+
typedef void (*WALSegmentOpenCB) (XLogReaderState *xlogreader,
|
|
67
|
+
XLogSegNo nextSegNo,
|
|
68
|
+
TimeLineID *tli_p);
|
|
69
|
+
typedef void (*WALSegmentCloseCB) (XLogReaderState *xlogreader);
|
|
70
|
+
|
|
71
|
+
typedef struct XLogReaderRoutine
|
|
72
|
+
{
|
|
73
|
+
/*
|
|
74
|
+
* Data input callback
|
|
75
|
+
*
|
|
76
|
+
* This callback shall read at least reqLen valid bytes of the xlog page
|
|
77
|
+
* starting at targetPagePtr, and store them in readBuf. The callback
|
|
78
|
+
* shall return the number of bytes read (never more than XLOG_BLCKSZ), or
|
|
79
|
+
* -1 on failure. The callback shall sleep, if necessary, to wait for the
|
|
80
|
+
* requested bytes to become available. The callback will not be invoked
|
|
81
|
+
* again for the same page unless more than the returned number of bytes
|
|
82
|
+
* are needed.
|
|
83
|
+
*
|
|
84
|
+
* targetRecPtr is the position of the WAL record we're reading. Usually
|
|
85
|
+
* it is equal to targetPagePtr + reqLen, but sometimes xlogreader needs
|
|
86
|
+
* to read and verify the page or segment header, before it reads the
|
|
87
|
+
* actual WAL record it's interested in. In that case, targetRecPtr can
|
|
88
|
+
* be used to determine which timeline to read the page from.
|
|
89
|
+
*
|
|
90
|
+
* The callback shall set ->seg.ws_tli to the TLI of the file the page was
|
|
91
|
+
* read from.
|
|
92
|
+
*/
|
|
93
|
+
XLogPageReadCB page_read;
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* Callback to open the specified WAL segment for reading. ->seg.ws_file
|
|
97
|
+
* shall be set to the file descriptor of the opened segment. In case of
|
|
98
|
+
* failure, an error shall be raised by the callback and it shall not
|
|
99
|
+
* return.
|
|
100
|
+
*
|
|
101
|
+
* "nextSegNo" is the number of the segment to be opened.
|
|
102
|
+
*
|
|
103
|
+
* "tli_p" is an input/output argument. WALRead() uses it to pass the
|
|
104
|
+
* timeline in which the new segment should be found, but the callback can
|
|
105
|
+
* use it to return the TLI that it actually opened.
|
|
106
|
+
*/
|
|
107
|
+
WALSegmentOpenCB segment_open;
|
|
108
|
+
|
|
109
|
+
/*
|
|
110
|
+
* WAL segment close callback. ->seg.ws_file shall be set to a negative
|
|
111
|
+
* number.
|
|
112
|
+
*/
|
|
113
|
+
WALSegmentCloseCB segment_close;
|
|
114
|
+
} XLogReaderRoutine;
|
|
115
|
+
|
|
116
|
+
#define XL_ROUTINE(...) &(XLogReaderRoutine){__VA_ARGS__}
|
|
117
|
+
|
|
118
|
+
typedef struct
|
|
119
|
+
{
|
|
120
|
+
/* Is this block ref in use? */
|
|
121
|
+
bool in_use;
|
|
122
|
+
|
|
123
|
+
/* Identify the block this refers to */
|
|
124
|
+
RelFileNode rnode;
|
|
125
|
+
ForkNumber forknum;
|
|
126
|
+
BlockNumber blkno;
|
|
127
|
+
|
|
128
|
+
/* copy of the fork_flags field from the XLogRecordBlockHeader */
|
|
129
|
+
uint8 flags;
|
|
130
|
+
|
|
131
|
+
/* Information on full-page image, if any */
|
|
132
|
+
bool has_image; /* has image, even for consistency checking */
|
|
133
|
+
bool apply_image; /* has image that should be restored */
|
|
134
|
+
char *bkp_image;
|
|
135
|
+
uint16 hole_offset;
|
|
136
|
+
uint16 hole_length;
|
|
137
|
+
uint16 bimg_len;
|
|
138
|
+
uint8 bimg_info;
|
|
139
|
+
|
|
140
|
+
/* Buffer holding the rmgr-specific data associated with this block */
|
|
141
|
+
bool has_data;
|
|
142
|
+
char *data;
|
|
143
|
+
uint16 data_len;
|
|
144
|
+
uint16 data_bufsz;
|
|
145
|
+
} DecodedBkpBlock;
|
|
146
|
+
|
|
147
|
+
struct XLogReaderState
|
|
148
|
+
{
|
|
149
|
+
/*
|
|
150
|
+
* Operational callbacks
|
|
151
|
+
*/
|
|
152
|
+
XLogReaderRoutine routine;
|
|
153
|
+
|
|
154
|
+
/* ----------------------------------------
|
|
155
|
+
* Public parameters
|
|
156
|
+
* ----------------------------------------
|
|
157
|
+
*/
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* System identifier of the xlog files we're about to read. Set to zero
|
|
161
|
+
* (the default value) if unknown or unimportant.
|
|
162
|
+
*/
|
|
163
|
+
uint64 system_identifier;
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* Opaque data for callbacks to use. Not used by XLogReader.
|
|
167
|
+
*/
|
|
168
|
+
void *private_data;
|
|
169
|
+
|
|
170
|
+
/*
|
|
171
|
+
* Start and end point of last record read. EndRecPtr is also used as the
|
|
172
|
+
* position to read next. Calling XLogBeginRead() sets EndRecPtr to the
|
|
173
|
+
* starting position and ReadRecPtr to invalid.
|
|
174
|
+
*/
|
|
175
|
+
XLogRecPtr ReadRecPtr; /* start of last record read */
|
|
176
|
+
XLogRecPtr EndRecPtr; /* end+1 of last record read */
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
/* ----------------------------------------
|
|
180
|
+
* Decoded representation of current record
|
|
181
|
+
*
|
|
182
|
+
* Use XLogRecGet* functions to investigate the record; these fields
|
|
183
|
+
* should not be accessed directly.
|
|
184
|
+
* ----------------------------------------
|
|
185
|
+
*/
|
|
186
|
+
XLogRecord *decoded_record; /* currently decoded record */
|
|
187
|
+
|
|
188
|
+
char *main_data; /* record's main data portion */
|
|
189
|
+
uint32 main_data_len; /* main data portion's length */
|
|
190
|
+
uint32 main_data_bufsz; /* allocated size of the buffer */
|
|
191
|
+
|
|
192
|
+
RepOriginId record_origin;
|
|
193
|
+
|
|
194
|
+
/* information about blocks referenced by the record. */
|
|
195
|
+
DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID + 1];
|
|
196
|
+
|
|
197
|
+
int max_block_id; /* highest block_id in use (-1 if none) */
|
|
198
|
+
|
|
199
|
+
/* ----------------------------------------
|
|
200
|
+
* private/internal state
|
|
201
|
+
* ----------------------------------------
|
|
202
|
+
*/
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* Buffer for currently read page (XLOG_BLCKSZ bytes, valid up to at least
|
|
206
|
+
* readLen bytes)
|
|
207
|
+
*/
|
|
208
|
+
char *readBuf;
|
|
209
|
+
uint32 readLen;
|
|
210
|
+
|
|
211
|
+
/* last read XLOG position for data currently in readBuf */
|
|
212
|
+
WALSegmentContext segcxt;
|
|
213
|
+
WALOpenSegment seg;
|
|
214
|
+
uint32 segoff;
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* beginning of prior page read, and its TLI. Doesn't necessarily
|
|
218
|
+
* correspond to what's in readBuf; used for timeline sanity checks.
|
|
219
|
+
*/
|
|
220
|
+
XLogRecPtr latestPagePtr;
|
|
221
|
+
TimeLineID latestPageTLI;
|
|
222
|
+
|
|
223
|
+
/* beginning of the WAL record being read. */
|
|
224
|
+
XLogRecPtr currRecPtr;
|
|
225
|
+
/* timeline to read it from, 0 if a lookup is required */
|
|
226
|
+
TimeLineID currTLI;
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
* Safe point to read to in currTLI if current TLI is historical
|
|
230
|
+
* (tliSwitchPoint) or InvalidXLogRecPtr if on current timeline.
|
|
231
|
+
*
|
|
232
|
+
* Actually set to the start of the segment containing the timeline switch
|
|
233
|
+
* that ends currTLI's validity, not the LSN of the switch its self, since
|
|
234
|
+
* we can't assume the old segment will be present.
|
|
235
|
+
*/
|
|
236
|
+
XLogRecPtr currTLIValidUntil;
|
|
237
|
+
|
|
238
|
+
/*
|
|
239
|
+
* If currTLI is not the most recent known timeline, the next timeline to
|
|
240
|
+
* read from when currTLIValidUntil is reached.
|
|
241
|
+
*/
|
|
242
|
+
TimeLineID nextTLI;
|
|
243
|
+
|
|
244
|
+
/*
|
|
245
|
+
* Buffer for current ReadRecord result (expandable), used when a record
|
|
246
|
+
* crosses a page boundary.
|
|
247
|
+
*/
|
|
248
|
+
char *readRecordBuf;
|
|
249
|
+
uint32 readRecordBufSize;
|
|
250
|
+
|
|
251
|
+
/* Buffer to hold error message */
|
|
252
|
+
char *errormsg_buf;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
/* Get a new XLogReader */
|
|
256
|
+
extern XLogReaderState *XLogReaderAllocate(int wal_segment_size,
|
|
257
|
+
const char *waldir,
|
|
258
|
+
XLogReaderRoutine *routine,
|
|
259
|
+
void *private_data);
|
|
260
|
+
extern XLogReaderRoutine *LocalXLogReaderRoutine(void);
|
|
261
|
+
|
|
262
|
+
/* Free an XLogReader */
|
|
263
|
+
extern void XLogReaderFree(XLogReaderState *state);
|
|
264
|
+
|
|
265
|
+
/* Position the XLogReader to given record */
|
|
266
|
+
extern void XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr);
|
|
267
|
+
#ifdef FRONTEND
|
|
268
|
+
extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);
|
|
269
|
+
#endif /* FRONTEND */
|
|
270
|
+
|
|
271
|
+
/* Read the next XLog record. Returns NULL on end-of-WAL or failure */
|
|
272
|
+
extern struct XLogRecord *XLogReadRecord(XLogReaderState *state,
|
|
273
|
+
char **errormsg);
|
|
274
|
+
|
|
275
|
+
/* Validate a page */
|
|
276
|
+
extern bool XLogReaderValidatePageHeader(XLogReaderState *state,
|
|
277
|
+
XLogRecPtr recptr, char *phdr);
|
|
278
|
+
|
|
279
|
+
/*
|
|
280
|
+
* Error information from WALRead that both backend and frontend caller can
|
|
281
|
+
* process. Currently only errors from pg_pread can be reported.
|
|
282
|
+
*/
|
|
283
|
+
typedef struct WALReadError
|
|
284
|
+
{
|
|
285
|
+
int wre_errno; /* errno set by the last pg_pread() */
|
|
286
|
+
int wre_off; /* Offset we tried to read from. */
|
|
287
|
+
int wre_req; /* Bytes requested to be read. */
|
|
288
|
+
int wre_read; /* Bytes read by the last read(). */
|
|
289
|
+
WALOpenSegment wre_seg; /* Segment we tried to read from. */
|
|
290
|
+
} WALReadError;
|
|
291
|
+
|
|
292
|
+
extern bool WALRead(XLogReaderState *state,
|
|
293
|
+
char *buf, XLogRecPtr startptr, Size count,
|
|
294
|
+
TimeLineID tli, WALReadError *errinfo);
|
|
295
|
+
|
|
296
|
+
/* Functions for decoding an XLogRecord */
|
|
297
|
+
|
|
298
|
+
extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,
|
|
299
|
+
char **errmsg);
|
|
300
|
+
|
|
301
|
+
#define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len)
|
|
302
|
+
#define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev)
|
|
303
|
+
#define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info)
|
|
304
|
+
#define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)
|
|
305
|
+
#define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)
|
|
306
|
+
#define XLogRecGetOrigin(decoder) ((decoder)->record_origin)
|
|
307
|
+
#define XLogRecGetData(decoder) ((decoder)->main_data)
|
|
308
|
+
#define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)
|
|
309
|
+
#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)
|
|
310
|
+
#define XLogRecHasBlockRef(decoder, block_id) \
|
|
311
|
+
((decoder)->blocks[block_id].in_use)
|
|
312
|
+
#define XLogRecHasBlockImage(decoder, block_id) \
|
|
313
|
+
((decoder)->blocks[block_id].has_image)
|
|
314
|
+
#define XLogRecBlockImageApply(decoder, block_id) \
|
|
315
|
+
((decoder)->blocks[block_id].apply_image)
|
|
316
|
+
|
|
317
|
+
#ifndef FRONTEND
|
|
318
|
+
extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record);
|
|
319
|
+
#endif
|
|
320
|
+
|
|
321
|
+
extern bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page);
|
|
322
|
+
extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len);
|
|
323
|
+
extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id,
|
|
324
|
+
RelFileNode *rnode, ForkNumber *forknum,
|
|
325
|
+
BlockNumber *blknum);
|
|
326
|
+
|
|
327
|
+
#endif /* XLOGREADER_H */
|