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,161 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* pg_bswap.h
|
|
4
|
+
* Byte swapping.
|
|
5
|
+
*
|
|
6
|
+
* Macros for reversing the byte order of 16, 32 and 64-bit unsigned integers.
|
|
7
|
+
* For example, 0xAABBCCDD becomes 0xDDCCBBAA. These are just wrappers for
|
|
8
|
+
* built-in functions provided by the compiler where support exists.
|
|
9
|
+
*
|
|
10
|
+
* Note that all of these functions accept unsigned integers as arguments and
|
|
11
|
+
* return the same. Use caution when using these wrapper macros with signed
|
|
12
|
+
* integers.
|
|
13
|
+
*
|
|
14
|
+
* Copyright (c) 2015-2020, PostgreSQL Global Development Group
|
|
15
|
+
*
|
|
16
|
+
* src/include/port/pg_bswap.h
|
|
17
|
+
*
|
|
18
|
+
*-------------------------------------------------------------------------
|
|
19
|
+
*/
|
|
20
|
+
#ifndef PG_BSWAP_H
|
|
21
|
+
#define PG_BSWAP_H
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* In all supported versions msvc provides _byteswap_* functions in stdlib.h,
|
|
26
|
+
* already included by c.h.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
/* implementation of uint16 pg_bswap16(uint16) */
|
|
31
|
+
#if defined(HAVE__BUILTIN_BSWAP16)
|
|
32
|
+
|
|
33
|
+
#define pg_bswap16(x) __builtin_bswap16(x)
|
|
34
|
+
|
|
35
|
+
#elif defined(_MSC_VER)
|
|
36
|
+
|
|
37
|
+
#define pg_bswap16(x) _byteswap_ushort(x)
|
|
38
|
+
|
|
39
|
+
#else
|
|
40
|
+
|
|
41
|
+
static inline uint16
|
|
42
|
+
pg_bswap16(uint16 x)
|
|
43
|
+
{
|
|
44
|
+
return
|
|
45
|
+
((x << 8) & 0xff00) |
|
|
46
|
+
((x >> 8) & 0x00ff);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#endif /* HAVE__BUILTIN_BSWAP16 */
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/* implementation of uint32 pg_bswap32(uint32) */
|
|
53
|
+
#if defined(HAVE__BUILTIN_BSWAP32)
|
|
54
|
+
|
|
55
|
+
#define pg_bswap32(x) __builtin_bswap32(x)
|
|
56
|
+
|
|
57
|
+
#elif defined(_MSC_VER)
|
|
58
|
+
|
|
59
|
+
#define pg_bswap32(x) _byteswap_ulong(x)
|
|
60
|
+
|
|
61
|
+
#else
|
|
62
|
+
|
|
63
|
+
static inline uint32
|
|
64
|
+
pg_bswap32(uint32 x)
|
|
65
|
+
{
|
|
66
|
+
return
|
|
67
|
+
((x << 24) & 0xff000000) |
|
|
68
|
+
((x << 8) & 0x00ff0000) |
|
|
69
|
+
((x >> 8) & 0x0000ff00) |
|
|
70
|
+
((x >> 24) & 0x000000ff);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#endif /* HAVE__BUILTIN_BSWAP32 */
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
/* implementation of uint64 pg_bswap64(uint64) */
|
|
77
|
+
#if defined(HAVE__BUILTIN_BSWAP64)
|
|
78
|
+
|
|
79
|
+
#define pg_bswap64(x) __builtin_bswap64(x)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
#elif defined(_MSC_VER)
|
|
83
|
+
|
|
84
|
+
#define pg_bswap64(x) _byteswap_uint64(x)
|
|
85
|
+
|
|
86
|
+
#else
|
|
87
|
+
|
|
88
|
+
static inline uint64
|
|
89
|
+
pg_bswap64(uint64 x)
|
|
90
|
+
{
|
|
91
|
+
return
|
|
92
|
+
((x << 56) & UINT64CONST(0xff00000000000000)) |
|
|
93
|
+
((x << 40) & UINT64CONST(0x00ff000000000000)) |
|
|
94
|
+
((x << 24) & UINT64CONST(0x0000ff0000000000)) |
|
|
95
|
+
((x << 8) & UINT64CONST(0x000000ff00000000)) |
|
|
96
|
+
((x >> 8) & UINT64CONST(0x00000000ff000000)) |
|
|
97
|
+
((x >> 24) & UINT64CONST(0x0000000000ff0000)) |
|
|
98
|
+
((x >> 40) & UINT64CONST(0x000000000000ff00)) |
|
|
99
|
+
((x >> 56) & UINT64CONST(0x00000000000000ff));
|
|
100
|
+
}
|
|
101
|
+
#endif /* HAVE__BUILTIN_BSWAP64 */
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Portable and fast equivalents for ntohs, ntohl, htons, htonl,
|
|
106
|
+
* additionally extended to 64 bits.
|
|
107
|
+
*/
|
|
108
|
+
#ifdef WORDS_BIGENDIAN
|
|
109
|
+
|
|
110
|
+
#define pg_hton16(x) (x)
|
|
111
|
+
#define pg_hton32(x) (x)
|
|
112
|
+
#define pg_hton64(x) (x)
|
|
113
|
+
|
|
114
|
+
#define pg_ntoh16(x) (x)
|
|
115
|
+
#define pg_ntoh32(x) (x)
|
|
116
|
+
#define pg_ntoh64(x) (x)
|
|
117
|
+
|
|
118
|
+
#else
|
|
119
|
+
|
|
120
|
+
#define pg_hton16(x) pg_bswap16(x)
|
|
121
|
+
#define pg_hton32(x) pg_bswap32(x)
|
|
122
|
+
#define pg_hton64(x) pg_bswap64(x)
|
|
123
|
+
|
|
124
|
+
#define pg_ntoh16(x) pg_bswap16(x)
|
|
125
|
+
#define pg_ntoh32(x) pg_bswap32(x)
|
|
126
|
+
#define pg_ntoh64(x) pg_bswap64(x)
|
|
127
|
+
|
|
128
|
+
#endif /* WORDS_BIGENDIAN */
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* Rearrange the bytes of a Datum from big-endian order into the native byte
|
|
133
|
+
* order. On big-endian machines, this does nothing at all. Note that the C
|
|
134
|
+
* type Datum is an unsigned integer type on all platforms.
|
|
135
|
+
*
|
|
136
|
+
* One possible application of the DatumBigEndianToNative() macro is to make
|
|
137
|
+
* bitwise comparisons cheaper. A simple 3-way comparison of Datums
|
|
138
|
+
* transformed by the macro (based on native, unsigned comparisons) will return
|
|
139
|
+
* the same result as a memcmp() of the corresponding original Datums, but can
|
|
140
|
+
* be much cheaper. It's generally safe to do this on big-endian systems
|
|
141
|
+
* without any special transformation occurring first.
|
|
142
|
+
*
|
|
143
|
+
* If SIZEOF_DATUM is not defined, then postgres.h wasn't included and these
|
|
144
|
+
* macros probably shouldn't be used, so we define nothing. Note that
|
|
145
|
+
* SIZEOF_DATUM == 8 would evaluate as 0 == 8 in that case, potentially
|
|
146
|
+
* leading to the wrong implementation being selected and confusing errors, so
|
|
147
|
+
* defining nothing is safest.
|
|
148
|
+
*/
|
|
149
|
+
#ifdef SIZEOF_DATUM
|
|
150
|
+
#ifdef WORDS_BIGENDIAN
|
|
151
|
+
#define DatumBigEndianToNative(x) (x)
|
|
152
|
+
#else /* !WORDS_BIGENDIAN */
|
|
153
|
+
#if SIZEOF_DATUM == 8
|
|
154
|
+
#define DatumBigEndianToNative(x) pg_bswap64(x)
|
|
155
|
+
#else /* SIZEOF_DATUM != 8 */
|
|
156
|
+
#define DatumBigEndianToNative(x) pg_bswap32(x)
|
|
157
|
+
#endif /* SIZEOF_DATUM == 8 */
|
|
158
|
+
#endif /* WORDS_BIGENDIAN */
|
|
159
|
+
#endif /* SIZEOF_DATUM */
|
|
160
|
+
|
|
161
|
+
#endif /* PG_BSWAP_H */
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* pg_crc32c.h
|
|
4
|
+
* Routines for computing CRC-32C checksums.
|
|
5
|
+
*
|
|
6
|
+
* The speed of CRC-32C calculation has a big impact on performance, so we
|
|
7
|
+
* jump through some hoops to get the best implementation for each
|
|
8
|
+
* platform. Some CPU architectures have special instructions for speeding
|
|
9
|
+
* up CRC calculations (e.g. Intel SSE 4.2), on other platforms we use the
|
|
10
|
+
* Slicing-by-8 algorithm which uses lookup tables.
|
|
11
|
+
*
|
|
12
|
+
* The public interface consists of four macros:
|
|
13
|
+
*
|
|
14
|
+
* INIT_CRC32C(crc)
|
|
15
|
+
* Initialize a CRC accumulator
|
|
16
|
+
*
|
|
17
|
+
* COMP_CRC32C(crc, data, len)
|
|
18
|
+
* Accumulate some (more) bytes into a CRC
|
|
19
|
+
*
|
|
20
|
+
* FIN_CRC32C(crc)
|
|
21
|
+
* Finish a CRC calculation
|
|
22
|
+
*
|
|
23
|
+
* EQ_CRC32C(c1, c2)
|
|
24
|
+
* Check for equality of two CRCs.
|
|
25
|
+
*
|
|
26
|
+
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
|
27
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
28
|
+
*
|
|
29
|
+
* src/include/port/pg_crc32c.h
|
|
30
|
+
*
|
|
31
|
+
*-------------------------------------------------------------------------
|
|
32
|
+
*/
|
|
33
|
+
#ifndef PG_CRC32C_H
|
|
34
|
+
#define PG_CRC32C_H
|
|
35
|
+
|
|
36
|
+
#include "port/pg_bswap.h"
|
|
37
|
+
|
|
38
|
+
typedef uint32 pg_crc32c;
|
|
39
|
+
|
|
40
|
+
/* The INIT and EQ macros are the same for all implementations. */
|
|
41
|
+
#define INIT_CRC32C(crc) ((crc) = 0xFFFFFFFF)
|
|
42
|
+
#define EQ_CRC32C(c1, c2) ((c1) == (c2))
|
|
43
|
+
|
|
44
|
+
#if defined(USE_SSE42_CRC32C)
|
|
45
|
+
/* Use Intel SSE4.2 instructions. */
|
|
46
|
+
#define COMP_CRC32C(crc, data, len) \
|
|
47
|
+
((crc) = pg_comp_crc32c_sse42((crc), (data), (len)))
|
|
48
|
+
#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
|
|
49
|
+
|
|
50
|
+
extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);
|
|
51
|
+
|
|
52
|
+
#elif defined(USE_ARMV8_CRC32C)
|
|
53
|
+
/* Use ARMv8 CRC Extension instructions. */
|
|
54
|
+
|
|
55
|
+
#define COMP_CRC32C(crc, data, len) \
|
|
56
|
+
((crc) = pg_comp_crc32c_armv8((crc), (data), (len)))
|
|
57
|
+
#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
|
|
58
|
+
|
|
59
|
+
extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
|
|
60
|
+
|
|
61
|
+
#elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK) || defined(USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK)
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* Use Intel SSE 4.2 or ARMv8 instructions, but perform a runtime check first
|
|
65
|
+
* to check that they are available.
|
|
66
|
+
*/
|
|
67
|
+
#define COMP_CRC32C(crc, data, len) \
|
|
68
|
+
((crc) = pg_comp_crc32c((crc), (data), (len)))
|
|
69
|
+
#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
|
|
70
|
+
|
|
71
|
+
extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);
|
|
72
|
+
extern pg_crc32c (*pg_comp_crc32c) (pg_crc32c crc, const void *data, size_t len);
|
|
73
|
+
|
|
74
|
+
#ifdef USE_SSE42_CRC32C_WITH_RUNTIME_CHECK
|
|
75
|
+
extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);
|
|
76
|
+
#endif
|
|
77
|
+
#ifdef USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK
|
|
78
|
+
extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
|
|
79
|
+
#endif
|
|
80
|
+
|
|
81
|
+
#else
|
|
82
|
+
/*
|
|
83
|
+
* Use slicing-by-8 algorithm.
|
|
84
|
+
*
|
|
85
|
+
* On big-endian systems, the intermediate value is kept in reverse byte
|
|
86
|
+
* order, to avoid byte-swapping during the calculation. FIN_CRC32C reverses
|
|
87
|
+
* the bytes to the final order.
|
|
88
|
+
*/
|
|
89
|
+
#define COMP_CRC32C(crc, data, len) \
|
|
90
|
+
((crc) = pg_comp_crc32c_sb8((crc), (data), (len)))
|
|
91
|
+
#ifdef WORDS_BIGENDIAN
|
|
92
|
+
#define FIN_CRC32C(crc) ((crc) = pg_bswap32(crc) ^ 0xFFFFFFFF)
|
|
93
|
+
#else
|
|
94
|
+
#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
|
|
95
|
+
#endif
|
|
96
|
+
|
|
97
|
+
extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);
|
|
98
|
+
|
|
99
|
+
#endif
|
|
100
|
+
|
|
101
|
+
#endif /* PG_CRC32C_H */
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* instr_time.h
|
|
4
|
+
* portable high-precision interval timing
|
|
5
|
+
*
|
|
6
|
+
* This file provides an abstraction layer to hide portability issues in
|
|
7
|
+
* interval timing. On Unix we use clock_gettime() if available, else
|
|
8
|
+
* gettimeofday(). On Windows, gettimeofday() gives a low-precision result
|
|
9
|
+
* so we must use QueryPerformanceCounter() instead. These macros also give
|
|
10
|
+
* some breathing room to use other high-precision-timing APIs.
|
|
11
|
+
*
|
|
12
|
+
* The basic data type is instr_time, which all callers should treat as an
|
|
13
|
+
* opaque typedef. instr_time can store either an absolute time (of
|
|
14
|
+
* unspecified reference time) or an interval. The operations provided
|
|
15
|
+
* for it are:
|
|
16
|
+
*
|
|
17
|
+
* INSTR_TIME_IS_ZERO(t) is t equal to zero?
|
|
18
|
+
*
|
|
19
|
+
* INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too)
|
|
20
|
+
*
|
|
21
|
+
* INSTR_TIME_SET_CURRENT(t) set t to current time
|
|
22
|
+
*
|
|
23
|
+
* INSTR_TIME_SET_CURRENT_LAZY(t) set t to current time if t is zero,
|
|
24
|
+
* evaluates to whether t changed
|
|
25
|
+
*
|
|
26
|
+
* INSTR_TIME_ADD(x, y) x += y
|
|
27
|
+
*
|
|
28
|
+
* INSTR_TIME_SUBTRACT(x, y) x -= y
|
|
29
|
+
*
|
|
30
|
+
* INSTR_TIME_ACCUM_DIFF(x, y, z) x += (y - z)
|
|
31
|
+
*
|
|
32
|
+
* INSTR_TIME_GET_DOUBLE(t) convert t to double (in seconds)
|
|
33
|
+
*
|
|
34
|
+
* INSTR_TIME_GET_MILLISEC(t) convert t to double (in milliseconds)
|
|
35
|
+
*
|
|
36
|
+
* INSTR_TIME_GET_MICROSEC(t) convert t to uint64 (in microseconds)
|
|
37
|
+
*
|
|
38
|
+
* Note that INSTR_TIME_SUBTRACT and INSTR_TIME_ACCUM_DIFF convert
|
|
39
|
+
* absolute times to intervals. The INSTR_TIME_GET_xxx operations are
|
|
40
|
+
* only useful on intervals.
|
|
41
|
+
*
|
|
42
|
+
* When summing multiple measurements, it's recommended to leave the
|
|
43
|
+
* running sum in instr_time form (ie, use INSTR_TIME_ADD or
|
|
44
|
+
* INSTR_TIME_ACCUM_DIFF) and convert to a result format only at the end.
|
|
45
|
+
*
|
|
46
|
+
* Beware of multiple evaluations of the macro arguments.
|
|
47
|
+
*
|
|
48
|
+
*
|
|
49
|
+
* Copyright (c) 2001-2020, PostgreSQL Global Development Group
|
|
50
|
+
*
|
|
51
|
+
* src/include/portability/instr_time.h
|
|
52
|
+
*
|
|
53
|
+
*-------------------------------------------------------------------------
|
|
54
|
+
*/
|
|
55
|
+
#ifndef INSTR_TIME_H
|
|
56
|
+
#define INSTR_TIME_H
|
|
57
|
+
|
|
58
|
+
#ifndef WIN32
|
|
59
|
+
|
|
60
|
+
#ifdef HAVE_CLOCK_GETTIME
|
|
61
|
+
|
|
62
|
+
/* Use clock_gettime() */
|
|
63
|
+
|
|
64
|
+
#include <time.h>
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* The best clockid to use according to the POSIX spec is CLOCK_MONOTONIC,
|
|
68
|
+
* since that will give reliable interval timing even in the face of changes
|
|
69
|
+
* to the system clock. However, POSIX doesn't require implementations to
|
|
70
|
+
* provide anything except CLOCK_REALTIME, so fall back to that if we don't
|
|
71
|
+
* find CLOCK_MONOTONIC.
|
|
72
|
+
*
|
|
73
|
+
* Also, some implementations have nonstandard clockids with better properties
|
|
74
|
+
* than CLOCK_MONOTONIC. In particular, as of macOS 10.12, Apple provides
|
|
75
|
+
* CLOCK_MONOTONIC_RAW which is both faster to read and higher resolution than
|
|
76
|
+
* their version of CLOCK_MONOTONIC.
|
|
77
|
+
*/
|
|
78
|
+
#if defined(__darwin__) && defined(CLOCK_MONOTONIC_RAW)
|
|
79
|
+
#define PG_INSTR_CLOCK CLOCK_MONOTONIC_RAW
|
|
80
|
+
#elif defined(CLOCK_MONOTONIC)
|
|
81
|
+
#define PG_INSTR_CLOCK CLOCK_MONOTONIC
|
|
82
|
+
#else
|
|
83
|
+
#define PG_INSTR_CLOCK CLOCK_REALTIME
|
|
84
|
+
#endif
|
|
85
|
+
|
|
86
|
+
typedef struct timespec instr_time;
|
|
87
|
+
|
|
88
|
+
#define INSTR_TIME_IS_ZERO(t) ((t).tv_nsec == 0 && (t).tv_sec == 0)
|
|
89
|
+
|
|
90
|
+
#define INSTR_TIME_SET_ZERO(t) ((t).tv_sec = 0, (t).tv_nsec = 0)
|
|
91
|
+
|
|
92
|
+
#define INSTR_TIME_SET_CURRENT(t) ((void) clock_gettime(PG_INSTR_CLOCK, &(t)))
|
|
93
|
+
|
|
94
|
+
#define INSTR_TIME_ADD(x,y) \
|
|
95
|
+
do { \
|
|
96
|
+
(x).tv_sec += (y).tv_sec; \
|
|
97
|
+
(x).tv_nsec += (y).tv_nsec; \
|
|
98
|
+
/* Normalize */ \
|
|
99
|
+
while ((x).tv_nsec >= 1000000000) \
|
|
100
|
+
{ \
|
|
101
|
+
(x).tv_nsec -= 1000000000; \
|
|
102
|
+
(x).tv_sec++; \
|
|
103
|
+
} \
|
|
104
|
+
} while (0)
|
|
105
|
+
|
|
106
|
+
#define INSTR_TIME_SUBTRACT(x,y) \
|
|
107
|
+
do { \
|
|
108
|
+
(x).tv_sec -= (y).tv_sec; \
|
|
109
|
+
(x).tv_nsec -= (y).tv_nsec; \
|
|
110
|
+
/* Normalize */ \
|
|
111
|
+
while ((x).tv_nsec < 0) \
|
|
112
|
+
{ \
|
|
113
|
+
(x).tv_nsec += 1000000000; \
|
|
114
|
+
(x).tv_sec--; \
|
|
115
|
+
} \
|
|
116
|
+
} while (0)
|
|
117
|
+
|
|
118
|
+
#define INSTR_TIME_ACCUM_DIFF(x,y,z) \
|
|
119
|
+
do { \
|
|
120
|
+
(x).tv_sec += (y).tv_sec - (z).tv_sec; \
|
|
121
|
+
(x).tv_nsec += (y).tv_nsec - (z).tv_nsec; \
|
|
122
|
+
/* Normalize after each add to avoid overflow/underflow of tv_nsec */ \
|
|
123
|
+
while ((x).tv_nsec < 0) \
|
|
124
|
+
{ \
|
|
125
|
+
(x).tv_nsec += 1000000000; \
|
|
126
|
+
(x).tv_sec--; \
|
|
127
|
+
} \
|
|
128
|
+
while ((x).tv_nsec >= 1000000000) \
|
|
129
|
+
{ \
|
|
130
|
+
(x).tv_nsec -= 1000000000; \
|
|
131
|
+
(x).tv_sec++; \
|
|
132
|
+
} \
|
|
133
|
+
} while (0)
|
|
134
|
+
|
|
135
|
+
#define INSTR_TIME_GET_DOUBLE(t) \
|
|
136
|
+
(((double) (t).tv_sec) + ((double) (t).tv_nsec) / 1000000000.0)
|
|
137
|
+
|
|
138
|
+
#define INSTR_TIME_GET_MILLISEC(t) \
|
|
139
|
+
(((double) (t).tv_sec * 1000.0) + ((double) (t).tv_nsec) / 1000000.0)
|
|
140
|
+
|
|
141
|
+
#define INSTR_TIME_GET_MICROSEC(t) \
|
|
142
|
+
(((uint64) (t).tv_sec * (uint64) 1000000) + (uint64) ((t).tv_nsec / 1000))
|
|
143
|
+
|
|
144
|
+
#else /* !HAVE_CLOCK_GETTIME */
|
|
145
|
+
|
|
146
|
+
/* Use gettimeofday() */
|
|
147
|
+
|
|
148
|
+
#include <sys/time.h>
|
|
149
|
+
|
|
150
|
+
typedef struct timeval instr_time;
|
|
151
|
+
|
|
152
|
+
#define INSTR_TIME_IS_ZERO(t) ((t).tv_usec == 0 && (t).tv_sec == 0)
|
|
153
|
+
|
|
154
|
+
#define INSTR_TIME_SET_ZERO(t) ((t).tv_sec = 0, (t).tv_usec = 0)
|
|
155
|
+
|
|
156
|
+
#define INSTR_TIME_SET_CURRENT(t) gettimeofday(&(t), NULL)
|
|
157
|
+
|
|
158
|
+
#define INSTR_TIME_ADD(x,y) \
|
|
159
|
+
do { \
|
|
160
|
+
(x).tv_sec += (y).tv_sec; \
|
|
161
|
+
(x).tv_usec += (y).tv_usec; \
|
|
162
|
+
/* Normalize */ \
|
|
163
|
+
while ((x).tv_usec >= 1000000) \
|
|
164
|
+
{ \
|
|
165
|
+
(x).tv_usec -= 1000000; \
|
|
166
|
+
(x).tv_sec++; \
|
|
167
|
+
} \
|
|
168
|
+
} while (0)
|
|
169
|
+
|
|
170
|
+
#define INSTR_TIME_SUBTRACT(x,y) \
|
|
171
|
+
do { \
|
|
172
|
+
(x).tv_sec -= (y).tv_sec; \
|
|
173
|
+
(x).tv_usec -= (y).tv_usec; \
|
|
174
|
+
/* Normalize */ \
|
|
175
|
+
while ((x).tv_usec < 0) \
|
|
176
|
+
{ \
|
|
177
|
+
(x).tv_usec += 1000000; \
|
|
178
|
+
(x).tv_sec--; \
|
|
179
|
+
} \
|
|
180
|
+
} while (0)
|
|
181
|
+
|
|
182
|
+
#define INSTR_TIME_ACCUM_DIFF(x,y,z) \
|
|
183
|
+
do { \
|
|
184
|
+
(x).tv_sec += (y).tv_sec - (z).tv_sec; \
|
|
185
|
+
(x).tv_usec += (y).tv_usec - (z).tv_usec; \
|
|
186
|
+
/* Normalize after each add to avoid overflow/underflow of tv_usec */ \
|
|
187
|
+
while ((x).tv_usec < 0) \
|
|
188
|
+
{ \
|
|
189
|
+
(x).tv_usec += 1000000; \
|
|
190
|
+
(x).tv_sec--; \
|
|
191
|
+
} \
|
|
192
|
+
while ((x).tv_usec >= 1000000) \
|
|
193
|
+
{ \
|
|
194
|
+
(x).tv_usec -= 1000000; \
|
|
195
|
+
(x).tv_sec++; \
|
|
196
|
+
} \
|
|
197
|
+
} while (0)
|
|
198
|
+
|
|
199
|
+
#define INSTR_TIME_GET_DOUBLE(t) \
|
|
200
|
+
(((double) (t).tv_sec) + ((double) (t).tv_usec) / 1000000.0)
|
|
201
|
+
|
|
202
|
+
#define INSTR_TIME_GET_MILLISEC(t) \
|
|
203
|
+
(((double) (t).tv_sec * 1000.0) + ((double) (t).tv_usec) / 1000.0)
|
|
204
|
+
|
|
205
|
+
#define INSTR_TIME_GET_MICROSEC(t) \
|
|
206
|
+
(((uint64) (t).tv_sec * (uint64) 1000000) + (uint64) (t).tv_usec)
|
|
207
|
+
|
|
208
|
+
#endif /* HAVE_CLOCK_GETTIME */
|
|
209
|
+
|
|
210
|
+
#else /* WIN32 */
|
|
211
|
+
|
|
212
|
+
/* Use QueryPerformanceCounter() */
|
|
213
|
+
|
|
214
|
+
typedef LARGE_INTEGER instr_time;
|
|
215
|
+
|
|
216
|
+
#define INSTR_TIME_IS_ZERO(t) ((t).QuadPart == 0)
|
|
217
|
+
|
|
218
|
+
#define INSTR_TIME_SET_ZERO(t) ((t).QuadPart = 0)
|
|
219
|
+
|
|
220
|
+
#define INSTR_TIME_SET_CURRENT(t) QueryPerformanceCounter(&(t))
|
|
221
|
+
|
|
222
|
+
#define INSTR_TIME_ADD(x,y) \
|
|
223
|
+
((x).QuadPart += (y).QuadPart)
|
|
224
|
+
|
|
225
|
+
#define INSTR_TIME_SUBTRACT(x,y) \
|
|
226
|
+
((x).QuadPart -= (y).QuadPart)
|
|
227
|
+
|
|
228
|
+
#define INSTR_TIME_ACCUM_DIFF(x,y,z) \
|
|
229
|
+
((x).QuadPart += (y).QuadPart - (z).QuadPart)
|
|
230
|
+
|
|
231
|
+
#define INSTR_TIME_GET_DOUBLE(t) \
|
|
232
|
+
(((double) (t).QuadPart) / GetTimerFrequency())
|
|
233
|
+
|
|
234
|
+
#define INSTR_TIME_GET_MILLISEC(t) \
|
|
235
|
+
(((double) (t).QuadPart * 1000.0) / GetTimerFrequency())
|
|
236
|
+
|
|
237
|
+
#define INSTR_TIME_GET_MICROSEC(t) \
|
|
238
|
+
((uint64) (((double) (t).QuadPart * 1000000.0) / GetTimerFrequency()))
|
|
239
|
+
|
|
240
|
+
static inline double
|
|
241
|
+
GetTimerFrequency(void)
|
|
242
|
+
{
|
|
243
|
+
LARGE_INTEGER f;
|
|
244
|
+
|
|
245
|
+
QueryPerformanceFrequency(&f);
|
|
246
|
+
return (double) f.QuadPart;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#endif /* WIN32 */
|
|
250
|
+
|
|
251
|
+
/* same macro on all platforms */
|
|
252
|
+
|
|
253
|
+
#define INSTR_TIME_SET_CURRENT_LAZY(t) \
|
|
254
|
+
(INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false)
|
|
255
|
+
|
|
256
|
+
#endif /* INSTR_TIME_H */
|