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
data/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# pg_query [ ](https://rubygems.org/gems/pg_query) [ ](https://rubygems.org/gems/pg_query)
|
|
1
|
+
# pg_query [ ](https://rubygems.org/gems/pg_query) [ ](https://rubygems.org/gems/pg_query)
|
|
2
2
|
|
|
3
3
|
This Ruby extension uses the actual PostgreSQL server source to parse SQL queries and return the internal PostgreSQL parsetree.
|
|
4
4
|
|
|
5
5
|
In addition the extension allows you to normalize queries (replacing constant values with ?) and parse these normalized queries into a parsetree again.
|
|
6
6
|
|
|
7
|
-
When you build this extension, it builds parts of the PostgreSQL server source (see [libpg_query](https://github.com/
|
|
7
|
+
When you build this extension, it builds parts of the PostgreSQL server source (see [libpg_query](https://github.com/pganalyze/libpg_query)), and then statically links it into this extension.
|
|
8
8
|
|
|
9
9
|
This is slightly crazy, but is the only reliable way of parsing all valid PostgreSQL queries.
|
|
10
10
|
|
|
@@ -25,17 +25,49 @@ Due to compiling parts of PostgreSQL, installation might take a while on slower
|
|
|
25
25
|
```ruby
|
|
26
26
|
PgQuery.parse("SELECT 1")
|
|
27
27
|
|
|
28
|
-
=> #<PgQuery:
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
=> #<PgQuery::ParserResult:0x00007fb69a958820
|
|
29
|
+
@query="SELECT 1",
|
|
30
|
+
@tree=<PgQuery::ParseResult:
|
|
31
|
+
version: 130002,
|
|
32
|
+
stmts: [
|
|
33
|
+
<PgQuery::RawStmt:
|
|
34
|
+
stmt: <PgQuery::Node:
|
|
35
|
+
select_stmt: <PgQuery::SelectStmt:
|
|
36
|
+
distinct_clause: [],
|
|
37
|
+
target_list: [
|
|
38
|
+
<PgQuery::Node:
|
|
39
|
+
res_target: <PgQuery::ResTarget:
|
|
40
|
+
name: "",
|
|
41
|
+
indirection: [],
|
|
42
|
+
val: <PgQuery::Node:
|
|
43
|
+
a_const: <PgQuery::A_Const:
|
|
44
|
+
val: <PgQuery::Node:
|
|
45
|
+
integer: <PgQuery::Integer: ival: 1>
|
|
46
|
+
>,
|
|
47
|
+
location: 7
|
|
48
|
+
>
|
|
49
|
+
>,
|
|
50
|
+
location: 7
|
|
51
|
+
>
|
|
52
|
+
>
|
|
53
|
+
],
|
|
54
|
+
from_clause: [],
|
|
55
|
+
group_clause: [],
|
|
56
|
+
window_clause: [],
|
|
57
|
+
values_lists: [],
|
|
58
|
+
sort_clause: [],
|
|
59
|
+
limit_option: :LIMIT_OPTION_DEFAULT,
|
|
60
|
+
locking_clause: [],
|
|
61
|
+
op: :SETOP_NONE,
|
|
62
|
+
all: false
|
|
63
|
+
>
|
|
64
|
+
>,
|
|
65
|
+
stmt_location: 0,
|
|
66
|
+
stmt_len: 0
|
|
67
|
+
>
|
|
68
|
+
]
|
|
69
|
+
>,
|
|
70
|
+
@warnings=[]>
|
|
39
71
|
```
|
|
40
72
|
|
|
41
73
|
### Modifying a parsed query and turning it into SQL again
|
|
@@ -43,35 +75,14 @@ PgQuery.parse("SELECT 1")
|
|
|
43
75
|
```ruby
|
|
44
76
|
parsed_query = PgQuery.parse("SELECT * FROM users")
|
|
45
77
|
|
|
46
|
-
=> #<PgQuery:0x007ff3e956c8b0
|
|
47
|
-
@tree=
|
|
48
|
-
[{"SelectStmt"=>
|
|
49
|
-
{"targetList"=>
|
|
50
|
-
[{"ResTarget"=>
|
|
51
|
-
{"val"=>
|
|
52
|
-
{"ColumnRef"=> {"fields"=>[{"A_Star"=>{}}], "location"=>7}},
|
|
53
|
-
"location"=>7}
|
|
54
|
-
}],
|
|
55
|
-
"fromClause"=>
|
|
56
|
-
[{"RangeVar"=>
|
|
57
|
-
{"relname"=>"users",
|
|
58
|
-
"inhOpt"=>2,
|
|
59
|
-
"relpersistence"=>"p",
|
|
60
|
-
"location"=>14}}],
|
|
61
|
-
}}],
|
|
62
|
-
@query="SELECT * FROM users",
|
|
63
|
-
@warnings=[]>
|
|
64
|
-
|
|
65
78
|
# Modify the parse tree in some way
|
|
66
|
-
parsed_query.tree[0][
|
|
79
|
+
parsed_query.tree.stmts[0].stmt.select_stmt.from_clause[0].range_var.relname = 'other_users'
|
|
67
80
|
|
|
68
81
|
# Turn it into SQL again
|
|
69
82
|
parsed_query.deparse
|
|
70
|
-
=> "SELECT * FROM
|
|
83
|
+
=> "SELECT * FROM other_users"
|
|
71
84
|
```
|
|
72
85
|
|
|
73
|
-
Note: The deparsing feature is experimental and does not support outputting all SQL yet.
|
|
74
|
-
|
|
75
86
|
### Parsing a normalized query
|
|
76
87
|
|
|
77
88
|
```ruby
|
|
@@ -83,29 +94,10 @@ PgQuery.normalize("SELECT 1 FROM x WHERE y = 'foo'")
|
|
|
83
94
|
# Parsing a normalized query (pre-Postgres 10 style)
|
|
84
95
|
PgQuery.parse("SELECT ? FROM x WHERE y = ?")
|
|
85
96
|
|
|
86
|
-
=> #<PgQuery:
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
[{"ResTarget"=>
|
|
91
|
-
{"val"=>{"ParamRef"=>{"location"=>7}},
|
|
92
|
-
"location"=>7}}],
|
|
93
|
-
"fromClause"=>
|
|
94
|
-
[{"RangeVar"=>
|
|
95
|
-
{"relname"=>"x",
|
|
96
|
-
"inhOpt"=>2,
|
|
97
|
-
"relpersistence"=>"p",
|
|
98
|
-
"location"=>14}}],
|
|
99
|
-
"whereClause"=>
|
|
100
|
-
{"A_Expr"=>
|
|
101
|
-
{"kind"=>0,
|
|
102
|
-
"name"=>[{"String"=>{"str"=>"="}}],
|
|
103
|
-
"lexpr"=>{"ColumnRef"=>{"fields"=>[{"String"=>{"str"=>"y"}}], "location"=>22}},
|
|
104
|
-
"rexpr"=>{"ParamRef"=>{"location"=>26}},
|
|
105
|
-
"location"=>24}},
|
|
106
|
-
}}],
|
|
107
|
-
@query="SELECT ? FROM x WHERE y = ?",
|
|
108
|
-
@warnings=[]>
|
|
97
|
+
=> #<PgQuery::ParserResult:0x00007fb69a97a5d8
|
|
98
|
+
@query="SELECT ? FROM x WHERE y = ?",
|
|
99
|
+
@tree=<PgQuery::ParseResult: ...>,
|
|
100
|
+
@warnings=[]>
|
|
109
101
|
```
|
|
110
102
|
|
|
111
103
|
### Extracting tables from a query
|
|
@@ -129,21 +121,33 @@ PgQuery.parse("SELECT ? FROM x WHERE x.y = ? AND z = ?").filter_columns
|
|
|
129
121
|
```ruby
|
|
130
122
|
PgQuery.parse("SELECT 1").fingerprint
|
|
131
123
|
|
|
132
|
-
=> "
|
|
124
|
+
=> "50fde20626009aba"
|
|
133
125
|
|
|
134
126
|
PgQuery.parse("SELECT 2; --- comment").fingerprint
|
|
135
127
|
|
|
136
|
-
=> "
|
|
128
|
+
=> "50fde20626009aba"
|
|
137
129
|
|
|
138
|
-
# Faster fingerprint method that is implemented inside the native library
|
|
130
|
+
# Faster fingerprint method that is implemented inside the native C library
|
|
139
131
|
PgQuery.fingerprint("SELECT ?")
|
|
140
132
|
|
|
141
|
-
=> "
|
|
133
|
+
=> "50fde20626009aba"
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Scanning a query into tokens
|
|
137
|
+
|
|
138
|
+
```ruby
|
|
139
|
+
PgQuery.scan('SELECT 1 --comment')
|
|
140
|
+
|
|
141
|
+
=> [<PgQuery::ScanResult: version: 130002, tokens: [
|
|
142
|
+
<PgQuery::ScanToken: start: 0, end: 6, token: :SELECT, keyword_kind: :RESERVED_KEYWORD>,
|
|
143
|
+
<PgQuery::ScanToken: start: 7, end: 8, token: :ICONST, keyword_kind: :NO_KEYWORD>,
|
|
144
|
+
<PgQuery::ScanToken: start: 9, end: 18, token: :SQL_COMMENT, keyword_kind: :NO_KEYWORD>]>,
|
|
145
|
+
[]]
|
|
142
146
|
```
|
|
143
147
|
|
|
144
148
|
## Differences from Upstream PostgreSQL
|
|
145
149
|
|
|
146
|
-
This gem is based on [libpg_query](https://github.com/
|
|
150
|
+
This gem is based on [libpg_query](https://github.com/pganalyze/libpg_query),
|
|
147
151
|
which uses the latest stable PostgreSQL version, but with a patch applied
|
|
148
152
|
to support parsing normalized queries containing `?` replacement characters.
|
|
149
153
|
|
|
@@ -151,15 +155,34 @@ to support parsing normalized queries containing `?` replacement characters.
|
|
|
151
155
|
|
|
152
156
|
Currently tested and officially supported Ruby versions:
|
|
153
157
|
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
+
* CRuby 2.5
|
|
159
|
+
* CRuby 2.6
|
|
160
|
+
* CRuby 2.7
|
|
161
|
+
* CRuby 3.0
|
|
162
|
+
|
|
163
|
+
Not supported:
|
|
164
|
+
|
|
165
|
+
* JRuby: `pg_query` relies on a C extension, which is discouraged / not properly supported for JRuby
|
|
166
|
+
* TruffleRuby: GraalVM [does not support sigjmp](https://www.graalvm.org/reference-manual/llvm/NativeExecution/), which is used by the Postgres error handling code (`pg_query` uses a copy of the Postgres parser & error handling code)
|
|
167
|
+
|
|
168
|
+
## Developer tasks
|
|
169
|
+
|
|
170
|
+
### Update libpg_query source
|
|
171
|
+
|
|
172
|
+
In order to update to a newer Postgres parser, first update [libpg_query](https://github.com/pganalyze/libpg_query) to the new Postgres version and tag a release.
|
|
173
|
+
|
|
174
|
+
Once that is done, follow the following steps:
|
|
175
|
+
|
|
176
|
+
1. Update `LIB_PG_QUERY_TAG` and `LIB_PG_QUERY_SHA256SUM` in `Rakefile`
|
|
177
|
+
|
|
178
|
+
2. Run `rake update_source` to update the source code
|
|
179
|
+
|
|
180
|
+
3. Commit the `Rakefile` and the modified files in `ext/pg_query` to this source tree and make a PR
|
|
158
181
|
|
|
159
182
|
|
|
160
183
|
## Resources
|
|
161
184
|
|
|
162
|
-
See [libpg_query](https://github.com/
|
|
185
|
+
See [libpg_query](https://github.com/pganalyze/libpg_query/blob/13-latest/README.md#resources) for pg_query in other languages, as well as products/tools built on pg_query.
|
|
163
186
|
|
|
164
187
|
## Original Author
|
|
165
188
|
|
data/Rakefile
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
require 'bundler/gem_tasks'
|
|
2
|
+
require 'rake/clean'
|
|
2
3
|
require 'rake/extensiontask'
|
|
3
4
|
require 'rspec/core/rake_task'
|
|
4
5
|
require 'rubocop/rake_task'
|
|
6
|
+
require 'open-uri'
|
|
7
|
+
|
|
8
|
+
LIB_PG_QUERY_TAG = '13-2.0.4'.freeze
|
|
9
|
+
LIB_PG_QUERY_SHA256SUM = 'a67ef3e3b6c9cb1297f362888d6660dac165d3b020f78d23afe4293b8ceaf190'.freeze
|
|
5
10
|
|
|
6
11
|
Rake::ExtensionTask.new 'pg_query' do |ext|
|
|
7
12
|
ext.lib_dir = 'lib/pg_query'
|
|
@@ -12,12 +17,87 @@ RuboCop::RakeTask.new
|
|
|
12
17
|
|
|
13
18
|
task spec: :compile
|
|
14
19
|
|
|
15
|
-
task default: %i[lint
|
|
20
|
+
task default: %i[spec lint]
|
|
16
21
|
task test: :spec
|
|
17
22
|
task lint: :rubocop
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
CLEAN << 'tmp/**/*'
|
|
25
|
+
CLEAN << 'ext/pg_query/*.o'
|
|
26
|
+
CLEAN << 'lib/pg_query/pg_query.bundle'
|
|
27
|
+
|
|
28
|
+
task :update_source do
|
|
29
|
+
workdir = File.join(__dir__, 'tmp')
|
|
30
|
+
libdir = File.join(workdir, 'libpg_query-' + LIB_PG_QUERY_TAG)
|
|
31
|
+
filename = File.join(workdir, 'libpg_query-' + LIB_PG_QUERY_TAG + '.tar.gz')
|
|
32
|
+
testfilesdir = File.join(__dir__, 'spec/files')
|
|
33
|
+
extdir = File.join(__dir__, 'ext/pg_query')
|
|
34
|
+
extbakdir = File.join(workdir, 'extbak')
|
|
35
|
+
|
|
36
|
+
unless File.exist?(filename)
|
|
37
|
+
system("mkdir -p #{workdir}")
|
|
38
|
+
File.open(filename, 'wb') do |target_file|
|
|
39
|
+
URI.open('https://codeload.github.com/pganalyze/libpg_query/tar.gz/' + LIB_PG_QUERY_TAG, 'rb') do |read_file|
|
|
40
|
+
target_file.write(read_file.read)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
checksum = Digest::SHA256.hexdigest(File.read(filename))
|
|
45
|
+
|
|
46
|
+
if checksum != LIB_PG_QUERY_SHA256SUM
|
|
47
|
+
raise "SHA256 of #{filename} does not match: got #{checksum}, expected #{LIB_PG_QUERY_SHA256SUM}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
unless Dir.exist?(libdir)
|
|
52
|
+
system("tar -xzf #{filename} -C #{workdir}") || raise('ERROR')
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Backup important files from ext dir
|
|
56
|
+
system("rm -fr #{extbakdir}")
|
|
57
|
+
system("mkdir -p #{extbakdir}")
|
|
58
|
+
system("cp -a #{extdir}/pg_query_ruby.{c,sym} #{extdir}/extconf.rb #{extbakdir}")
|
|
59
|
+
|
|
60
|
+
FileUtils.rm_rf extdir
|
|
61
|
+
|
|
62
|
+
# Reduce everything down to one directory
|
|
63
|
+
system("mkdir -p #{extdir}")
|
|
64
|
+
system("cp -a #{libdir}/src/* #{extdir}/")
|
|
65
|
+
system("mv #{extdir}/postgres/* #{extdir}/")
|
|
66
|
+
system("rmdir #{extdir}/postgres")
|
|
67
|
+
system("cp -a #{libdir}/pg_query.h #{extdir}/include")
|
|
68
|
+
# Make sure every .c file in the top-level directory is its own translation unit
|
|
69
|
+
system("mv #{extdir}/*{_conds,_defs,_helper}.c #{extdir}/include")
|
|
70
|
+
# Protobuf definitions
|
|
71
|
+
system("protoc --proto_path=#{libdir}/protobuf --ruby_out=#{File.join(__dir__, 'lib/pg_query')} #{libdir}/protobuf/pg_query.proto")
|
|
72
|
+
system("mkdir -p #{extdir}/include/protobuf")
|
|
73
|
+
system("cp -a #{libdir}/protobuf/*.h #{extdir}/include/protobuf")
|
|
74
|
+
system("cp -a #{libdir}/protobuf/*.c #{extdir}/")
|
|
75
|
+
# Protobuf library code
|
|
76
|
+
system("mkdir -p #{extdir}/include/protobuf-c")
|
|
77
|
+
system("cp -a #{libdir}/vendor/protobuf-c/*.h #{extdir}/include")
|
|
78
|
+
system("cp -a #{libdir}/vendor/protobuf-c/*.h #{extdir}/include/protobuf-c")
|
|
79
|
+
system("cp -a #{libdir}/vendor/protobuf-c/*.c #{extdir}/")
|
|
80
|
+
# xxhash library code
|
|
81
|
+
system("mkdir -p #{extdir}/include/xxhash")
|
|
82
|
+
system("cp -a #{libdir}/vendor/xxhash/*.h #{extdir}/include")
|
|
83
|
+
system("cp -a #{libdir}/vendor/xxhash/*.h #{extdir}/include/xxhash")
|
|
84
|
+
system("cp -a #{libdir}/vendor/xxhash/*.c #{extdir}/")
|
|
85
|
+
# Other support files
|
|
86
|
+
system("cp -a #{libdir}/testdata/* #{testfilesdir}")
|
|
87
|
+
# Copy back the custom ext files
|
|
88
|
+
system("cp -a #{extbakdir}/pg_query_ruby.{c,sym} #{extbakdir}/extconf.rb #{extdir}")
|
|
89
|
+
|
|
90
|
+
# Generate JSON field name helper (workaround until https://github.com/protocolbuffers/protobuf/pull/8356 is merged)
|
|
91
|
+
str = "module PgQuery\n INTERNAL_PROTO_FIELD_NAME_TO_JSON_NAME = {\n"
|
|
92
|
+
cur_type = nil
|
|
93
|
+
File.read(File.join(libdir, 'protobuf/pg_query.proto')).each_line do |line|
|
|
94
|
+
if line[/^message (\w+)/]
|
|
95
|
+
cur_type = $1
|
|
96
|
+
next
|
|
97
|
+
end
|
|
98
|
+
next unless line[/(repeated )?\w+ (\w+) = \d+( \[json_name="(\w+)"\])?;/]
|
|
99
|
+
str += format(" [%s, :%s] => '%s',\n", cur_type, $2, $4 || $2)
|
|
100
|
+
end
|
|
101
|
+
str += " }\nend\n"
|
|
102
|
+
File.write(File.join(__dir__, 'lib/pg_query/json_field_names.rb'), str)
|
|
23
103
|
end
|
data/ext/pg_query/extconf.rb
CHANGED
|
@@ -3,48 +3,11 @@
|
|
|
3
3
|
require 'digest'
|
|
4
4
|
require 'mkmf'
|
|
5
5
|
require 'open-uri'
|
|
6
|
+
require 'pathname'
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
$objs = Dir.glob(File.join(__dir__, '*.c')).map { |f| Pathname.new(f).sub_ext('.o').to_s }
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
libdir = File.join(workdir, 'libpg_query-' + LIB_PG_QUERY_TAG)
|
|
11
|
-
gemdir = File.join(__dir__, '../..')
|
|
12
|
-
libfile = libdir + '/libpg_query.a'
|
|
13
|
-
|
|
14
|
-
expected_sha256 = '1332761f31c198cb9825e6ccccda0b6a0e57daeb824870e8524df77f1592d149'
|
|
15
|
-
filename = "#{workdir}/libpg_query.tar.gz"
|
|
16
|
-
|
|
17
|
-
unless File.exist?(filename)
|
|
18
|
-
File.open(filename, 'wb') do |target_file|
|
|
19
|
-
URI.open('https://codeload.github.com/lfittl/libpg_query/tar.gz/' + LIB_PG_QUERY_TAG, 'rb') do |read_file|
|
|
20
|
-
target_file.write(read_file.read)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
checksum = Digest::SHA256.hexdigest(File.read(filename))
|
|
25
|
-
|
|
26
|
-
if checksum != expected_sha256
|
|
27
|
-
raise "SHA256 of #{filename} does not match: got #{checksum}, expected #{expected_sha256}"
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
unless Dir.exist?(libdir)
|
|
32
|
-
system("tar -xzf #{filename}") || raise('ERROR')
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
unless Dir.exist?(libfile)
|
|
36
|
-
# Build libpg_query (and parts of PostgreSQL)
|
|
37
|
-
system("cd #{libdir}; #{ENV['MAKE'] || (RUBY_PLATFORM =~ /bsd/ ? 'gmake' : 'make')} build")
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Copy test files (this intentionally overwrites existing files!)
|
|
41
|
-
system("cp #{libdir}/testdata/* #{gemdir}/spec/files/")
|
|
42
|
-
|
|
43
|
-
$objs = ['pg_query_ruby.o']
|
|
44
|
-
|
|
45
|
-
$LOCAL_LIBS << '-lpg_query'
|
|
46
|
-
$LIBPATH << libdir
|
|
47
|
-
$CFLAGS << " -I #{libdir} -O3 -Wall -fno-strict-aliasing -fwrapv -g"
|
|
10
|
+
$CFLAGS << " -I#{File.join(__dir__, 'include')} -O3 -Wall -fno-strict-aliasing -fwrapv -fstack-protector -Wno-unused-function -Wno-unused-variable -g"
|
|
48
11
|
|
|
49
12
|
SYMFILE = File.join(__dir__, 'pg_query_ruby.sym')
|
|
50
13
|
if RUBY_PLATFORM =~ /darwin/
|
|
File without changes
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* amapi.h
|
|
4
|
+
* API for Postgres index access methods.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2015-2020, PostgreSQL Global Development Group
|
|
7
|
+
*
|
|
8
|
+
* src/include/access/amapi.h
|
|
9
|
+
*
|
|
10
|
+
*-------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
#ifndef AMAPI_H
|
|
13
|
+
#define AMAPI_H
|
|
14
|
+
|
|
15
|
+
#include "access/genam.h"
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* We don't wish to include planner header files here, since most of an index
|
|
19
|
+
* AM's implementation isn't concerned with those data structures. To allow
|
|
20
|
+
* declaring amcostestimate_function here, use forward struct references.
|
|
21
|
+
*/
|
|
22
|
+
struct PlannerInfo;
|
|
23
|
+
struct IndexPath;
|
|
24
|
+
|
|
25
|
+
/* Likewise, this file shouldn't depend on execnodes.h. */
|
|
26
|
+
struct IndexInfo;
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Properties for amproperty API. This list covers properties known to the
|
|
31
|
+
* core code, but an index AM can define its own properties, by matching the
|
|
32
|
+
* string property name.
|
|
33
|
+
*/
|
|
34
|
+
typedef enum IndexAMProperty
|
|
35
|
+
{
|
|
36
|
+
AMPROP_UNKNOWN = 0, /* anything not known to core code */
|
|
37
|
+
AMPROP_ASC, /* column properties */
|
|
38
|
+
AMPROP_DESC,
|
|
39
|
+
AMPROP_NULLS_FIRST,
|
|
40
|
+
AMPROP_NULLS_LAST,
|
|
41
|
+
AMPROP_ORDERABLE,
|
|
42
|
+
AMPROP_DISTANCE_ORDERABLE,
|
|
43
|
+
AMPROP_RETURNABLE,
|
|
44
|
+
AMPROP_SEARCH_ARRAY,
|
|
45
|
+
AMPROP_SEARCH_NULLS,
|
|
46
|
+
AMPROP_CLUSTERABLE, /* index properties */
|
|
47
|
+
AMPROP_INDEX_SCAN,
|
|
48
|
+
AMPROP_BITMAP_SCAN,
|
|
49
|
+
AMPROP_BACKWARD_SCAN,
|
|
50
|
+
AMPROP_CAN_ORDER, /* AM properties */
|
|
51
|
+
AMPROP_CAN_UNIQUE,
|
|
52
|
+
AMPROP_CAN_MULTI_COL,
|
|
53
|
+
AMPROP_CAN_EXCLUDE,
|
|
54
|
+
AMPROP_CAN_INCLUDE
|
|
55
|
+
} IndexAMProperty;
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Callback function signatures --- see indexam.sgml for more info.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/* build new index */
|
|
63
|
+
typedef IndexBuildResult *(*ambuild_function) (Relation heapRelation,
|
|
64
|
+
Relation indexRelation,
|
|
65
|
+
struct IndexInfo *indexInfo);
|
|
66
|
+
|
|
67
|
+
/* build empty index */
|
|
68
|
+
typedef void (*ambuildempty_function) (Relation indexRelation);
|
|
69
|
+
|
|
70
|
+
/* insert this tuple */
|
|
71
|
+
typedef bool (*aminsert_function) (Relation indexRelation,
|
|
72
|
+
Datum *values,
|
|
73
|
+
bool *isnull,
|
|
74
|
+
ItemPointer heap_tid,
|
|
75
|
+
Relation heapRelation,
|
|
76
|
+
IndexUniqueCheck checkUnique,
|
|
77
|
+
struct IndexInfo *indexInfo);
|
|
78
|
+
|
|
79
|
+
/* bulk delete */
|
|
80
|
+
typedef IndexBulkDeleteResult *(*ambulkdelete_function) (IndexVacuumInfo *info,
|
|
81
|
+
IndexBulkDeleteResult *stats,
|
|
82
|
+
IndexBulkDeleteCallback callback,
|
|
83
|
+
void *callback_state);
|
|
84
|
+
|
|
85
|
+
/* post-VACUUM cleanup */
|
|
86
|
+
typedef IndexBulkDeleteResult *(*amvacuumcleanup_function) (IndexVacuumInfo *info,
|
|
87
|
+
IndexBulkDeleteResult *stats);
|
|
88
|
+
|
|
89
|
+
/* can indexscan return IndexTuples? */
|
|
90
|
+
typedef bool (*amcanreturn_function) (Relation indexRelation, int attno);
|
|
91
|
+
|
|
92
|
+
/* estimate cost of an indexscan */
|
|
93
|
+
typedef void (*amcostestimate_function) (struct PlannerInfo *root,
|
|
94
|
+
struct IndexPath *path,
|
|
95
|
+
double loop_count,
|
|
96
|
+
Cost *indexStartupCost,
|
|
97
|
+
Cost *indexTotalCost,
|
|
98
|
+
Selectivity *indexSelectivity,
|
|
99
|
+
double *indexCorrelation,
|
|
100
|
+
double *indexPages);
|
|
101
|
+
|
|
102
|
+
/* parse index reloptions */
|
|
103
|
+
typedef bytea *(*amoptions_function) (Datum reloptions,
|
|
104
|
+
bool validate);
|
|
105
|
+
|
|
106
|
+
/* report AM, index, or index column property */
|
|
107
|
+
typedef bool (*amproperty_function) (Oid index_oid, int attno,
|
|
108
|
+
IndexAMProperty prop, const char *propname,
|
|
109
|
+
bool *res, bool *isnull);
|
|
110
|
+
|
|
111
|
+
/* name of phase as used in progress reporting */
|
|
112
|
+
typedef char *(*ambuildphasename_function) (int64 phasenum);
|
|
113
|
+
|
|
114
|
+
/* validate definition of an opclass for this AM */
|
|
115
|
+
typedef bool (*amvalidate_function) (Oid opclassoid);
|
|
116
|
+
|
|
117
|
+
/* prepare for index scan */
|
|
118
|
+
typedef IndexScanDesc (*ambeginscan_function) (Relation indexRelation,
|
|
119
|
+
int nkeys,
|
|
120
|
+
int norderbys);
|
|
121
|
+
|
|
122
|
+
/* (re)start index scan */
|
|
123
|
+
typedef void (*amrescan_function) (IndexScanDesc scan,
|
|
124
|
+
ScanKey keys,
|
|
125
|
+
int nkeys,
|
|
126
|
+
ScanKey orderbys,
|
|
127
|
+
int norderbys);
|
|
128
|
+
|
|
129
|
+
/* next valid tuple */
|
|
130
|
+
typedef bool (*amgettuple_function) (IndexScanDesc scan,
|
|
131
|
+
ScanDirection direction);
|
|
132
|
+
|
|
133
|
+
/* fetch all valid tuples */
|
|
134
|
+
typedef int64 (*amgetbitmap_function) (IndexScanDesc scan,
|
|
135
|
+
TIDBitmap *tbm);
|
|
136
|
+
|
|
137
|
+
/* end index scan */
|
|
138
|
+
typedef void (*amendscan_function) (IndexScanDesc scan);
|
|
139
|
+
|
|
140
|
+
/* mark current scan position */
|
|
141
|
+
typedef void (*ammarkpos_function) (IndexScanDesc scan);
|
|
142
|
+
|
|
143
|
+
/* restore marked scan position */
|
|
144
|
+
typedef void (*amrestrpos_function) (IndexScanDesc scan);
|
|
145
|
+
|
|
146
|
+
/*
|
|
147
|
+
* Callback function signatures - for parallel index scans.
|
|
148
|
+
*/
|
|
149
|
+
|
|
150
|
+
/* estimate size of parallel scan descriptor */
|
|
151
|
+
typedef Size (*amestimateparallelscan_function) (void);
|
|
152
|
+
|
|
153
|
+
/* prepare for parallel index scan */
|
|
154
|
+
typedef void (*aminitparallelscan_function) (void *target);
|
|
155
|
+
|
|
156
|
+
/* (re)start parallel index scan */
|
|
157
|
+
typedef void (*amparallelrescan_function) (IndexScanDesc scan);
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* API struct for an index AM. Note this must be stored in a single palloc'd
|
|
161
|
+
* chunk of memory.
|
|
162
|
+
*/
|
|
163
|
+
typedef struct IndexAmRoutine
|
|
164
|
+
{
|
|
165
|
+
NodeTag type;
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* Total number of strategies (operators) by which we can traverse/search
|
|
169
|
+
* this AM. Zero if AM does not have a fixed set of strategy assignments.
|
|
170
|
+
*/
|
|
171
|
+
uint16 amstrategies;
|
|
172
|
+
/* total number of support functions that this AM uses */
|
|
173
|
+
uint16 amsupport;
|
|
174
|
+
/* opclass options support function number or 0 */
|
|
175
|
+
uint16 amoptsprocnum;
|
|
176
|
+
/* does AM support ORDER BY indexed column's value? */
|
|
177
|
+
bool amcanorder;
|
|
178
|
+
/* does AM support ORDER BY result of an operator on indexed column? */
|
|
179
|
+
bool amcanorderbyop;
|
|
180
|
+
/* does AM support backward scanning? */
|
|
181
|
+
bool amcanbackward;
|
|
182
|
+
/* does AM support UNIQUE indexes? */
|
|
183
|
+
bool amcanunique;
|
|
184
|
+
/* does AM support multi-column indexes? */
|
|
185
|
+
bool amcanmulticol;
|
|
186
|
+
/* does AM require scans to have a constraint on the first index column? */
|
|
187
|
+
bool amoptionalkey;
|
|
188
|
+
/* does AM handle ScalarArrayOpExpr quals? */
|
|
189
|
+
bool amsearcharray;
|
|
190
|
+
/* does AM handle IS NULL/IS NOT NULL quals? */
|
|
191
|
+
bool amsearchnulls;
|
|
192
|
+
/* can index storage data type differ from column data type? */
|
|
193
|
+
bool amstorage;
|
|
194
|
+
/* can an index of this type be clustered on? */
|
|
195
|
+
bool amclusterable;
|
|
196
|
+
/* does AM handle predicate locks? */
|
|
197
|
+
bool ampredlocks;
|
|
198
|
+
/* does AM support parallel scan? */
|
|
199
|
+
bool amcanparallel;
|
|
200
|
+
/* does AM support columns included with clause INCLUDE? */
|
|
201
|
+
bool amcaninclude;
|
|
202
|
+
/* does AM use maintenance_work_mem? */
|
|
203
|
+
bool amusemaintenanceworkmem;
|
|
204
|
+
/* OR of parallel vacuum flags. See vacuum.h for flags. */
|
|
205
|
+
uint8 amparallelvacuumoptions;
|
|
206
|
+
/* type of data stored in index, or InvalidOid if variable */
|
|
207
|
+
Oid amkeytype;
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* If you add new properties to either the above or the below lists, then
|
|
211
|
+
* they should also (usually) be exposed via the property API (see
|
|
212
|
+
* IndexAMProperty at the top of the file, and utils/adt/amutils.c).
|
|
213
|
+
*/
|
|
214
|
+
|
|
215
|
+
/* interface functions */
|
|
216
|
+
ambuild_function ambuild;
|
|
217
|
+
ambuildempty_function ambuildempty;
|
|
218
|
+
aminsert_function aminsert;
|
|
219
|
+
ambulkdelete_function ambulkdelete;
|
|
220
|
+
amvacuumcleanup_function amvacuumcleanup;
|
|
221
|
+
amcanreturn_function amcanreturn; /* can be NULL */
|
|
222
|
+
amcostestimate_function amcostestimate;
|
|
223
|
+
amoptions_function amoptions;
|
|
224
|
+
amproperty_function amproperty; /* can be NULL */
|
|
225
|
+
ambuildphasename_function ambuildphasename; /* can be NULL */
|
|
226
|
+
amvalidate_function amvalidate;
|
|
227
|
+
ambeginscan_function ambeginscan;
|
|
228
|
+
amrescan_function amrescan;
|
|
229
|
+
amgettuple_function amgettuple; /* can be NULL */
|
|
230
|
+
amgetbitmap_function amgetbitmap; /* can be NULL */
|
|
231
|
+
amendscan_function amendscan;
|
|
232
|
+
ammarkpos_function ammarkpos; /* can be NULL */
|
|
233
|
+
amrestrpos_function amrestrpos; /* can be NULL */
|
|
234
|
+
|
|
235
|
+
/* interface functions to support parallel index scans */
|
|
236
|
+
amestimateparallelscan_function amestimateparallelscan; /* can be NULL */
|
|
237
|
+
aminitparallelscan_function aminitparallelscan; /* can be NULL */
|
|
238
|
+
amparallelrescan_function amparallelrescan; /* can be NULL */
|
|
239
|
+
} IndexAmRoutine;
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
/* Functions in access/index/amapi.c */
|
|
243
|
+
extern IndexAmRoutine *GetIndexAmRoutine(Oid amhandler);
|
|
244
|
+
extern IndexAmRoutine *GetIndexAmRoutineByAmId(Oid amoid, bool noerror);
|
|
245
|
+
|
|
246
|
+
#endif /* AMAPI_H */
|