gitlab-pg_query 1.3.1 → 2.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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 */
|