pg_query 2.1.0 → 4.2.1
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 +104 -0
- data/README.md +59 -31
- data/Rakefile +2 -2
- data/ext/pg_query/extconf.rb +8 -2
- data/ext/pg_query/include/access/amapi.h +45 -1
- data/ext/pg_query/include/access/attmap.h +1 -1
- data/ext/pg_query/include/access/attnum.h +2 -2
- data/ext/pg_query/include/access/clog.h +4 -2
- data/ext/pg_query/include/access/commit_ts.h +6 -9
- data/ext/pg_query/include/access/detoast.h +1 -11
- data/ext/pg_query/include/access/genam.h +15 -12
- data/ext/pg_query/include/access/gin.h +2 -2
- data/ext/pg_query/include/access/htup.h +1 -1
- data/ext/pg_query/include/access/htup_details.h +75 -87
- data/ext/pg_query/include/access/itup.h +7 -1
- data/ext/pg_query/include/access/parallel.h +2 -2
- data/ext/pg_query/include/access/printtup.h +1 -1
- data/ext/pg_query/include/access/relation.h +1 -1
- data/ext/pg_query/include/access/relscan.h +17 -2
- data/ext/pg_query/include/access/rmgr.h +30 -3
- data/ext/pg_query/include/access/rmgrlist.h +23 -23
- data/ext/pg_query/include/access/sdir.h +1 -1
- data/ext/pg_query/include/access/skey.h +1 -1
- data/ext/pg_query/include/access/stratnum.h +4 -2
- data/ext/pg_query/include/access/sysattr.h +1 -1
- data/ext/pg_query/include/access/table.h +2 -1
- data/ext/pg_query/include/access/tableam.h +272 -20
- data/ext/pg_query/include/access/toast_compression.h +73 -0
- data/ext/pg_query/include/access/transam.h +123 -13
- data/ext/pg_query/include/access/tupconvert.h +1 -1
- data/ext/pg_query/include/access/tupdesc.h +1 -1
- data/ext/pg_query/include/access/tupmacs.h +3 -3
- data/ext/pg_query/include/access/twophase.h +5 -1
- data/ext/pg_query/include/access/xact.h +79 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +50 -14
- data/ext/pg_query/include/access/xlogdefs.h +8 -16
- data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/access/xlogreader.h +148 -32
- data/ext/pg_query/include/access/xlogrecord.h +18 -9
- data/ext/pg_query/include/access/xlogrecovery.h +157 -0
- data/ext/pg_query/include/c.h +101 -44
- data/ext/pg_query/include/catalog/catalog.h +3 -1
- data/ext/pg_query/include/catalog/catversion.h +2 -2
- data/ext/pg_query/include/catalog/dependency.h +10 -16
- data/ext/pg_query/include/catalog/genbki.h +83 -5
- data/ext/pg_query/include/catalog/index.h +18 -3
- data/ext/pg_query/include/catalog/indexing.h +12 -324
- data/ext/pg_query/include/catalog/namespace.h +4 -2
- data/ext/pg_query/include/catalog/objectaccess.h +70 -2
- data/ext/pg_query/include/catalog/objectaddress.h +11 -6
- data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_am.h +4 -1
- data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
- data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
- data/ext/pg_query/include/catalog/pg_authid.h +7 -2
- data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
- data/ext/pg_query/include/catalog/pg_class.h +45 -15
- data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
- data/ext/pg_query/include/catalog/pg_collation.h +33 -8
- data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
- data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
- data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/catalog/pg_control.h +5 -5
- data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
- data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_depend.h +11 -7
- data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_index.h +17 -7
- data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
- data/ext/pg_query/include/catalog/pg_language.h +10 -5
- data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
- data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
- data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_operator.h +21 -16
- data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
- data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_proc.h +20 -11
- data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
- data/ext/pg_query/include/catalog/pg_publication.h +50 -4
- data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
- data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/catalog/pg_transform.h +8 -5
- data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
- data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/catalog/pg_type.h +56 -24
- data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
- data/ext/pg_query/include/catalog/storage.h +5 -3
- data/ext/pg_query/include/commands/async.h +4 -5
- data/ext/pg_query/include/commands/dbcommands.h +2 -1
- data/ext/pg_query/include/commands/defrem.h +11 -24
- data/ext/pg_query/include/commands/event_trigger.h +2 -2
- data/ext/pg_query/include/commands/explain.h +1 -1
- data/ext/pg_query/include/commands/prepare.h +1 -1
- data/ext/pg_query/include/commands/tablespace.h +3 -1
- data/ext/pg_query/include/commands/trigger.h +27 -17
- data/ext/pg_query/include/commands/user.h +2 -2
- data/ext/pg_query/include/commands/vacuum.h +88 -41
- data/ext/pg_query/include/commands/variable.h +1 -1
- data/ext/pg_query/include/common/file_perm.h +4 -4
- data/ext/pg_query/include/common/hashfn.h +1 -1
- data/ext/pg_query/include/common/ip.h +1 -7
- data/ext/pg_query/include/common/keywords.h +2 -6
- data/ext/pg_query/include/common/kwlookup.h +1 -1
- data/ext/pg_query/include/common/pg_prng.h +60 -0
- data/ext/pg_query/include/common/relpath.h +2 -2
- data/ext/pg_query/include/common/string.h +24 -1
- data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
- data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
- data/ext/pg_query/include/datatype/timestamp.h +40 -1
- data/ext/pg_query/include/executor/execdesc.h +1 -1
- data/ext/pg_query/include/executor/executor.h +65 -22
- data/ext/pg_query/include/executor/functions.h +17 -3
- data/ext/pg_query/include/executor/instrument.h +33 -16
- data/ext/pg_query/include/executor/spi.h +41 -3
- data/ext/pg_query/include/executor/tablefunc.h +1 -1
- data/ext/pg_query/include/executor/tuptable.h +1 -1
- data/ext/pg_query/include/fmgr.h +13 -7
- data/ext/pg_query/include/funcapi.h +16 -4
- data/ext/pg_query/include/getaddrinfo.h +1 -1
- data/ext/pg_query/include/jit/jit.h +11 -11
- data/ext/pg_query/include/kwlist_d.h +517 -494
- data/ext/pg_query/include/lib/dshash.h +112 -0
- data/ext/pg_query/include/lib/ilist.h +20 -1
- data/ext/pg_query/include/lib/pairingheap.h +1 -1
- data/ext/pg_query/include/lib/simplehash.h +150 -25
- data/ext/pg_query/include/lib/sort_template.h +432 -0
- data/ext/pg_query/include/lib/stringinfo.h +1 -1
- data/ext/pg_query/include/libpq/auth.h +6 -4
- data/ext/pg_query/include/libpq/crypt.h +5 -4
- data/ext/pg_query/include/libpq/hba.h +43 -4
- data/ext/pg_query/include/libpq/libpq-be.h +23 -6
- data/ext/pg_query/include/libpq/libpq.h +31 -20
- data/ext/pg_query/include/libpq/pqcomm.h +17 -31
- data/ext/pg_query/include/libpq/pqformat.h +1 -1
- data/ext/pg_query/include/libpq/pqsignal.h +4 -4
- data/ext/pg_query/include/mb/pg_wchar.h +106 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +71 -52
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +272 -80
- data/ext/pg_query/include/nodes/extensible.h +4 -2
- data/ext/pg_query/include/nodes/lockoptions.h +1 -1
- data/ext/pg_query/include/nodes/makefuncs.h +7 -6
- data/ext/pg_query/include/nodes/memnodes.h +5 -3
- data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
- data/ext/pg_query/include/nodes/nodes.h +30 -11
- data/ext/pg_query/include/nodes/params.h +1 -1
- data/ext/pg_query/include/nodes/parsenodes.h +327 -94
- data/ext/pg_query/include/nodes/pathnodes.h +245 -67
- data/ext/pg_query/include/nodes/pg_list.h +75 -68
- data/ext/pg_query/include/nodes/plannodes.h +128 -30
- data/ext/pg_query/include/nodes/primnodes.h +99 -47
- data/ext/pg_query/include/nodes/print.h +1 -1
- data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
- data/ext/pg_query/include/nodes/value.h +58 -39
- data/ext/pg_query/include/optimizer/cost.h +9 -2
- data/ext/pg_query/include/optimizer/geqo.h +9 -7
- data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
- data/ext/pg_query/include/optimizer/optimizer.h +25 -22
- data/ext/pg_query/include/optimizer/paths.h +6 -6
- data/ext/pg_query/include/optimizer/planmain.h +15 -14
- data/ext/pg_query/include/parser/analyze.h +19 -5
- data/ext/pg_query/include/parser/gram.h +947 -913
- data/ext/pg_query/include/parser/gramparse.h +1 -1
- data/ext/pg_query/include/parser/kwlist.h +463 -453
- data/ext/pg_query/include/parser/parse_agg.h +2 -7
- data/ext/pg_query/include/parser/parse_coerce.h +4 -1
- data/ext/pg_query/include/parser/parse_expr.h +2 -3
- data/ext/pg_query/include/parser/parse_func.h +2 -1
- data/ext/pg_query/include/parser/parse_node.h +21 -9
- data/ext/pg_query/include/parser/parse_oper.h +1 -3
- data/ext/pg_query/include/parser/parse_relation.h +5 -4
- data/ext/pg_query/include/parser/parse_type.h +1 -1
- data/ext/pg_query/include/parser/parser.h +31 -4
- data/ext/pg_query/include/parser/parsetree.h +1 -1
- data/ext/pg_query/include/parser/scanner.h +1 -1
- data/ext/pg_query/include/parser/scansup.h +2 -5
- data/ext/pg_query/include/partitioning/partdefs.h +1 -1
- data/ext/pg_query/include/pg_config.h +94 -46
- data/ext/pg_query/include/pg_config_manual.h +74 -21
- data/ext/pg_query/include/pg_getopt.h +6 -6
- data/ext/pg_query/include/pg_query.h +5 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1237
- data/ext/pg_query/include/pgtime.h +14 -4
- data/ext/pg_query/include/pl_gram.h +126 -128
- data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/include/plerrcodes.h +9 -1
- data/ext/pg_query/include/plpgsql.h +52 -54
- data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
- data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
- data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
- data/ext/pg_query/include/port/atomics/fallback.h +1 -1
- data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
- data/ext/pg_query/include/port/atomics/generic.h +1 -1
- data/ext/pg_query/include/port/atomics.h +1 -1
- data/ext/pg_query/include/port/pg_bitutils.h +88 -12
- data/ext/pg_query/include/port/pg_bswap.h +1 -1
- data/ext/pg_query/include/port/pg_crc32c.h +1 -1
- data/ext/pg_query/include/port.h +72 -43
- data/ext/pg_query/include/portability/instr_time.h +1 -1
- data/ext/pg_query/include/postgres.h +60 -16
- data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
- data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
- data/ext/pg_query/include/postmaster/bgworker.h +2 -1
- data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
- data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
- data/ext/pg_query/include/postmaster/fork_process.h +1 -1
- data/ext/pg_query/include/postmaster/interrupt.h +1 -1
- data/ext/pg_query/include/postmaster/pgarch.h +42 -8
- data/ext/pg_query/include/postmaster/postmaster.h +18 -17
- data/ext/pg_query/include/postmaster/startup.h +39 -0
- data/ext/pg_query/include/postmaster/syslogger.h +15 -10
- data/ext/pg_query/include/postmaster/walwriter.h +3 -3
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
- data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
- data/ext/pg_query/include/regex/regex.h +18 -16
- data/ext/pg_query/include/replication/logicallauncher.h +3 -5
- data/ext/pg_query/include/replication/logicalproto.h +161 -17
- data/ext/pg_query/include/replication/logicalworker.h +1 -1
- data/ext/pg_query/include/replication/origin.h +7 -7
- data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
- data/ext/pg_query/include/replication/slot.h +23 -12
- data/ext/pg_query/include/replication/syncrep.h +5 -5
- data/ext/pg_query/include/replication/walreceiver.h +145 -13
- data/ext/pg_query/include/replication/walsender.h +8 -8
- data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
- data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
- data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
- data/ext/pg_query/include/storage/backendid.h +3 -3
- data/ext/pg_query/include/storage/block.h +4 -10
- data/ext/pg_query/include/storage/buf.h +1 -1
- data/ext/pg_query/include/storage/bufmgr.h +19 -14
- data/ext/pg_query/include/storage/bufpage.h +6 -8
- data/ext/pg_query/include/storage/condition_variable.h +13 -2
- data/ext/pg_query/include/storage/dsm.h +4 -1
- data/ext/pg_query/include/storage/dsm_impl.h +3 -2
- data/ext/pg_query/include/storage/fd.h +33 -3
- data/ext/pg_query/include/storage/fileset.h +40 -0
- data/ext/pg_query/include/storage/ipc.h +4 -1
- data/ext/pg_query/include/storage/item.h +1 -1
- data/ext/pg_query/include/storage/itemid.h +1 -1
- data/ext/pg_query/include/storage/itemptr.h +3 -1
- data/ext/pg_query/include/storage/large_object.h +2 -2
- data/ext/pg_query/include/storage/latch.h +9 -13
- data/ext/pg_query/include/storage/lmgr.h +2 -1
- data/ext/pg_query/include/storage/lock.h +17 -13
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +6 -32
- data/ext/pg_query/include/storage/lwlocknames.h +0 -1
- data/ext/pg_query/include/storage/off.h +1 -1
- data/ext/pg_query/include/storage/pg_sema.h +1 -1
- data/ext/pg_query/include/storage/pg_shmem.h +9 -7
- data/ext/pg_query/include/storage/pmsignal.h +15 -4
- data/ext/pg_query/include/storage/predicate.h +4 -4
- data/ext/pg_query/include/storage/proc.h +183 -55
- data/ext/pg_query/include/storage/procarray.h +98 -0
- data/ext/pg_query/include/storage/proclist_types.h +1 -1
- data/ext/pg_query/include/storage/procsignal.h +3 -7
- data/ext/pg_query/include/storage/relfilenode.h +1 -1
- data/ext/pg_query/include/storage/s_lock.h +67 -4
- data/ext/pg_query/include/storage/sharedfileset.h +3 -11
- data/ext/pg_query/include/storage/shm_mq.h +5 -4
- data/ext/pg_query/include/storage/shm_toc.h +1 -1
- data/ext/pg_query/include/storage/shmem.h +1 -1
- data/ext/pg_query/include/storage/sinval.h +3 -3
- data/ext/pg_query/include/storage/sinvaladt.h +1 -1
- data/ext/pg_query/include/storage/smgr.h +10 -8
- data/ext/pg_query/include/storage/spin.h +2 -2
- data/ext/pg_query/include/storage/standby.h +13 -6
- data/ext/pg_query/include/storage/standbydefs.h +2 -2
- data/ext/pg_query/include/storage/sync.h +7 -3
- data/ext/pg_query/include/tcop/cmdtag.h +1 -1
- data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
- data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
- data/ext/pg_query/include/tcop/dest.h +1 -1
- data/ext/pg_query/include/tcop/fastpath.h +1 -2
- data/ext/pg_query/include/tcop/pquery.h +7 -1
- data/ext/pg_query/include/tcop/tcopprot.h +19 -11
- data/ext/pg_query/include/tcop/utility.h +7 -3
- data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
- data/ext/pg_query/include/utils/acl.h +24 -3
- data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
- data/ext/pg_query/include/utils/array.h +7 -2
- data/ext/pg_query/include/utils/backend_progress.h +44 -0
- data/ext/pg_query/include/utils/backend_status.h +321 -0
- data/ext/pg_query/include/utils/builtins.h +11 -11
- data/ext/pg_query/include/utils/bytea.h +3 -2
- data/ext/pg_query/include/utils/catcache.h +1 -1
- data/ext/pg_query/include/utils/date.h +1 -1
- data/ext/pg_query/include/utils/datetime.h +8 -7
- data/ext/pg_query/include/utils/datum.h +9 -1
- data/ext/pg_query/include/utils/dsa.h +1 -1
- data/ext/pg_query/include/utils/dynahash.h +4 -3
- data/ext/pg_query/include/utils/elog.h +52 -21
- data/ext/pg_query/include/utils/errcodes.h +2 -0
- data/ext/pg_query/include/utils/expandeddatum.h +1 -1
- data/ext/pg_query/include/utils/expandedrecord.h +1 -1
- data/ext/pg_query/include/utils/float.h +7 -7
- data/ext/pg_query/include/utils/fmgroids.h +1300 -696
- data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
- data/ext/pg_query/include/utils/fmgrtab.h +6 -5
- data/ext/pg_query/include/utils/guc.h +69 -43
- data/ext/pg_query/include/utils/guc_tables.h +23 -19
- data/ext/pg_query/include/utils/hsearch.h +15 -11
- data/ext/pg_query/include/utils/inval.h +5 -1
- data/ext/pg_query/include/utils/lsyscache.h +11 -1
- data/ext/pg_query/include/utils/memdebug.h +1 -1
- data/ext/pg_query/include/utils/memutils.h +8 -3
- data/ext/pg_query/include/utils/numeric.h +19 -5
- data/ext/pg_query/include/utils/palloc.h +25 -3
- data/ext/pg_query/include/utils/partcache.h +1 -1
- data/ext/pg_query/include/utils/pg_locale.h +17 -9
- data/ext/pg_query/include/utils/pg_lsn.h +1 -1
- data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
- data/ext/pg_query/include/utils/pidfile.h +1 -1
- data/ext/pg_query/include/utils/plancache.h +6 -5
- data/ext/pg_query/include/utils/portal.h +12 -1
- data/ext/pg_query/include/utils/ps_status.h +1 -1
- data/ext/pg_query/include/utils/queryenvironment.h +1 -1
- data/ext/pg_query/include/utils/queryjumble.h +88 -0
- data/ext/pg_query/include/utils/regproc.h +14 -3
- data/ext/pg_query/include/utils/rel.h +71 -20
- data/ext/pg_query/include/utils/relcache.h +9 -7
- data/ext/pg_query/include/utils/reltrigger.h +1 -1
- data/ext/pg_query/include/utils/resowner.h +1 -1
- data/ext/pg_query/include/utils/rls.h +2 -2
- data/ext/pg_query/include/utils/ruleutils.h +4 -1
- data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/utils/snapmgr.h +35 -14
- data/ext/pg_query/include/utils/snapshot.h +14 -1
- data/ext/pg_query/include/utils/sortsupport.h +117 -2
- data/ext/pg_query/include/utils/syscache.h +6 -1
- data/ext/pg_query/include/utils/timeout.h +11 -4
- data/ext/pg_query/include/utils/timestamp.h +6 -5
- data/ext/pg_query/include/utils/tuplesort.h +25 -11
- data/ext/pg_query/include/utils/tuplestore.h +2 -2
- data/ext/pg_query/include/utils/typcache.h +24 -17
- data/ext/pg_query/include/utils/tzparser.h +1 -1
- data/ext/pg_query/include/utils/varlena.h +5 -3
- data/ext/pg_query/include/utils/wait_event.h +289 -0
- data/ext/pg_query/include/utils/xml.h +4 -4
- data/ext/pg_query/pg_query.pb-c.c +4318 -2307
- data/ext/pg_query/pg_query_deparse.c +1114 -381
- data/ext/pg_query/pg_query_fingerprint.c +46 -10
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
- data/ext/pg_query/pg_query_normalize.c +163 -20
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
- data/ext/pg_query/pg_query_parse.c +1 -1
- data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
- data/ext/pg_query/pg_query_ruby.c +1 -1
- data/ext/pg_query/pg_query_scan.c +2 -1
- data/ext/pg_query/pg_query_split.c +3 -2
- data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
- data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
- data/ext/pg_query/src_backend_commands_define.c +11 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +86 -11
- data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +644 -441
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
- data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
- data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
- data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
- data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
- data/ext/pg_query/src_common_encnames.c +1 -1
- data/ext/pg_query/src_common_hashfn.c +3 -3
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +517 -494
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_pg_prng.c +152 -0
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_string.c +7 -1
- data/ext/pg_query/src_common_stringinfo.c +1 -1
- data/ext/pg_query/src_common_wchar.c +712 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
- data/ext/pg_query/src_port_pg_bitutils.c +41 -52
- data/ext/pg_query/src_port_pgsleep.c +1 -1
- data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +46 -20
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +6 -4
- data/lib/pg_query/fingerprint.rb +18 -3
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +87 -51
- data/lib/pg_query/pg_query_pb.rb +1109 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- metadata +29 -18
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_random.c +0 -31
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* Copyright (c) 1983, 1995, 1996 Eric P. Allman
|
|
31
31
|
* Copyright (c) 1988, 1993
|
|
32
32
|
* The Regents of the University of California. All rights reserved.
|
|
33
|
-
* Portions Copyright (c) 1996-
|
|
33
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
34
34
|
*
|
|
35
35
|
* Redistribution and use in source and binary forms, with or without
|
|
36
36
|
* modification, are permitted provided that the following conditions
|
|
@@ -344,7 +344,7 @@ static bool find_arguments(const char *format, va_list args,
|
|
|
344
344
|
PrintfArgValue *argvalues);
|
|
345
345
|
static void fmtstr(const char *value, int leftjust, int minlen, int maxwidth,
|
|
346
346
|
int pointflag, PrintfTarget *target);
|
|
347
|
-
static void fmtptr(void *value, PrintfTarget *target);
|
|
347
|
+
static void fmtptr(const void *value, PrintfTarget *target);
|
|
348
348
|
static void fmtint(long long value, char type, int forcesign,
|
|
349
349
|
int leftjust, int minlen, int zpad, int precision, int pointflag,
|
|
350
350
|
PrintfTarget *target);
|
|
@@ -418,7 +418,7 @@ dopr(PrintfTarget *target, const char *format, va_list args)
|
|
|
418
418
|
int cvalue;
|
|
419
419
|
long long numvalue;
|
|
420
420
|
double fvalue;
|
|
421
|
-
char
|
|
421
|
+
const char *strvalue;
|
|
422
422
|
PrintfArgValue argvalues[PG_NL_ARGMAX + 1];
|
|
423
423
|
|
|
424
424
|
/*
|
|
@@ -463,7 +463,8 @@ dopr(PrintfTarget *target, const char *format, va_list args)
|
|
|
463
463
|
{
|
|
464
464
|
format++;
|
|
465
465
|
strvalue = va_arg(args, char *);
|
|
466
|
-
|
|
466
|
+
if (strvalue == NULL)
|
|
467
|
+
strvalue = "(null)";
|
|
467
468
|
dostr(strvalue, strlen(strvalue), target);
|
|
468
469
|
if (target->failed)
|
|
469
470
|
break;
|
|
@@ -694,8 +695,9 @@ nextch2:
|
|
|
694
695
|
strvalue = argvalues[fmtpos].cptr;
|
|
695
696
|
else
|
|
696
697
|
strvalue = va_arg(args, char *);
|
|
697
|
-
/*
|
|
698
|
-
|
|
698
|
+
/* If string is NULL, silently substitute "(null)" */
|
|
699
|
+
if (strvalue == NULL)
|
|
700
|
+
strvalue = "(null)";
|
|
699
701
|
fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
|
|
700
702
|
target);
|
|
701
703
|
break;
|
|
@@ -705,7 +707,7 @@ nextch2:
|
|
|
705
707
|
strvalue = argvalues[fmtpos].cptr;
|
|
706
708
|
else
|
|
707
709
|
strvalue = va_arg(args, char *);
|
|
708
|
-
fmtptr((void *) strvalue, target);
|
|
710
|
+
fmtptr((const void *) strvalue, target);
|
|
709
711
|
break;
|
|
710
712
|
case 'e':
|
|
711
713
|
case 'E':
|
|
@@ -1019,13 +1021,13 @@ fmtstr(const char *value, int leftjust, int minlen, int maxwidth,
|
|
|
1019
1021
|
}
|
|
1020
1022
|
|
|
1021
1023
|
static void
|
|
1022
|
-
fmtptr(void *value, PrintfTarget *target)
|
|
1024
|
+
fmtptr(const void *value, PrintfTarget *target)
|
|
1023
1025
|
{
|
|
1024
1026
|
int vallen;
|
|
1025
1027
|
char convert[64];
|
|
1026
1028
|
|
|
1027
|
-
/* we rely on regular C library's
|
|
1028
|
-
vallen =
|
|
1029
|
+
/* we rely on regular C library's snprintf to do the basic conversion */
|
|
1030
|
+
vallen = snprintf(convert, sizeof(convert), "%p", value);
|
|
1029
1031
|
if (vallen < 0)
|
|
1030
1032
|
target->failed = true;
|
|
1031
1033
|
else
|
|
@@ -1037,8 +1039,8 @@ fmtint(long long value, char type, int forcesign, int leftjust,
|
|
|
1037
1039
|
int minlen, int zpad, int precision, int pointflag,
|
|
1038
1040
|
PrintfTarget *target)
|
|
1039
1041
|
{
|
|
1040
|
-
unsigned long long base;
|
|
1041
1042
|
unsigned long long uvalue;
|
|
1043
|
+
int base;
|
|
1042
1044
|
int dosign;
|
|
1043
1045
|
const char *cvt = "0123456789abcdef";
|
|
1044
1046
|
int signvalue = 0;
|
|
@@ -1097,12 +1099,36 @@ fmtint(long long value, char type, int forcesign, int leftjust,
|
|
|
1097
1099
|
vallen = 0;
|
|
1098
1100
|
else
|
|
1099
1101
|
{
|
|
1100
|
-
/*
|
|
1101
|
-
|
|
1102
|
+
/*
|
|
1103
|
+
* Convert integer to string. We special-case each of the possible
|
|
1104
|
+
* base values so as to avoid general-purpose divisions. On most
|
|
1105
|
+
* machines, division by a fixed constant can be done much more
|
|
1106
|
+
* cheaply than a general divide.
|
|
1107
|
+
*/
|
|
1108
|
+
if (base == 10)
|
|
1109
|
+
{
|
|
1110
|
+
do
|
|
1111
|
+
{
|
|
1112
|
+
convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 10];
|
|
1113
|
+
uvalue = uvalue / 10;
|
|
1114
|
+
} while (uvalue);
|
|
1115
|
+
}
|
|
1116
|
+
else if (base == 16)
|
|
1102
1117
|
{
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1118
|
+
do
|
|
1119
|
+
{
|
|
1120
|
+
convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 16];
|
|
1121
|
+
uvalue = uvalue / 16;
|
|
1122
|
+
} while (uvalue);
|
|
1123
|
+
}
|
|
1124
|
+
else /* base == 8 */
|
|
1125
|
+
{
|
|
1126
|
+
do
|
|
1127
|
+
{
|
|
1128
|
+
convert[sizeof(convert) - (++vallen)] = cvt[uvalue % 8];
|
|
1129
|
+
uvalue = uvalue / 8;
|
|
1130
|
+
} while (uvalue);
|
|
1131
|
+
}
|
|
1106
1132
|
}
|
|
1107
1133
|
|
|
1108
1134
|
zeropad = Max(0, precision - vallen);
|
|
@@ -1151,11 +1177,11 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
|
|
|
1151
1177
|
int padlen; /* amount to pad with spaces */
|
|
1152
1178
|
|
|
1153
1179
|
/*
|
|
1154
|
-
* We rely on the regular C library's
|
|
1180
|
+
* We rely on the regular C library's snprintf to do the basic conversion,
|
|
1155
1181
|
* then handle padding considerations here.
|
|
1156
1182
|
*
|
|
1157
1183
|
* The dynamic range of "double" is about 1E+-308 for IEEE math, and not
|
|
1158
|
-
* too wildly more than that with other hardware. In "f" format,
|
|
1184
|
+
* too wildly more than that with other hardware. In "f" format, snprintf
|
|
1159
1185
|
* could therefore generate at most 308 characters to the left of the
|
|
1160
1186
|
* decimal point; while we need to allow the precision to get as high as
|
|
1161
1187
|
* 308+17 to ensure that we don't truncate significant digits from very
|
|
@@ -1207,14 +1233,14 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
|
|
|
1207
1233
|
fmt[2] = '*';
|
|
1208
1234
|
fmt[3] = type;
|
|
1209
1235
|
fmt[4] = '\0';
|
|
1210
|
-
vallen =
|
|
1236
|
+
vallen = snprintf(convert, sizeof(convert), fmt, prec, value);
|
|
1211
1237
|
}
|
|
1212
1238
|
else
|
|
1213
1239
|
{
|
|
1214
1240
|
fmt[0] = '%';
|
|
1215
1241
|
fmt[1] = type;
|
|
1216
1242
|
fmt[2] = '\0';
|
|
1217
|
-
vallen =
|
|
1243
|
+
vallen = snprintf(convert, sizeof(convert), fmt, value);
|
|
1218
1244
|
}
|
|
1219
1245
|
if (vallen < 0)
|
|
1220
1246
|
goto fail;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* strerror.c
|
|
12
12
|
* Replacements for standard strerror() and strerror_r() functions
|
|
13
13
|
*
|
|
14
|
-
* Portions Copyright (c) 1996-
|
|
14
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
15
15
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
16
16
|
*
|
|
17
17
|
*
|
|
@@ -120,14 +120,10 @@ get_errno_symbol(int errnum)
|
|
|
120
120
|
return "E2BIG";
|
|
121
121
|
case EACCES:
|
|
122
122
|
return "EACCES";
|
|
123
|
-
#ifdef EADDRINUSE
|
|
124
123
|
case EADDRINUSE:
|
|
125
124
|
return "EADDRINUSE";
|
|
126
|
-
#endif
|
|
127
|
-
#ifdef EADDRNOTAVAIL
|
|
128
125
|
case EADDRNOTAVAIL:
|
|
129
126
|
return "EADDRNOTAVAIL";
|
|
130
|
-
#endif
|
|
131
127
|
case EAFNOSUPPORT:
|
|
132
128
|
return "EAFNOSUPPORT";
|
|
133
129
|
#ifdef EAGAIN
|
|
@@ -148,16 +144,12 @@ get_errno_symbol(int errnum)
|
|
|
148
144
|
return "EBUSY";
|
|
149
145
|
case ECHILD:
|
|
150
146
|
return "ECHILD";
|
|
151
|
-
#ifdef ECONNABORTED
|
|
152
147
|
case ECONNABORTED:
|
|
153
148
|
return "ECONNABORTED";
|
|
154
|
-
#endif
|
|
155
149
|
case ECONNREFUSED:
|
|
156
150
|
return "ECONNREFUSED";
|
|
157
|
-
#ifdef ECONNRESET
|
|
158
151
|
case ECONNRESET:
|
|
159
152
|
return "ECONNRESET";
|
|
160
|
-
#endif
|
|
161
153
|
case EDEADLK:
|
|
162
154
|
return "EDEADLK";
|
|
163
155
|
case EDOM:
|
|
@@ -168,10 +160,10 @@ get_errno_symbol(int errnum)
|
|
|
168
160
|
return "EFAULT";
|
|
169
161
|
case EFBIG:
|
|
170
162
|
return "EFBIG";
|
|
171
|
-
|
|
163
|
+
case EHOSTDOWN:
|
|
164
|
+
return "EHOSTDOWN";
|
|
172
165
|
case EHOSTUNREACH:
|
|
173
166
|
return "EHOSTUNREACH";
|
|
174
|
-
#endif
|
|
175
167
|
case EIDRM:
|
|
176
168
|
return "EIDRM";
|
|
177
169
|
case EINPROGRESS:
|
|
@@ -182,10 +174,8 @@ get_errno_symbol(int errnum)
|
|
|
182
174
|
return "EINVAL";
|
|
183
175
|
case EIO:
|
|
184
176
|
return "EIO";
|
|
185
|
-
#ifdef EISCONN
|
|
186
177
|
case EISCONN:
|
|
187
178
|
return "EISCONN";
|
|
188
|
-
#endif
|
|
189
179
|
case EISDIR:
|
|
190
180
|
return "EISDIR";
|
|
191
181
|
#ifdef ELOOP
|
|
@@ -200,6 +190,12 @@ get_errno_symbol(int errnum)
|
|
|
200
190
|
return "EMSGSIZE";
|
|
201
191
|
case ENAMETOOLONG:
|
|
202
192
|
return "ENAMETOOLONG";
|
|
193
|
+
case ENETDOWN:
|
|
194
|
+
return "ENETDOWN";
|
|
195
|
+
case ENETRESET:
|
|
196
|
+
return "ENETRESET";
|
|
197
|
+
case ENETUNREACH:
|
|
198
|
+
return "ENETUNREACH";
|
|
203
199
|
case ENFILE:
|
|
204
200
|
return "ENFILE";
|
|
205
201
|
case ENOBUFS:
|
|
@@ -216,20 +212,16 @@ get_errno_symbol(int errnum)
|
|
|
216
212
|
return "ENOSPC";
|
|
217
213
|
case ENOSYS:
|
|
218
214
|
return "ENOSYS";
|
|
219
|
-
#ifdef ENOTCONN
|
|
220
215
|
case ENOTCONN:
|
|
221
216
|
return "ENOTCONN";
|
|
222
|
-
#endif
|
|
223
217
|
case ENOTDIR:
|
|
224
218
|
return "ENOTDIR";
|
|
225
219
|
#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
|
|
226
220
|
case ENOTEMPTY:
|
|
227
221
|
return "ENOTEMPTY";
|
|
228
222
|
#endif
|
|
229
|
-
#ifdef ENOTSOCK
|
|
230
223
|
case ENOTSOCK:
|
|
231
224
|
return "ENOTSOCK";
|
|
232
|
-
#endif
|
|
233
225
|
#ifdef ENOTSUP
|
|
234
226
|
case ENOTSUP:
|
|
235
227
|
return "ENOTSUP";
|
|
@@ -260,10 +252,8 @@ get_errno_symbol(int errnum)
|
|
|
260
252
|
#endif
|
|
261
253
|
case ESRCH:
|
|
262
254
|
return "ESRCH";
|
|
263
|
-
#ifdef ETIMEDOUT
|
|
264
255
|
case ETIMEDOUT:
|
|
265
256
|
return "ETIMEDOUT";
|
|
266
|
-
#endif
|
|
267
257
|
#ifdef ETXTBSY
|
|
268
258
|
case ETXTBSY:
|
|
269
259
|
return "ETXTBSY";
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Fallback implementation of strnlen().
|
|
11
11
|
*
|
|
12
12
|
*
|
|
13
|
-
* Portions Copyright (c) 1996-
|
|
13
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
14
14
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
15
15
|
*
|
|
16
16
|
* IDENTIFICATION
|
data/lib/pg_query/deparse.rb
CHANGED
|
@@ -7,7 +7,13 @@ module PgQuery
|
|
|
7
7
|
|
|
8
8
|
# Reconstruct all of the parsed queries into their original form
|
|
9
9
|
def self.deparse(tree)
|
|
10
|
-
PgQuery
|
|
10
|
+
if PgQuery::ParseResult.method(:encode).arity == 1
|
|
11
|
+
PgQuery.deparse_protobuf(PgQuery::ParseResult.encode(tree)).force_encoding('UTF-8')
|
|
12
|
+
elsif PgQuery::ParseResult.method(:encode).arity == -1
|
|
13
|
+
PgQuery.deparse_protobuf(PgQuery::ParseResult.encode(tree, recursion_limit: 1_000)).force_encoding('UTF-8')
|
|
14
|
+
else
|
|
15
|
+
raise ArgumentError, 'Unsupported protobuf Ruby API'
|
|
16
|
+
end
|
|
11
17
|
end
|
|
12
18
|
|
|
13
19
|
# Convenience method for deparsing a statement of a specific type
|
|
@@ -42,14 +42,16 @@ module PgQuery
|
|
|
42
42
|
statements << item.common_table_expr.ctequery if item.node == :common_table_expr
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
when :SETOP_UNION
|
|
46
|
-
statements << statement.select_stmt.larg if statement.select_stmt.larg
|
|
47
|
-
statements << statement.select_stmt.rarg if statement.select_stmt.rarg
|
|
45
|
+
when :SETOP_UNION, :SETOP_EXCEPT, :SETOP_INTERSECT
|
|
46
|
+
statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
|
|
47
|
+
statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
|
|
48
48
|
end
|
|
49
49
|
when :update_stmt
|
|
50
50
|
condition_items << statement.update_stmt.where_clause if statement.update_stmt.where_clause
|
|
51
51
|
when :delete_stmt
|
|
52
52
|
condition_items << statement.delete_stmt.where_clause if statement.delete_stmt.where_clause
|
|
53
|
+
when :index_stmt
|
|
54
|
+
condition_items << statement.index_stmt.where_clause if statement.index_stmt.where_clause
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
|
@@ -67,7 +69,7 @@ module PgQuery
|
|
|
67
69
|
when :row_expr
|
|
68
70
|
condition_items += next_item.row_expr.args
|
|
69
71
|
when :column_ref
|
|
70
|
-
column, table = next_item.column_ref.fields.map { |f| f.string.
|
|
72
|
+
column, table = next_item.column_ref.fields.map { |f| f.string.sval }.reverse
|
|
71
73
|
filter_columns << [@aliases[table] || table, column]
|
|
72
74
|
when :null_test
|
|
73
75
|
condition_items << next_item.null_test.arg
|
data/lib/pg_query/fingerprint.rb
CHANGED
|
@@ -39,6 +39,11 @@ module PgQuery
|
|
|
39
39
|
subhash = FingerprintSubHash.new
|
|
40
40
|
|
|
41
41
|
if val.is_a?(Google::Protobuf::RepeatedField)
|
|
42
|
+
# For lists that have exactly one untyped node, just output the parent field (if needed) and return
|
|
43
|
+
if val.length == 1 && val[0].is_a?(Node) && val[0].node.nil?
|
|
44
|
+
hash.update(parent_field_name) if need_to_write_name
|
|
45
|
+
return
|
|
46
|
+
end
|
|
42
47
|
fingerprint_list(val, subhash, parent_node_name, parent_field_name)
|
|
43
48
|
elsif val.is_a?(List)
|
|
44
49
|
fingerprint_list(val.items, subhash, parent_node_name, parent_field_name)
|
|
@@ -55,7 +60,7 @@ module PgQuery
|
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
def ignored_node_type?(node)
|
|
58
|
-
[A_Const, Alias, ParamRef, SetToDefault, IntList, OidList
|
|
63
|
+
[A_Const, Alias, ParamRef, SetToDefault, IntList, OidList].include?(node.class) ||
|
|
59
64
|
node.is_a?(TypeCast) && (node.arg.node == :a_const || node.arg.node == :param_ref)
|
|
60
65
|
end
|
|
61
66
|
|
|
@@ -90,12 +95,18 @@ module PgQuery
|
|
|
90
95
|
when 'location'
|
|
91
96
|
next
|
|
92
97
|
when 'name'
|
|
93
|
-
next if [PrepareStmt, ExecuteStmt, DeallocateStmt].include?(node.class)
|
|
98
|
+
next if [PrepareStmt, ExecuteStmt, DeallocateStmt, FunctionParameter].include?(node.class)
|
|
94
99
|
next if node.is_a?(ResTarget) && parent_node_name == 'SelectStmt' && parent_field_name == 'targetList'
|
|
95
|
-
when 'gid', '
|
|
100
|
+
when 'gid', 'savepoint_name'
|
|
96
101
|
next if node.is_a?(TransactionStmt)
|
|
102
|
+
when 'options'
|
|
103
|
+
next if [TransactionStmt, CreateFunctionStmt].include?(node.class)
|
|
97
104
|
when 'portalname'
|
|
98
105
|
next if [DeclareCursorStmt, FetchStmt, ClosePortalStmt].include?(node.class)
|
|
106
|
+
when 'conditionname'
|
|
107
|
+
next if [ListenStmt, UnlistenStmt, NotifyStmt].include?(node.class)
|
|
108
|
+
when 'args'
|
|
109
|
+
next if node.is_a?(DoStmt)
|
|
99
110
|
when 'relname'
|
|
100
111
|
next if node.is_a?(RangeVar) && node.relpersistence == 't'
|
|
101
112
|
if node.is_a?(RangeVar)
|
|
@@ -111,6 +122,10 @@ module PgQuery
|
|
|
111
122
|
fingerprint_value(:AEXPR_OP, hash, postgres_node_name, postgres_field_name, true)
|
|
112
123
|
next
|
|
113
124
|
end
|
|
125
|
+
# libpg_query still outputs `str` parts when print a string node. Here we override that to
|
|
126
|
+
# the expected field name of `sval`.
|
|
127
|
+
when 'sval', 'fval', 'bsval'
|
|
128
|
+
postgres_field_name = 'str' if node.is_a?(String) || node.is_a?(BitString) || node.is_a?(Float)
|
|
114
129
|
end
|
|
115
130
|
|
|
116
131
|
fingerprint_value(val, hash, postgres_node_name, postgres_field_name, true)
|
data/lib/pg_query/node.rb
CHANGED
|
@@ -20,8 +20,8 @@ module PgQuery
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
# Make it easier to initialize value nodes
|
|
23
|
-
def self.from_string(
|
|
24
|
-
PgQuery::Node.new(string: PgQuery::String.new(
|
|
23
|
+
def self.from_string(sval)
|
|
24
|
+
PgQuery::Node.new(string: PgQuery::String.new(sval: sval))
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def self.from_integer(ival)
|
data/lib/pg_query/param_refs.rb
CHANGED
|
@@ -29,7 +29,7 @@ module PgQuery
|
|
|
29
29
|
location = typeloc
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
results << { 'location' => location, 'length' => length, 'typename' => t.names.map { |n| n.string.
|
|
32
|
+
results << { 'location' => location, 'length' => length, 'typename' => t.names.map { |n| n.string.sval } }
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
35
|
|
data/lib/pg_query/parse.rb
CHANGED
|
@@ -3,7 +3,13 @@ module PgQuery
|
|
|
3
3
|
result, stderr = parse_protobuf(query)
|
|
4
4
|
|
|
5
5
|
begin
|
|
6
|
-
result = PgQuery::ParseResult.decode
|
|
6
|
+
result = if PgQuery::ParseResult.method(:decode).arity == 1
|
|
7
|
+
PgQuery::ParseResult.decode(result)
|
|
8
|
+
elsif PgQuery::ParseResult.method(:decode).arity == -1
|
|
9
|
+
PgQuery::ParseResult.decode(result, recursion_limit: 1_000)
|
|
10
|
+
else
|
|
11
|
+
raise ArgumentError, 'Unsupported protobuf Ruby API'
|
|
12
|
+
end
|
|
7
13
|
rescue Google::Protobuf::ParseError => e
|
|
8
14
|
raise PgQuery::ParseError.new(format('Failed to parse tree: %s', e.message), __FILE__, __LINE__, -1)
|
|
9
15
|
end
|
|
@@ -89,6 +95,10 @@ module PgQuery
|
|
|
89
95
|
|
|
90
96
|
protected
|
|
91
97
|
|
|
98
|
+
# Parses the query and finds table and function references
|
|
99
|
+
#
|
|
100
|
+
# Note we use ".to_ary" on arrays from the Protobuf library before
|
|
101
|
+
# passing them to concat, because of https://bugs.ruby-lang.org/issues/18140
|
|
92
102
|
def load_objects! # rubocop:disable Metrics/CyclomaticComplexity
|
|
93
103
|
@tables = [] # types: select, dml, ddl
|
|
94
104
|
@cte_names = []
|
|
@@ -108,22 +118,18 @@ module PgQuery
|
|
|
108
118
|
# The following statement types do not modify tables and are added to from_clause_items
|
|
109
119
|
# (and subsequently @tables)
|
|
110
120
|
when :select_stmt
|
|
111
|
-
subselect_items.concat(statement.select_stmt.target_list)
|
|
121
|
+
subselect_items.concat(statement.select_stmt.target_list.to_ary)
|
|
112
122
|
subselect_items << statement.select_stmt.where_clause if statement.select_stmt.where_clause
|
|
113
123
|
subselect_items.concat(statement.select_stmt.sort_clause.collect { |h| h.sort_by.node })
|
|
114
|
-
subselect_items.concat(statement.select_stmt.group_clause)
|
|
124
|
+
subselect_items.concat(statement.select_stmt.group_clause.to_ary)
|
|
115
125
|
subselect_items << statement.select_stmt.having_clause if statement.select_stmt.having_clause
|
|
116
126
|
|
|
117
127
|
case statement.select_stmt.op
|
|
118
128
|
when :SETOP_NONE
|
|
119
129
|
(statement.select_stmt.from_clause || []).each do |item|
|
|
120
|
-
|
|
121
|
-
statements << item.range_subselect.subquery
|
|
122
|
-
else
|
|
123
|
-
from_clause_items << { item: item, type: :select }
|
|
124
|
-
end
|
|
130
|
+
from_clause_items << { item: item, type: :select }
|
|
125
131
|
end
|
|
126
|
-
when :SETOP_UNION
|
|
132
|
+
when :SETOP_UNION, :SETOP_EXCEPT, :SETOP_INTERSECT
|
|
127
133
|
statements << PgQuery::Node.new(select_stmt: statement.select_stmt.larg) if statement.select_stmt.larg
|
|
128
134
|
statements << PgQuery::Node.new(select_stmt: statement.select_stmt.rarg) if statement.select_stmt.rarg
|
|
129
135
|
end
|
|
@@ -133,6 +139,10 @@ module PgQuery
|
|
|
133
139
|
@cte_names.concat(cte_names)
|
|
134
140
|
statements.concat(cte_statements)
|
|
135
141
|
end
|
|
142
|
+
|
|
143
|
+
if statement.select_stmt.into_clause
|
|
144
|
+
from_clause_items << { item: PgQuery::Node.new(range_var: statement.select_stmt.into_clause.rel), type: :ddl }
|
|
145
|
+
end
|
|
136
146
|
# The following statements modify the contents of a table
|
|
137
147
|
when :insert_stmt, :update_stmt, :delete_stmt
|
|
138
148
|
value = statement.public_send(statement.node)
|
|
@@ -143,12 +153,18 @@ module PgQuery
|
|
|
143
153
|
value.from_clause.each do |item|
|
|
144
154
|
from_clause_items << { item: item, type: :select }
|
|
145
155
|
end
|
|
146
|
-
subselect_items.concat(statement.update_stmt.target_list)
|
|
156
|
+
subselect_items.concat(statement.update_stmt.target_list.to_ary)
|
|
147
157
|
end
|
|
148
158
|
|
|
149
159
|
subselect_items << statement.update_stmt.where_clause if statement.node == :update_stmt && statement.update_stmt.where_clause
|
|
150
160
|
subselect_items << statement.delete_stmt.where_clause if statement.node == :delete_stmt && statement.delete_stmt.where_clause
|
|
151
161
|
|
|
162
|
+
if statement.node == :delete_stmt
|
|
163
|
+
statement.delete_stmt.using_clause.each do |using_clause|
|
|
164
|
+
from_clause_items << { item: using_clause, type: :select }
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
152
168
|
if value.with_clause
|
|
153
169
|
cte_statements, cte_names = statements_and_cte_names_for_with_clause(value.with_clause)
|
|
154
170
|
@cte_names.concat(cte_names)
|
|
@@ -159,7 +175,12 @@ module PgQuery
|
|
|
159
175
|
statements << statement.copy_stmt.query
|
|
160
176
|
# The following statement types are DDL (changing table structure)
|
|
161
177
|
when :alter_table_stmt
|
|
162
|
-
|
|
178
|
+
case statement.alter_table_stmt.objtype
|
|
179
|
+
when :OBJECT_INDEX # Index # rubocop:disable Lint/EmptyWhen
|
|
180
|
+
# ignore `ALTER INDEX index_name`
|
|
181
|
+
else
|
|
182
|
+
from_clause_items << { item: PgQuery::Node.new(range_var: statement.alter_table_stmt.relation), type: :ddl }
|
|
183
|
+
end
|
|
163
184
|
when :create_stmt
|
|
164
185
|
from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_stmt.relation), type: :ddl }
|
|
165
186
|
when :create_table_as_stmt
|
|
@@ -174,6 +195,11 @@ module PgQuery
|
|
|
174
195
|
statements << statement.view_stmt.query
|
|
175
196
|
when :index_stmt
|
|
176
197
|
from_clause_items << { item: PgQuery::Node.new(range_var: statement.index_stmt.relation), type: :ddl }
|
|
198
|
+
statement.index_stmt.index_params.each do |p|
|
|
199
|
+
next if p.index_elem.expr.nil?
|
|
200
|
+
subselect_items << p.index_elem.expr
|
|
201
|
+
end
|
|
202
|
+
subselect_items << statement.index_stmt.where_clause if statement.index_stmt.where_clause
|
|
177
203
|
when :create_trig_stmt
|
|
178
204
|
from_clause_items << { item: PgQuery::Node.new(range_var: statement.create_trig_stmt.relation), type: :ddl }
|
|
179
205
|
when :rule_stmt
|
|
@@ -186,9 +212,9 @@ module PgQuery
|
|
|
186
212
|
objects = statement.drop_stmt.objects.map do |obj|
|
|
187
213
|
case obj.node
|
|
188
214
|
when :list
|
|
189
|
-
obj.list.items.map { |obj2| obj2.string.
|
|
215
|
+
obj.list.items.map { |obj2| obj2.string.sval if obj2.node == :string }
|
|
190
216
|
when :string
|
|
191
|
-
obj.string.
|
|
217
|
+
obj.string.sval
|
|
192
218
|
end
|
|
193
219
|
end
|
|
194
220
|
case statement.drop_stmt.remove_type
|
|
@@ -199,7 +225,7 @@ module PgQuery
|
|
|
199
225
|
when :OBJECT_FUNCTION
|
|
200
226
|
# Only one function can be dropped in a statement
|
|
201
227
|
obj = statement.drop_stmt.objects[0].object_with_args
|
|
202
|
-
@functions << { function: obj.objname
|
|
228
|
+
@functions << { function: obj.objname.map { |f| f.string.sval }.join('.'), type: :ddl }
|
|
203
229
|
end
|
|
204
230
|
when :grant_stmt
|
|
205
231
|
objects = statement.grant_stmt.objects
|
|
@@ -218,24 +244,28 @@ module PgQuery
|
|
|
218
244
|
statements << statement.explain_stmt.query
|
|
219
245
|
when :create_function_stmt
|
|
220
246
|
@functions << {
|
|
221
|
-
function: statement.create_function_stmt.funcname
|
|
247
|
+
function: statement.create_function_stmt.funcname.map { |f| f.string.sval }.join('.'),
|
|
222
248
|
type: :ddl
|
|
223
249
|
}
|
|
224
250
|
when :rename_stmt
|
|
225
251
|
if statement.rename_stmt.rename_type == :OBJECT_FUNCTION
|
|
226
|
-
original_name = statement.rename_stmt.object.object_with_args.objname
|
|
252
|
+
original_name = statement.rename_stmt.object.object_with_args.objname.map { |f| f.string.sval }.join('.')
|
|
227
253
|
new_name = statement.rename_stmt.newname
|
|
228
254
|
@functions += [
|
|
229
255
|
{ function: original_name, type: :ddl },
|
|
230
256
|
{ function: new_name, type: :ddl }
|
|
231
257
|
]
|
|
232
258
|
end
|
|
259
|
+
when :prepare_stmt
|
|
260
|
+
statements << statement.prepare_stmt.query
|
|
233
261
|
end
|
|
234
262
|
end
|
|
235
263
|
|
|
236
264
|
next_item = subselect_items.shift
|
|
237
265
|
if next_item
|
|
238
266
|
case next_item.node
|
|
267
|
+
when :list
|
|
268
|
+
subselect_items += next_item.list.items.to_ary
|
|
239
269
|
when :a_expr
|
|
240
270
|
%w[lexpr rexpr].each do |side|
|
|
241
271
|
elem = next_item.a_expr.public_send(side)
|
|
@@ -247,56 +277,62 @@ module PgQuery
|
|
|
247
277
|
end
|
|
248
278
|
end
|
|
249
279
|
when :bool_expr
|
|
250
|
-
subselect_items.concat(next_item.bool_expr.args)
|
|
280
|
+
subselect_items.concat(next_item.bool_expr.args.to_ary)
|
|
251
281
|
when :coalesce_expr
|
|
252
|
-
subselect_items.concat(next_item.coalesce_expr.args)
|
|
282
|
+
subselect_items.concat(next_item.coalesce_expr.args.to_ary)
|
|
253
283
|
when :min_max_expr
|
|
254
|
-
subselect_items.concat(next_item.min_max_expr.args)
|
|
284
|
+
subselect_items.concat(next_item.min_max_expr.args.to_ary)
|
|
255
285
|
when :res_target
|
|
256
286
|
subselect_items << next_item.res_target.val
|
|
257
287
|
when :sub_link
|
|
258
288
|
statements << next_item.sub_link.subselect
|
|
259
289
|
when :func_call
|
|
290
|
+
subselect_items.concat(next_item.func_call.args.to_ary)
|
|
260
291
|
@functions << {
|
|
261
|
-
function: next_item.func_call.funcname
|
|
292
|
+
function: next_item.func_call.funcname.map { |f| f.string.sval }.join('.'),
|
|
262
293
|
type: :call
|
|
263
294
|
}
|
|
295
|
+
when :case_expr
|
|
296
|
+
subselect_items.concat(next_item.case_expr.args.map { |arg| arg.case_when.expr })
|
|
297
|
+
subselect_items.concat(next_item.case_expr.args.map { |arg| arg.case_when.result })
|
|
298
|
+
subselect_items << next_item.case_expr.defresult
|
|
299
|
+
when :type_cast
|
|
300
|
+
subselect_items << next_item.type_cast.arg
|
|
264
301
|
end
|
|
265
302
|
end
|
|
266
303
|
|
|
267
|
-
break if subselect_items.empty? && statements.empty?
|
|
268
|
-
end
|
|
269
|
-
|
|
270
|
-
loop do
|
|
271
304
|
next_item = from_clause_items.shift
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
305
|
+
if next_item && next_item[:item]
|
|
306
|
+
case next_item[:item].node
|
|
307
|
+
when :join_expr
|
|
308
|
+
from_clause_items << { item: next_item[:item].join_expr.larg, type: next_item[:type] }
|
|
309
|
+
from_clause_items << { item: next_item[:item].join_expr.rarg, type: next_item[:type] }
|
|
310
|
+
subselect_items << next_item[:item].join_expr.quals
|
|
311
|
+
when :row_expr
|
|
312
|
+
from_clause_items += next_item[:item].row_expr.args.map { |a| { item: a, type: next_item[:type] } }
|
|
313
|
+
when :range_var
|
|
314
|
+
rangevar = next_item[:item].range_var
|
|
315
|
+
next if rangevar.schemaname.empty? && @cte_names.include?(rangevar.relname)
|
|
316
|
+
|
|
317
|
+
table = [rangevar.schemaname, rangevar.relname].reject { |s| s.nil? || s.empty? }.join('.')
|
|
318
|
+
@tables << {
|
|
319
|
+
name: table,
|
|
320
|
+
type: next_item[:type],
|
|
321
|
+
location: rangevar.location,
|
|
322
|
+
schemaname: (rangevar.schemaname unless rangevar.schemaname.empty?),
|
|
323
|
+
relname: rangevar.relname,
|
|
324
|
+
inh: rangevar.inh,
|
|
325
|
+
relpersistence: rangevar.relpersistence
|
|
326
|
+
}
|
|
327
|
+
@aliases[rangevar.alias.aliasname] = table if rangevar.alias
|
|
328
|
+
when :range_subselect
|
|
329
|
+
statements << next_item[:item].range_subselect.subquery
|
|
330
|
+
when :range_function
|
|
331
|
+
subselect_items += next_item[:item].range_function.functions
|
|
332
|
+
end
|
|
299
333
|
end
|
|
334
|
+
|
|
335
|
+
break if subselect_items.empty? && statements.empty? && from_clause_items.empty?
|
|
300
336
|
end
|
|
301
337
|
|
|
302
338
|
@tables.uniq!
|