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
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*-------------------------------------------------------------------------
|
|
2
|
+
*
|
|
3
|
+
* dshash.h
|
|
4
|
+
* Concurrent hash tables backed by dynamic shared memory areas.
|
|
5
|
+
*
|
|
6
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
7
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
8
|
+
*
|
|
9
|
+
* IDENTIFICATION
|
|
10
|
+
* src/include/lib/dshash.h
|
|
11
|
+
*
|
|
12
|
+
*-------------------------------------------------------------------------
|
|
13
|
+
*/
|
|
14
|
+
#ifndef DSHASH_H
|
|
15
|
+
#define DSHASH_H
|
|
16
|
+
|
|
17
|
+
#include "utils/dsa.h"
|
|
18
|
+
|
|
19
|
+
/* The opaque type representing a hash table. */
|
|
20
|
+
struct dshash_table;
|
|
21
|
+
typedef struct dshash_table dshash_table;
|
|
22
|
+
|
|
23
|
+
/* A handle for a dshash_table which can be shared with other processes. */
|
|
24
|
+
typedef dsa_pointer dshash_table_handle;
|
|
25
|
+
|
|
26
|
+
/* The type for hash values. */
|
|
27
|
+
typedef uint32 dshash_hash;
|
|
28
|
+
|
|
29
|
+
/* A function type for comparing keys. */
|
|
30
|
+
typedef int (*dshash_compare_function) (const void *a, const void *b,
|
|
31
|
+
size_t size, void *arg);
|
|
32
|
+
|
|
33
|
+
/* A function type for computing hash values for keys. */
|
|
34
|
+
typedef dshash_hash (*dshash_hash_function) (const void *v, size_t size,
|
|
35
|
+
void *arg);
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* The set of parameters needed to create or attach to a hash table. The
|
|
39
|
+
* members tranche_id and tranche_name do not need to be initialized when
|
|
40
|
+
* attaching to an existing hash table.
|
|
41
|
+
*
|
|
42
|
+
* Compare and hash functions must be supplied even when attaching, because we
|
|
43
|
+
* can't safely share function pointers between backends in general. Either
|
|
44
|
+
* the arg variants or the non-arg variants should be supplied; the other
|
|
45
|
+
* function pointers should be NULL. If the arg variants are supplied then the
|
|
46
|
+
* user data pointer supplied to the create and attach functions will be
|
|
47
|
+
* passed to the hash and compare functions.
|
|
48
|
+
*/
|
|
49
|
+
typedef struct dshash_parameters
|
|
50
|
+
{
|
|
51
|
+
size_t key_size; /* Size of the key (initial bytes of entry) */
|
|
52
|
+
size_t entry_size; /* Total size of entry */
|
|
53
|
+
dshash_compare_function compare_function; /* Compare function */
|
|
54
|
+
dshash_hash_function hash_function; /* Hash function */
|
|
55
|
+
int tranche_id; /* The tranche ID to use for locks */
|
|
56
|
+
} dshash_parameters;
|
|
57
|
+
|
|
58
|
+
/* Forward declaration of private types for use only by dshash.c. */
|
|
59
|
+
struct dshash_table_item;
|
|
60
|
+
typedef struct dshash_table_item dshash_table_item;
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* Sequential scan state. The detail is exposed to let users know the storage
|
|
64
|
+
* size but it should be considered as an opaque type by callers.
|
|
65
|
+
*/
|
|
66
|
+
typedef struct dshash_seq_status
|
|
67
|
+
{
|
|
68
|
+
dshash_table *hash_table; /* dshash table working on */
|
|
69
|
+
int curbucket; /* bucket number we are at */
|
|
70
|
+
int nbuckets; /* total number of buckets in the dshash */
|
|
71
|
+
dshash_table_item *curitem; /* item we are currently at */
|
|
72
|
+
dsa_pointer pnextitem; /* dsa-pointer to the next item */
|
|
73
|
+
int curpartition; /* partition number we are at */
|
|
74
|
+
bool exclusive; /* locking mode */
|
|
75
|
+
} dshash_seq_status;
|
|
76
|
+
|
|
77
|
+
/* Creating, sharing and destroying from hash tables. */
|
|
78
|
+
extern dshash_table *dshash_create(dsa_area *area,
|
|
79
|
+
const dshash_parameters *params,
|
|
80
|
+
void *arg);
|
|
81
|
+
extern dshash_table *dshash_attach(dsa_area *area,
|
|
82
|
+
const dshash_parameters *params,
|
|
83
|
+
dshash_table_handle handle,
|
|
84
|
+
void *arg);
|
|
85
|
+
extern void dshash_detach(dshash_table *hash_table);
|
|
86
|
+
extern dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table);
|
|
87
|
+
extern void dshash_destroy(dshash_table *hash_table);
|
|
88
|
+
|
|
89
|
+
/* Finding, creating, deleting entries. */
|
|
90
|
+
extern void *dshash_find(dshash_table *hash_table,
|
|
91
|
+
const void *key, bool exclusive);
|
|
92
|
+
extern void *dshash_find_or_insert(dshash_table *hash_table,
|
|
93
|
+
const void *key, bool *found);
|
|
94
|
+
extern bool dshash_delete_key(dshash_table *hash_table, const void *key);
|
|
95
|
+
extern void dshash_delete_entry(dshash_table *hash_table, void *entry);
|
|
96
|
+
extern void dshash_release_lock(dshash_table *hash_table, void *entry);
|
|
97
|
+
|
|
98
|
+
/* seq scan support */
|
|
99
|
+
extern void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table,
|
|
100
|
+
bool exclusive);
|
|
101
|
+
extern void *dshash_seq_next(dshash_seq_status *status);
|
|
102
|
+
extern void dshash_seq_term(dshash_seq_status *status);
|
|
103
|
+
extern void dshash_delete_current(dshash_seq_status *status);
|
|
104
|
+
|
|
105
|
+
/* Convenience hash and compare functions wrapping memcmp and tag_hash. */
|
|
106
|
+
extern int dshash_memcmp(const void *a, const void *b, size_t size, void *arg);
|
|
107
|
+
extern dshash_hash dshash_memhash(const void *v, size_t size, void *arg);
|
|
108
|
+
|
|
109
|
+
/* Debugging support. */
|
|
110
|
+
extern void dshash_dump(dshash_table *hash_table);
|
|
111
|
+
|
|
112
|
+
#endif /* DSHASH_H */
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
* }
|
|
97
97
|
*
|
|
98
98
|
*
|
|
99
|
-
* Portions Copyright (c) 1996-
|
|
99
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
100
100
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
101
101
|
*
|
|
102
102
|
* IDENTIFICATION
|
|
@@ -394,6 +394,25 @@ dlist_move_head(dlist_head *head, dlist_node *node)
|
|
|
394
394
|
dlist_check(head);
|
|
395
395
|
}
|
|
396
396
|
|
|
397
|
+
/*
|
|
398
|
+
* Move element from its current position in the list to the tail position in
|
|
399
|
+
* the same list.
|
|
400
|
+
*
|
|
401
|
+
* Undefined behaviour if 'node' is not already part of the list.
|
|
402
|
+
*/
|
|
403
|
+
static inline void
|
|
404
|
+
dlist_move_tail(dlist_head *head, dlist_node *node)
|
|
405
|
+
{
|
|
406
|
+
/* fast path if it's already at the tail */
|
|
407
|
+
if (head->head.prev == node)
|
|
408
|
+
return;
|
|
409
|
+
|
|
410
|
+
dlist_delete(node);
|
|
411
|
+
dlist_push_tail(head, node);
|
|
412
|
+
|
|
413
|
+
dlist_check(head);
|
|
414
|
+
}
|
|
415
|
+
|
|
397
416
|
/*
|
|
398
417
|
* Check whether 'node' has a following node.
|
|
399
418
|
* Caution: unreliable if 'node' is not in the list.
|
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* simplehash.h
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* When included this file generates a "templated" (by way of macros)
|
|
5
|
+
* open-addressing hash table implementation specialized to user-defined
|
|
6
|
+
* types.
|
|
7
|
+
*
|
|
8
|
+
* It's probably not worthwhile to generate such a specialized implementation
|
|
9
|
+
* for hash tables that aren't performance or space sensitive.
|
|
10
|
+
*
|
|
11
|
+
* Compared to dynahash, simplehash has the following benefits:
|
|
12
|
+
*
|
|
13
|
+
* - Due to the "templated" code generation has known structure sizes and no
|
|
14
|
+
* indirect function calls (which show up substantially in dynahash
|
|
15
|
+
* profiles). These features considerably increase speed for small
|
|
16
|
+
* entries.
|
|
17
|
+
* - Open addressing has better CPU cache behavior than dynahash's chained
|
|
18
|
+
* hashtables.
|
|
19
|
+
* - The generated interface is type-safe and easier to use than dynahash,
|
|
20
|
+
* though at the cost of more complex setup.
|
|
21
|
+
* - Allocates memory in a MemoryContext or another allocator with a
|
|
22
|
+
* malloc/free style interface (which isn't easily usable in a shared
|
|
23
|
+
* memory context)
|
|
24
|
+
* - Does not require the overhead of a separate memory context.
|
|
8
25
|
*
|
|
9
26
|
* Usage notes:
|
|
10
27
|
*
|
|
@@ -24,7 +41,7 @@
|
|
|
24
41
|
* - SH_SCOPE - in which scope (e.g. extern, static inline) do function
|
|
25
42
|
* declarations reside
|
|
26
43
|
* - SH_RAW_ALLOCATOR - if defined, memory contexts are not used; instead,
|
|
27
|
-
* use this to allocate bytes
|
|
44
|
+
* use this to allocate bytes. The allocator must zero the returned space.
|
|
28
45
|
* - SH_USE_NONDEFAULT_ALLOCATOR - if defined no element allocator functions
|
|
29
46
|
* are defined, so you can supply your own
|
|
30
47
|
* The following parameters are only relevant when SH_DEFINE is defined:
|
|
@@ -34,6 +51,20 @@
|
|
|
34
51
|
* - SH_STORE_HASH - if defined the hash is stored in the elements
|
|
35
52
|
* - SH_GET_HASH(tb, a) - return the field to store the hash in
|
|
36
53
|
*
|
|
54
|
+
* The element type is required to contain a "status" member that can store
|
|
55
|
+
* the range of values defined in the SH_STATUS enum.
|
|
56
|
+
*
|
|
57
|
+
* While SH_STORE_HASH (and subsequently SH_GET_HASH) are optional, because
|
|
58
|
+
* the hash table implementation needs to compare hashes to move elements
|
|
59
|
+
* (particularly when growing the hash), it's preferable, if possible, to
|
|
60
|
+
* store the element's hash in the element's data type. If the hash is so
|
|
61
|
+
* stored, the hash table will also compare hashes before calling SH_EQUAL
|
|
62
|
+
* when comparing two keys.
|
|
63
|
+
*
|
|
64
|
+
* For convenience the hash table create functions accept a void pointer
|
|
65
|
+
* that will be stored in the hash table type's member private_data. This
|
|
66
|
+
* allows callbacks to reference caller provided data.
|
|
67
|
+
*
|
|
37
68
|
* For examples of usage look at tidbitmap.c (file local definition) and
|
|
38
69
|
* execnodes.h/execGrouping.c (exposed declaration, file local
|
|
39
70
|
* implementation).
|
|
@@ -55,6 +86,11 @@
|
|
|
55
86
|
* presence is relevant to determine whether a lookup needs to continue
|
|
56
87
|
* looking or is done - buckets following a deleted element are shifted
|
|
57
88
|
* backwards, unless they're empty or already at their optimal position.
|
|
89
|
+
*
|
|
90
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
91
|
+
* Portions Copyright (c) 1994, Regents of the University of California
|
|
92
|
+
*
|
|
93
|
+
* src/include/lib/simplehash.h
|
|
58
94
|
*/
|
|
59
95
|
|
|
60
96
|
#include "port/pg_bitutils.h"
|
|
@@ -79,6 +115,7 @@
|
|
|
79
115
|
#define SH_RESET SH_MAKE_NAME(reset)
|
|
80
116
|
#define SH_INSERT SH_MAKE_NAME(insert)
|
|
81
117
|
#define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
|
|
118
|
+
#define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
|
|
82
119
|
#define SH_DELETE SH_MAKE_NAME(delete)
|
|
83
120
|
#define SH_LOOKUP SH_MAKE_NAME(lookup)
|
|
84
121
|
#define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
|
|
@@ -149,24 +186,62 @@ typedef struct SH_ITERATOR
|
|
|
149
186
|
|
|
150
187
|
/* externally visible function prototypes */
|
|
151
188
|
#ifdef SH_RAW_ALLOCATOR
|
|
189
|
+
/* <prefix>_hash <prefix>_create(uint32 nelements, void *private_data) */
|
|
152
190
|
SH_SCOPE SH_TYPE *SH_CREATE(uint32 nelements, void *private_data);
|
|
153
191
|
#else
|
|
192
|
+
/*
|
|
193
|
+
* <prefix>_hash <prefix>_create(MemoryContext ctx, uint32 nelements,
|
|
194
|
+
* void *private_data)
|
|
195
|
+
*/
|
|
154
196
|
SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
|
|
155
197
|
void *private_data);
|
|
156
198
|
#endif
|
|
199
|
+
|
|
200
|
+
/* void <prefix>_destroy(<prefix>_hash *tb) */
|
|
157
201
|
SH_SCOPE void SH_DESTROY(SH_TYPE * tb);
|
|
202
|
+
|
|
203
|
+
/* void <prefix>_reset(<prefix>_hash *tb) */
|
|
158
204
|
SH_SCOPE void SH_RESET(SH_TYPE * tb);
|
|
159
|
-
|
|
205
|
+
|
|
206
|
+
/* void <prefix>_grow(<prefix>_hash *tb, uint64 newsize) */
|
|
207
|
+
SH_SCOPE void SH_GROW(SH_TYPE * tb, uint64 newsize);
|
|
208
|
+
|
|
209
|
+
/* <element> *<prefix>_insert(<prefix>_hash *tb, <key> key, bool *found) */
|
|
160
210
|
SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT(SH_TYPE * tb, SH_KEY_TYPE key, bool *found);
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* <element> *<prefix>_insert_hash(<prefix>_hash *tb, <key> key, uint32 hash,
|
|
214
|
+
* bool *found)
|
|
215
|
+
*/
|
|
161
216
|
SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
|
|
162
217
|
uint32 hash, bool *found);
|
|
218
|
+
|
|
219
|
+
/* <element> *<prefix>_lookup(<prefix>_hash *tb, <key> key) */
|
|
163
220
|
SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP(SH_TYPE * tb, SH_KEY_TYPE key);
|
|
221
|
+
|
|
222
|
+
/* <element> *<prefix>_lookup_hash(<prefix>_hash *tb, <key> key, uint32 hash) */
|
|
164
223
|
SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
|
|
165
224
|
uint32 hash);
|
|
225
|
+
|
|
226
|
+
/* void <prefix>_delete_item(<prefix>_hash *tb, <element> *entry) */
|
|
227
|
+
SH_SCOPE void SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry);
|
|
228
|
+
|
|
229
|
+
/* bool <prefix>_delete(<prefix>_hash *tb, <key> key) */
|
|
166
230
|
SH_SCOPE bool SH_DELETE(SH_TYPE * tb, SH_KEY_TYPE key);
|
|
231
|
+
|
|
232
|
+
/* void <prefix>_start_iterate(<prefix>_hash *tb, <prefix>_iterator *iter) */
|
|
167
233
|
SH_SCOPE void SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
|
|
234
|
+
|
|
235
|
+
/*
|
|
236
|
+
* void <prefix>_start_iterate_at(<prefix>_hash *tb, <prefix>_iterator *iter,
|
|
237
|
+
* uint32 at)
|
|
238
|
+
*/
|
|
168
239
|
SH_SCOPE void SH_START_ITERATE_AT(SH_TYPE * tb, SH_ITERATOR * iter, uint32 at);
|
|
240
|
+
|
|
241
|
+
/* <element> *<prefix>_iterate(<prefix>_hash *tb, <prefix>_iterator *iter) */
|
|
169
242
|
SH_SCOPE SH_ELEMENT_TYPE *SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
|
|
243
|
+
|
|
244
|
+
/* void <prefix>_stat(<prefix>_hash *tb */
|
|
170
245
|
SH_SCOPE void SH_STAT(SH_TYPE * tb);
|
|
171
246
|
|
|
172
247
|
#endif /* SH_DECLARE */
|
|
@@ -218,7 +293,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
|
|
|
218
293
|
#define SIMPLEHASH_H
|
|
219
294
|
|
|
220
295
|
#ifdef FRONTEND
|
|
221
|
-
#define sh_error(...)
|
|
296
|
+
#define sh_error(...) pg_fatal(__VA_ARGS__)
|
|
222
297
|
#define sh_log(...) pg_log_info(__VA_ARGS__)
|
|
223
298
|
#else
|
|
224
299
|
#define sh_error(...) elog(ERROR, __VA_ARGS__)
|
|
@@ -232,7 +307,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
|
|
|
232
307
|
* the hashtable.
|
|
233
308
|
*/
|
|
234
309
|
static inline void
|
|
235
|
-
SH_COMPUTE_PARAMETERS(SH_TYPE * tb,
|
|
310
|
+
SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint64 newsize)
|
|
236
311
|
{
|
|
237
312
|
uint64 size;
|
|
238
313
|
|
|
@@ -247,16 +322,12 @@ SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint32 newsize)
|
|
|
247
322
|
* Verify that allocation of ->data is possible on this platform, without
|
|
248
323
|
* overflowing Size.
|
|
249
324
|
*/
|
|
250
|
-
if ((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2)
|
|
325
|
+
if (unlikely((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2))
|
|
251
326
|
sh_error("hash table too large");
|
|
252
327
|
|
|
253
328
|
/* now set size */
|
|
254
329
|
tb->size = size;
|
|
255
|
-
|
|
256
|
-
if (tb->size == SH_MAX_SIZE)
|
|
257
|
-
tb->sizemask = 0;
|
|
258
|
-
else
|
|
259
|
-
tb->sizemask = tb->size - 1;
|
|
330
|
+
tb->sizemask = (uint32) (size - 1);
|
|
260
331
|
|
|
261
332
|
/*
|
|
262
333
|
* Compute the next threshold at which we need to grow the hash table
|
|
@@ -365,9 +436,9 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
|
|
|
365
436
|
uint64 size;
|
|
366
437
|
|
|
367
438
|
#ifdef SH_RAW_ALLOCATOR
|
|
368
|
-
tb = SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
|
|
439
|
+
tb = (SH_TYPE *) SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
|
|
369
440
|
#else
|
|
370
|
-
tb = MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
|
|
441
|
+
tb = (SH_TYPE *) MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
|
|
371
442
|
tb->ctx = ctx;
|
|
372
443
|
#endif
|
|
373
444
|
tb->private_data = private_data;
|
|
@@ -377,7 +448,7 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
|
|
|
377
448
|
|
|
378
449
|
SH_COMPUTE_PARAMETERS(tb, size);
|
|
379
450
|
|
|
380
|
-
tb->data = SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
|
|
451
|
+
tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
|
|
381
452
|
|
|
382
453
|
return tb;
|
|
383
454
|
}
|
|
@@ -406,7 +477,7 @@ SH_RESET(SH_TYPE * tb)
|
|
|
406
477
|
* performance-wise, when known at some point.
|
|
407
478
|
*/
|
|
408
479
|
SH_SCOPE void
|
|
409
|
-
SH_GROW(SH_TYPE * tb,
|
|
480
|
+
SH_GROW(SH_TYPE * tb, uint64 newsize)
|
|
410
481
|
{
|
|
411
482
|
uint64 oldsize = tb->size;
|
|
412
483
|
SH_ELEMENT_TYPE *olddata = tb->data;
|
|
@@ -422,7 +493,7 @@ SH_GROW(SH_TYPE * tb, uint32 newsize)
|
|
|
422
493
|
/* compute parameters for new table */
|
|
423
494
|
SH_COMPUTE_PARAMETERS(tb, newsize);
|
|
424
495
|
|
|
425
|
-
tb->data = SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
|
|
496
|
+
tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
|
|
426
497
|
|
|
427
498
|
newdata = tb->data;
|
|
428
499
|
|
|
@@ -536,10 +607,8 @@ restart:
|
|
|
536
607
|
*/
|
|
537
608
|
if (unlikely(tb->members >= tb->grow_threshold))
|
|
538
609
|
{
|
|
539
|
-
if (tb->size == SH_MAX_SIZE)
|
|
540
|
-
{
|
|
610
|
+
if (unlikely(tb->size == SH_MAX_SIZE))
|
|
541
611
|
sh_error("hash table size exceeded");
|
|
542
|
-
}
|
|
543
612
|
|
|
544
613
|
/*
|
|
545
614
|
* When optimizing, it can be very useful to print these out.
|
|
@@ -763,7 +832,7 @@ SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash)
|
|
|
763
832
|
}
|
|
764
833
|
|
|
765
834
|
/*
|
|
766
|
-
* Delete entry from hash table. Returns whether to-be-deleted key was
|
|
835
|
+
* Delete entry from hash table by key. Returns whether to-be-deleted key was
|
|
767
836
|
* present.
|
|
768
837
|
*/
|
|
769
838
|
SH_SCOPE bool
|
|
@@ -834,6 +903,61 @@ SH_DELETE(SH_TYPE * tb, SH_KEY_TYPE key)
|
|
|
834
903
|
}
|
|
835
904
|
}
|
|
836
905
|
|
|
906
|
+
/*
|
|
907
|
+
* Delete entry from hash table by entry pointer
|
|
908
|
+
*/
|
|
909
|
+
SH_SCOPE void
|
|
910
|
+
SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry)
|
|
911
|
+
{
|
|
912
|
+
SH_ELEMENT_TYPE *lastentry = entry;
|
|
913
|
+
uint32 hash = SH_ENTRY_HASH(tb, entry);
|
|
914
|
+
uint32 startelem = SH_INITIAL_BUCKET(tb, hash);
|
|
915
|
+
uint32 curelem;
|
|
916
|
+
|
|
917
|
+
/* Calculate the index of 'entry' */
|
|
918
|
+
curelem = entry - &tb->data[0];
|
|
919
|
+
|
|
920
|
+
tb->members--;
|
|
921
|
+
|
|
922
|
+
/*
|
|
923
|
+
* Backward shift following elements till either an empty element or an
|
|
924
|
+
* element at its optimal position is encountered.
|
|
925
|
+
*
|
|
926
|
+
* While that sounds expensive, the average chain length is short, and
|
|
927
|
+
* deletions would otherwise require tombstones.
|
|
928
|
+
*/
|
|
929
|
+
while (true)
|
|
930
|
+
{
|
|
931
|
+
SH_ELEMENT_TYPE *curentry;
|
|
932
|
+
uint32 curhash;
|
|
933
|
+
uint32 curoptimal;
|
|
934
|
+
|
|
935
|
+
curelem = SH_NEXT(tb, curelem, startelem);
|
|
936
|
+
curentry = &tb->data[curelem];
|
|
937
|
+
|
|
938
|
+
if (curentry->status != SH_STATUS_IN_USE)
|
|
939
|
+
{
|
|
940
|
+
lastentry->status = SH_STATUS_EMPTY;
|
|
941
|
+
break;
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
curhash = SH_ENTRY_HASH(tb, curentry);
|
|
945
|
+
curoptimal = SH_INITIAL_BUCKET(tb, curhash);
|
|
946
|
+
|
|
947
|
+
/* current is at optimal position, done */
|
|
948
|
+
if (curoptimal == curelem)
|
|
949
|
+
{
|
|
950
|
+
lastentry->status = SH_STATUS_EMPTY;
|
|
951
|
+
break;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
/* shift */
|
|
955
|
+
memcpy(lastentry, curentry, sizeof(SH_ELEMENT_TYPE));
|
|
956
|
+
|
|
957
|
+
lastentry = curentry;
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
837
961
|
/*
|
|
838
962
|
* Initialize iterator.
|
|
839
963
|
*/
|
|
@@ -935,7 +1059,7 @@ SH_STAT(SH_TYPE * tb)
|
|
|
935
1059
|
double fillfactor;
|
|
936
1060
|
uint32 i;
|
|
937
1061
|
|
|
938
|
-
uint32 *collisions = palloc0(tb->size * sizeof(uint32));
|
|
1062
|
+
uint32 *collisions = (uint32 *) palloc0(tb->size * sizeof(uint32));
|
|
939
1063
|
uint32 total_collisions = 0;
|
|
940
1064
|
uint32 max_collisions = 0;
|
|
941
1065
|
double avg_collisions;
|
|
@@ -990,7 +1114,7 @@ SH_STAT(SH_TYPE * tb)
|
|
|
990
1114
|
avg_collisions = 0;
|
|
991
1115
|
}
|
|
992
1116
|
|
|
993
|
-
sh_log("size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %
|
|
1117
|
+
sh_log("size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %u, avg_collisions: %f",
|
|
994
1118
|
tb->size, tb->members, fillfactor, total_chain_length, max_chain_length, avg_chain_length,
|
|
995
1119
|
total_collisions, max_collisions, avg_collisions);
|
|
996
1120
|
}
|
|
@@ -1036,6 +1160,7 @@ SH_STAT(SH_TYPE * tb)
|
|
|
1036
1160
|
#undef SH_RESET
|
|
1037
1161
|
#undef SH_INSERT
|
|
1038
1162
|
#undef SH_INSERT_HASH
|
|
1163
|
+
#undef SH_DELETE_ITEM
|
|
1039
1164
|
#undef SH_DELETE
|
|
1040
1165
|
#undef SH_LOOKUP
|
|
1041
1166
|
#undef SH_LOOKUP_HASH
|