pg_query 2.2.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 +25 -0
- data/README.md +59 -31
- data/Rakefile +2 -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 +3 -1
- data/ext/pg_query/include/access/xact.h +73 -19
- data/ext/pg_query/include/access/xlog.h +60 -155
- data/ext/pg_query/include/access/xlog_internal.h +40 -13
- 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 +145 -39
- 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 +8 -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 +44 -14
- data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
- 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 +3 -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 +18 -15
- 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 -7
- 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 +55 -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 +3 -4
- 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 +2 -2
- data/ext/pg_query/include/commands/trigger.h +18 -16
- 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 +140 -15
- 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 +30 -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 +105 -23
- data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/miscadmin.h +47 -41
- data/ext/pg_query/include/nodes/bitmapset.h +1 -1
- data/ext/pg_query/include/nodes/execnodes.h +270 -78
- 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 +322 -90
- data/ext/pg_query/include/nodes/pathnodes.h +243 -66
- data/ext/pg_query/include/nodes/pg_list.h +75 -69
- data/ext/pg_query/include/nodes/plannodes.h +111 -28
- 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 -17
- 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 +3 -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 +83 -41
- 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 +939 -113
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
- data/ext/pg_query/include/pg_trace.h +1 -1
- data/ext/pg_query/include/pgstat.h +449 -1238
- 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 +40 -10
- 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 +71 -46
- 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 +1419 -914
- 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 +259 -42
- data/ext/pg_query/include/replication/slot.h +22 -11
- 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 +11 -8
- data/ext/pg_query/include/storage/lockdefs.h +2 -2
- data/ext/pg_query/include/storage/lwlock.h +5 -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 +173 -59
- 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 +60 -21
- 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 +1 -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 +10 -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 +4 -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 +10 -12
- 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 -19
- data/ext/pg_query/include/utils/relcache.h +8 -5
- 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 +34 -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 +4302 -2304
- data/ext/pg_query/pg_query_deparse.c +1106 -373
- data/ext/pg_query/pg_query_fingerprint.c +30 -10
- data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
- data/ext/pg_query/pg_query_normalize.c +1 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +54 -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_readfuncs_protobuf.c +42 -8
- 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 +20 -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 +401 -76
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
- data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
- data/ext/pg_query/src_backend_nodes_list.c +74 -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 +33874 -31261
- data/ext/pg_query/src_backend_parser_parser.c +26 -7
- data/ext/pg_query/src_backend_parser_scan.c +172 -209
- 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 +62 -23
- 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 +71 -5
- 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 +206 -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 +701 -109
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
- 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 -31
- 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 +37 -13
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strnlen.c +1 -1
- data/lib/pg_query/filter_columns.rb +1 -1
- data/lib/pg_query/fingerprint.rb +5 -1
- data/lib/pg_query/node.rb +2 -2
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +20 -8
- data/lib/pg_query/pg_query_pb.rb +1108 -942
- data/lib/pg_query/treewalker.rb +6 -0
- data/lib/pg_query/truncate.rb +1 -1
- data/lib/pg_query/version.rb +1 -1
- metadata +27 -17
- 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/pg_query_ruby_freebsd.sym +0 -2
- data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
- 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).
|
@@ -56,7 +87,7 @@
|
|
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.
|
58
89
|
*
|
59
|
-
* Portions Copyright (c) 1996-
|
90
|
+
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
60
91
|
* Portions Copyright (c) 1994, Regents of the University of California
|
61
92
|
*
|
62
93
|
* src/include/lib/simplehash.h
|
@@ -84,6 +115,7 @@
|
|
84
115
|
#define SH_RESET SH_MAKE_NAME(reset)
|
85
116
|
#define SH_INSERT SH_MAKE_NAME(insert)
|
86
117
|
#define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
|
118
|
+
#define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
|
87
119
|
#define SH_DELETE SH_MAKE_NAME(delete)
|
88
120
|
#define SH_LOOKUP SH_MAKE_NAME(lookup)
|
89
121
|
#define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
|
@@ -154,24 +186,62 @@ typedef struct SH_ITERATOR
|
|
154
186
|
|
155
187
|
/* externally visible function prototypes */
|
156
188
|
#ifdef SH_RAW_ALLOCATOR
|
189
|
+
/* <prefix>_hash <prefix>_create(uint32 nelements, void *private_data) */
|
157
190
|
SH_SCOPE SH_TYPE *SH_CREATE(uint32 nelements, void *private_data);
|
158
191
|
#else
|
192
|
+
/*
|
193
|
+
* <prefix>_hash <prefix>_create(MemoryContext ctx, uint32 nelements,
|
194
|
+
* void *private_data)
|
195
|
+
*/
|
159
196
|
SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
|
160
197
|
void *private_data);
|
161
198
|
#endif
|
199
|
+
|
200
|
+
/* void <prefix>_destroy(<prefix>_hash *tb) */
|
162
201
|
SH_SCOPE void SH_DESTROY(SH_TYPE * tb);
|
202
|
+
|
203
|
+
/* void <prefix>_reset(<prefix>_hash *tb) */
|
163
204
|
SH_SCOPE void SH_RESET(SH_TYPE * tb);
|
205
|
+
|
206
|
+
/* void <prefix>_grow(<prefix>_hash *tb, uint64 newsize) */
|
164
207
|
SH_SCOPE void SH_GROW(SH_TYPE * tb, uint64 newsize);
|
208
|
+
|
209
|
+
/* <element> *<prefix>_insert(<prefix>_hash *tb, <key> key, bool *found) */
|
165
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
|
+
*/
|
166
216
|
SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
|
167
217
|
uint32 hash, bool *found);
|
218
|
+
|
219
|
+
/* <element> *<prefix>_lookup(<prefix>_hash *tb, <key> key) */
|
168
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) */
|
169
223
|
SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
|
170
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) */
|
171
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) */
|
172
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
|
+
*/
|
173
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) */
|
174
242
|
SH_SCOPE SH_ELEMENT_TYPE *SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
|
243
|
+
|
244
|
+
/* void <prefix>_stat(<prefix>_hash *tb */
|
175
245
|
SH_SCOPE void SH_STAT(SH_TYPE * tb);
|
176
246
|
|
177
247
|
#endif /* SH_DECLARE */
|
@@ -223,8 +293,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
|
|
223
293
|
#define SIMPLEHASH_H
|
224
294
|
|
225
295
|
#ifdef FRONTEND
|
226
|
-
#define sh_error(...)
|
227
|
-
do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0)
|
296
|
+
#define sh_error(...) pg_fatal(__VA_ARGS__)
|
228
297
|
#define sh_log(...) pg_log_info(__VA_ARGS__)
|
229
298
|
#else
|
230
299
|
#define sh_error(...) elog(ERROR, __VA_ARGS__)
|
@@ -367,9 +436,9 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
|
|
367
436
|
uint64 size;
|
368
437
|
|
369
438
|
#ifdef SH_RAW_ALLOCATOR
|
370
|
-
tb = SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
|
439
|
+
tb = (SH_TYPE *) SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
|
371
440
|
#else
|
372
|
-
tb = MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
|
441
|
+
tb = (SH_TYPE *) MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
|
373
442
|
tb->ctx = ctx;
|
374
443
|
#endif
|
375
444
|
tb->private_data = private_data;
|
@@ -379,7 +448,7 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
|
|
379
448
|
|
380
449
|
SH_COMPUTE_PARAMETERS(tb, size);
|
381
450
|
|
382
|
-
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);
|
383
452
|
|
384
453
|
return tb;
|
385
454
|
}
|
@@ -424,7 +493,7 @@ SH_GROW(SH_TYPE * tb, uint64 newsize)
|
|
424
493
|
/* compute parameters for new table */
|
425
494
|
SH_COMPUTE_PARAMETERS(tb, newsize);
|
426
495
|
|
427
|
-
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);
|
428
497
|
|
429
498
|
newdata = tb->data;
|
430
499
|
|
@@ -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
|