gitlab-pg_query 1.3.1 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +217 -99
- data/README.md +92 -69
- data/Rakefile +85 -5
- data/ext/pg_query/extconf.rb +3 -40
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/amapi.h +246 -0
- data/ext/pg_query/include/access/attmap.h +52 -0
- data/ext/pg_query/include/access/attnum.h +64 -0
- data/ext/pg_query/include/access/clog.h +61 -0
- data/ext/pg_query/include/access/commit_ts.h +77 -0
- data/ext/pg_query/include/access/detoast.h +92 -0
- data/ext/pg_query/include/access/genam.h +228 -0
- data/ext/pg_query/include/access/gin.h +78 -0
- data/ext/pg_query/include/access/htup.h +89 -0
- data/ext/pg_query/include/access/htup_details.h +819 -0
- data/ext/pg_query/include/access/itup.h +161 -0
- data/ext/pg_query/include/access/parallel.h +82 -0
- data/ext/pg_query/include/access/printtup.h +35 -0
- data/ext/pg_query/include/access/relation.h +28 -0
- data/ext/pg_query/include/access/relscan.h +176 -0
- data/ext/pg_query/include/access/rmgr.h +35 -0
- data/ext/pg_query/include/access/rmgrlist.h +49 -0
- data/ext/pg_query/include/access/sdir.h +58 -0
- data/ext/pg_query/include/access/skey.h +151 -0
- data/ext/pg_query/include/access/stratnum.h +83 -0
- data/ext/pg_query/include/access/sysattr.h +29 -0
- data/ext/pg_query/include/access/table.h +27 -0
- data/ext/pg_query/include/access/tableam.h +1825 -0
- data/ext/pg_query/include/access/transam.h +265 -0
- data/ext/pg_query/include/access/tupconvert.h +51 -0
- data/ext/pg_query/include/access/tupdesc.h +154 -0
- data/ext/pg_query/include/access/tupmacs.h +247 -0
- data/ext/pg_query/include/access/twophase.h +61 -0
- data/ext/pg_query/include/access/xact.h +463 -0
- data/ext/pg_query/include/access/xlog.h +398 -0
- data/ext/pg_query/include/access/xlog_internal.h +330 -0
- data/ext/pg_query/include/access/xlogdefs.h +109 -0
- data/ext/pg_query/include/access/xloginsert.h +64 -0
- data/ext/pg_query/include/access/xlogreader.h +327 -0
- data/ext/pg_query/include/access/xlogrecord.h +227 -0
- data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
- data/ext/pg_query/include/c.h +1322 -0
- data/ext/pg_query/include/catalog/catalog.h +42 -0
- data/ext/pg_query/include/catalog/catversion.h +58 -0
- data/ext/pg_query/include/catalog/dependency.h +275 -0
- data/ext/pg_query/include/catalog/genbki.h +64 -0
- data/ext/pg_query/include/catalog/index.h +199 -0
- data/ext/pg_query/include/catalog/indexing.h +366 -0
- data/ext/pg_query/include/catalog/namespace.h +188 -0
- data/ext/pg_query/include/catalog/objectaccess.h +197 -0
- data/ext/pg_query/include/catalog/objectaddress.h +84 -0
- data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
- data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
- data/ext/pg_query/include/catalog/pg_am.h +60 -0
- data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
- data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
- data/ext/pg_query/include/catalog/pg_authid.h +58 -0
- data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_class.h +200 -0
- data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
- data/ext/pg_query/include/catalog/pg_collation.h +73 -0
- data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
- data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
- data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
- data/ext/pg_query/include/catalog/pg_control.h +250 -0
- data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
- data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_depend.h +73 -0
- data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
- data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_index.h +80 -0
- data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
- data/ext/pg_query/include/catalog/pg_language.h +67 -0
- data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
- data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
- data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
- data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
- data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
- data/ext/pg_query/include/catalog/pg_operator.h +102 -0
- data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
- data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
- data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_proc.h +211 -0
- data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
- data/ext/pg_query/include/catalog/pg_publication.h +115 -0
- data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
- data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
- data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
- data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
- data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
- data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
- data/ext/pg_query/include/catalog/pg_transform.h +45 -0
- data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
- data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
- data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
- data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
- data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
- data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
- data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
- data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
- data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
- data/ext/pg_query/include/catalog/pg_type.h +372 -0
- data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
- data/ext/pg_query/include/catalog/storage.h +48 -0
- data/ext/pg_query/include/commands/async.h +54 -0
- data/ext/pg_query/include/commands/dbcommands.h +35 -0
- data/ext/pg_query/include/commands/defrem.h +173 -0
- data/ext/pg_query/include/commands/event_trigger.h +88 -0
- data/ext/pg_query/include/commands/explain.h +127 -0
- data/ext/pg_query/include/commands/prepare.h +61 -0
- data/ext/pg_query/include/commands/tablespace.h +67 -0
- data/ext/pg_query/include/commands/trigger.h +277 -0
- data/ext/pg_query/include/commands/user.h +37 -0
- data/ext/pg_query/include/commands/vacuum.h +293 -0
- data/ext/pg_query/include/commands/variable.h +38 -0
- data/ext/pg_query/include/common/file_perm.h +56 -0
- data/ext/pg_query/include/common/hashfn.h +104 -0
- data/ext/pg_query/include/common/ip.h +37 -0
- data/ext/pg_query/include/common/keywords.h +33 -0
- data/ext/pg_query/include/common/kwlookup.h +44 -0
- data/ext/pg_query/include/common/relpath.h +90 -0
- data/ext/pg_query/include/common/string.h +19 -0
- data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
- data/ext/pg_query/include/datatype/timestamp.h +197 -0
- data/ext/pg_query/include/executor/execdesc.h +70 -0
- data/ext/pg_query/include/executor/executor.h +614 -0
- data/ext/pg_query/include/executor/functions.h +41 -0
- data/ext/pg_query/include/executor/instrument.h +101 -0
- data/ext/pg_query/include/executor/spi.h +175 -0
- data/ext/pg_query/include/executor/tablefunc.h +67 -0
- data/ext/pg_query/include/executor/tuptable.h +487 -0
- data/ext/pg_query/include/fmgr.h +775 -0
- data/ext/pg_query/include/funcapi.h +348 -0
- data/ext/pg_query/include/getaddrinfo.h +162 -0
- data/ext/pg_query/include/jit/jit.h +105 -0
- data/ext/pg_query/include/kwlist_d.h +1072 -0
- data/ext/pg_query/include/lib/ilist.h +727 -0
- data/ext/pg_query/include/lib/pairingheap.h +102 -0
- data/ext/pg_query/include/lib/simplehash.h +1059 -0
- data/ext/pg_query/include/lib/stringinfo.h +161 -0
- data/ext/pg_query/include/libpq/auth.h +29 -0
- data/ext/pg_query/include/libpq/crypt.h +46 -0
- data/ext/pg_query/include/libpq/hba.h +140 -0
- data/ext/pg_query/include/libpq/libpq-be.h +326 -0
- data/ext/pg_query/include/libpq/libpq.h +133 -0
- data/ext/pg_query/include/libpq/pqcomm.h +208 -0
- data/ext/pg_query/include/libpq/pqformat.h +210 -0
- data/ext/pg_query/include/libpq/pqsignal.h +42 -0
- data/ext/pg_query/include/mb/pg_wchar.h +672 -0
- data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
- data/ext/pg_query/include/miscadmin.h +476 -0
- data/ext/pg_query/include/nodes/bitmapset.h +122 -0
- data/ext/pg_query/include/nodes/execnodes.h +2520 -0
- data/ext/pg_query/include/nodes/extensible.h +160 -0
- data/ext/pg_query/include/nodes/lockoptions.h +61 -0
- data/ext/pg_query/include/nodes/makefuncs.h +108 -0
- data/ext/pg_query/include/nodes/memnodes.h +108 -0
- data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
- data/ext/pg_query/include/nodes/nodes.h +842 -0
- data/ext/pg_query/include/nodes/params.h +170 -0
- data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
- data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
- data/ext/pg_query/include/nodes/pg_list.h +605 -0
- data/ext/pg_query/include/nodes/plannodes.h +1251 -0
- data/ext/pg_query/include/nodes/primnodes.h +1541 -0
- data/ext/pg_query/include/nodes/print.h +34 -0
- data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
- data/ext/pg_query/include/nodes/value.h +61 -0
- data/ext/pg_query/include/optimizer/cost.h +206 -0
- data/ext/pg_query/include/optimizer/geqo.h +88 -0
- data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
- data/ext/pg_query/include/optimizer/optimizer.h +199 -0
- data/ext/pg_query/include/optimizer/paths.h +249 -0
- data/ext/pg_query/include/optimizer/planmain.h +119 -0
- data/ext/pg_query/include/parser/analyze.h +49 -0
- data/ext/pg_query/include/parser/gram.h +1067 -0
- data/ext/pg_query/include/parser/gramparse.h +75 -0
- data/ext/pg_query/include/parser/kwlist.h +477 -0
- data/ext/pg_query/include/parser/parse_agg.h +68 -0
- data/ext/pg_query/include/parser/parse_clause.h +54 -0
- data/ext/pg_query/include/parser/parse_coerce.h +97 -0
- data/ext/pg_query/include/parser/parse_collate.h +27 -0
- data/ext/pg_query/include/parser/parse_expr.h +26 -0
- data/ext/pg_query/include/parser/parse_func.h +73 -0
- data/ext/pg_query/include/parser/parse_node.h +327 -0
- data/ext/pg_query/include/parser/parse_oper.h +67 -0
- data/ext/pg_query/include/parser/parse_relation.h +123 -0
- data/ext/pg_query/include/parser/parse_target.h +46 -0
- data/ext/pg_query/include/parser/parse_type.h +60 -0
- data/ext/pg_query/include/parser/parser.h +41 -0
- data/ext/pg_query/include/parser/parsetree.h +61 -0
- data/ext/pg_query/include/parser/scanner.h +152 -0
- data/ext/pg_query/include/parser/scansup.h +30 -0
- data/ext/pg_query/include/partitioning/partdefs.h +26 -0
- data/ext/pg_query/include/pg_config.h +989 -0
- data/ext/pg_query/include/pg_config_ext.h +8 -0
- data/ext/pg_query/include/pg_config_manual.h +350 -0
- data/ext/pg_query/include/pg_config_os.h +8 -0
- data/ext/pg_query/include/pg_getopt.h +56 -0
- data/ext/pg_query/include/pg_query.h +121 -0
- data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
- data/ext/pg_query/include/pg_query_json_helper.c +61 -0
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
- data/ext/pg_query/include/pg_trace.h +17 -0
- data/ext/pg_query/include/pgstat.h +1487 -0
- data/ext/pg_query/include/pgtime.h +84 -0
- data/ext/pg_query/include/pl_gram.h +385 -0
- data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
- data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
- data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
- data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
- data/ext/pg_query/include/plerrcodes.h +990 -0
- data/ext/pg_query/include/plpgsql.h +1347 -0
- data/ext/pg_query/include/port.h +524 -0
- data/ext/pg_query/include/port/atomics.h +524 -0
- data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
- data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
- data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
- data/ext/pg_query/include/port/atomics/fallback.h +170 -0
- data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
- data/ext/pg_query/include/port/atomics/generic.h +401 -0
- data/ext/pg_query/include/port/pg_bitutils.h +226 -0
- data/ext/pg_query/include/port/pg_bswap.h +161 -0
- data/ext/pg_query/include/port/pg_crc32c.h +101 -0
- data/ext/pg_query/include/portability/instr_time.h +256 -0
- data/ext/pg_query/include/postgres.h +764 -0
- data/ext/pg_query/include/postgres_ext.h +74 -0
- data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
- data/ext/pg_query/include/postmaster/bgworker.h +161 -0
- data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
- data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
- data/ext/pg_query/include/postmaster/fork_process.h +17 -0
- data/ext/pg_query/include/postmaster/interrupt.h +32 -0
- data/ext/pg_query/include/postmaster/pgarch.h +39 -0
- data/ext/pg_query/include/postmaster/postmaster.h +77 -0
- data/ext/pg_query/include/postmaster/syslogger.h +98 -0
- data/ext/pg_query/include/postmaster/walwriter.h +21 -0
- data/ext/pg_query/include/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
- data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
- data/ext/pg_query/include/regex/regex.h +184 -0
- data/ext/pg_query/include/replication/logicallauncher.h +31 -0
- data/ext/pg_query/include/replication/logicalproto.h +110 -0
- data/ext/pg_query/include/replication/logicalworker.h +19 -0
- data/ext/pg_query/include/replication/origin.h +73 -0
- data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
- data/ext/pg_query/include/replication/slot.h +219 -0
- data/ext/pg_query/include/replication/syncrep.h +115 -0
- data/ext/pg_query/include/replication/walreceiver.h +340 -0
- data/ext/pg_query/include/replication/walsender.h +74 -0
- data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
- data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
- data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
- data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
- data/ext/pg_query/include/storage/backendid.h +37 -0
- data/ext/pg_query/include/storage/block.h +121 -0
- data/ext/pg_query/include/storage/buf.h +46 -0
- data/ext/pg_query/include/storage/bufmgr.h +292 -0
- data/ext/pg_query/include/storage/bufpage.h +459 -0
- data/ext/pg_query/include/storage/condition_variable.h +62 -0
- data/ext/pg_query/include/storage/dsm.h +61 -0
- data/ext/pg_query/include/storage/dsm_impl.h +75 -0
- data/ext/pg_query/include/storage/fd.h +168 -0
- data/ext/pg_query/include/storage/ipc.h +81 -0
- data/ext/pg_query/include/storage/item.h +19 -0
- data/ext/pg_query/include/storage/itemid.h +184 -0
- data/ext/pg_query/include/storage/itemptr.h +206 -0
- data/ext/pg_query/include/storage/large_object.h +100 -0
- data/ext/pg_query/include/storage/latch.h +190 -0
- data/ext/pg_query/include/storage/lmgr.h +114 -0
- data/ext/pg_query/include/storage/lock.h +612 -0
- data/ext/pg_query/include/storage/lockdefs.h +59 -0
- data/ext/pg_query/include/storage/lwlock.h +232 -0
- data/ext/pg_query/include/storage/lwlocknames.h +51 -0
- data/ext/pg_query/include/storage/off.h +57 -0
- data/ext/pg_query/include/storage/pg_sema.h +61 -0
- data/ext/pg_query/include/storage/pg_shmem.h +90 -0
- data/ext/pg_query/include/storage/pmsignal.h +94 -0
- data/ext/pg_query/include/storage/predicate.h +87 -0
- data/ext/pg_query/include/storage/proc.h +333 -0
- data/ext/pg_query/include/storage/proclist_types.h +51 -0
- data/ext/pg_query/include/storage/procsignal.h +75 -0
- data/ext/pg_query/include/storage/relfilenode.h +99 -0
- data/ext/pg_query/include/storage/s_lock.h +1047 -0
- data/ext/pg_query/include/storage/sharedfileset.h +45 -0
- data/ext/pg_query/include/storage/shm_mq.h +85 -0
- data/ext/pg_query/include/storage/shm_toc.h +58 -0
- data/ext/pg_query/include/storage/shmem.h +81 -0
- data/ext/pg_query/include/storage/sinval.h +153 -0
- data/ext/pg_query/include/storage/sinvaladt.h +43 -0
- data/ext/pg_query/include/storage/smgr.h +109 -0
- data/ext/pg_query/include/storage/spin.h +77 -0
- data/ext/pg_query/include/storage/standby.h +91 -0
- data/ext/pg_query/include/storage/standbydefs.h +74 -0
- data/ext/pg_query/include/storage/sync.h +62 -0
- data/ext/pg_query/include/tcop/cmdtag.h +58 -0
- data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
- data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
- data/ext/pg_query/include/tcop/dest.h +149 -0
- data/ext/pg_query/include/tcop/fastpath.h +21 -0
- data/ext/pg_query/include/tcop/pquery.h +45 -0
- data/ext/pg_query/include/tcop/tcopprot.h +89 -0
- data/ext/pg_query/include/tcop/utility.h +108 -0
- data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
- data/ext/pg_query/include/utils/acl.h +312 -0
- data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
- data/ext/pg_query/include/utils/array.h +458 -0
- data/ext/pg_query/include/utils/builtins.h +127 -0
- data/ext/pg_query/include/utils/bytea.h +27 -0
- data/ext/pg_query/include/utils/catcache.h +231 -0
- data/ext/pg_query/include/utils/date.h +90 -0
- data/ext/pg_query/include/utils/datetime.h +343 -0
- data/ext/pg_query/include/utils/datum.h +68 -0
- data/ext/pg_query/include/utils/dsa.h +123 -0
- data/ext/pg_query/include/utils/dynahash.h +19 -0
- data/ext/pg_query/include/utils/elog.h +439 -0
- data/ext/pg_query/include/utils/errcodes.h +352 -0
- data/ext/pg_query/include/utils/expandeddatum.h +159 -0
- data/ext/pg_query/include/utils/expandedrecord.h +231 -0
- data/ext/pg_query/include/utils/float.h +356 -0
- data/ext/pg_query/include/utils/fmgroids.h +2657 -0
- data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
- data/ext/pg_query/include/utils/fmgrtab.h +48 -0
- data/ext/pg_query/include/utils/guc.h +443 -0
- data/ext/pg_query/include/utils/guc_tables.h +272 -0
- data/ext/pg_query/include/utils/hsearch.h +149 -0
- data/ext/pg_query/include/utils/inval.h +64 -0
- data/ext/pg_query/include/utils/lsyscache.h +197 -0
- data/ext/pg_query/include/utils/memdebug.h +82 -0
- data/ext/pg_query/include/utils/memutils.h +225 -0
- data/ext/pg_query/include/utils/numeric.h +76 -0
- data/ext/pg_query/include/utils/palloc.h +136 -0
- data/ext/pg_query/include/utils/partcache.h +102 -0
- data/ext/pg_query/include/utils/pg_locale.h +119 -0
- data/ext/pg_query/include/utils/pg_lsn.h +29 -0
- data/ext/pg_query/include/utils/pidfile.h +56 -0
- data/ext/pg_query/include/utils/plancache.h +235 -0
- data/ext/pg_query/include/utils/portal.h +241 -0
- data/ext/pg_query/include/utils/probes.h +114 -0
- data/ext/pg_query/include/utils/ps_status.h +25 -0
- data/ext/pg_query/include/utils/queryenvironment.h +74 -0
- data/ext/pg_query/include/utils/regproc.h +28 -0
- data/ext/pg_query/include/utils/rel.h +644 -0
- data/ext/pg_query/include/utils/relcache.h +151 -0
- data/ext/pg_query/include/utils/reltrigger.h +81 -0
- data/ext/pg_query/include/utils/resowner.h +86 -0
- data/ext/pg_query/include/utils/rls.h +50 -0
- data/ext/pg_query/include/utils/ruleutils.h +44 -0
- data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
- data/ext/pg_query/include/utils/snapmgr.h +158 -0
- data/ext/pg_query/include/utils/snapshot.h +206 -0
- data/ext/pg_query/include/utils/sortsupport.h +276 -0
- data/ext/pg_query/include/utils/syscache.h +219 -0
- data/ext/pg_query/include/utils/timeout.h +88 -0
- data/ext/pg_query/include/utils/timestamp.h +116 -0
- data/ext/pg_query/include/utils/tuplesort.h +277 -0
- data/ext/pg_query/include/utils/tuplestore.h +91 -0
- data/ext/pg_query/include/utils/typcache.h +202 -0
- data/ext/pg_query/include/utils/tzparser.h +39 -0
- data/ext/pg_query/include/utils/varlena.h +39 -0
- data/ext/pg_query/include/utils/xml.h +84 -0
- data/ext/pg_query/include/xxhash.h +5445 -0
- data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
- data/ext/pg_query/pg_query.c +104 -0
- data/ext/pg_query/pg_query.pb-c.c +37628 -0
- data/ext/pg_query/pg_query_deparse.c +9959 -0
- data/ext/pg_query/pg_query_fingerprint.c +295 -0
- data/ext/pg_query/pg_query_fingerprint.h +8 -0
- data/ext/pg_query/pg_query_internal.h +24 -0
- data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
- data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
- data/ext/pg_query/pg_query_normalize.c +439 -0
- data/ext/pg_query/pg_query_outfuncs.h +10 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
- data/ext/pg_query/pg_query_parse.c +148 -0
- data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
- data/ext/pg_query/pg_query_readfuncs.h +11 -0
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
- data/ext/pg_query/pg_query_ruby.c +108 -12
- data/ext/pg_query/pg_query_scan.c +173 -0
- data/ext/pg_query/pg_query_split.c +221 -0
- data/ext/pg_query/protobuf-c.c +3660 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
- data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
- data/ext/pg_query/src_backend_commands_define.c +117 -0
- data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
- data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
- data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
- data/ext/pg_query/src_backend_nodes_list.c +922 -0
- data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
- data/ext/pg_query/src_backend_nodes_value.c +84 -0
- data/ext/pg_query/src_backend_parser_gram.c +47456 -0
- data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
- data/ext/pg_query/src_backend_parser_parser.c +497 -0
- data/ext/pg_query/src_backend_parser_scan.c +7091 -0
- data/ext/pg_query/src_backend_parser_scansup.c +160 -0
- data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
- data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
- data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
- data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
- data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
- data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
- data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
- data/ext/pg_query/src_common_encnames.c +158 -0
- data/ext/pg_query/src_common_keywords.c +39 -0
- data/ext/pg_query/src_common_kwlist_d.h +1081 -0
- data/ext/pg_query/src_common_kwlookup.c +91 -0
- data/ext/pg_query/src_common_psprintf.c +158 -0
- data/ext/pg_query/src_common_string.c +86 -0
- data/ext/pg_query/src_common_stringinfo.c +336 -0
- data/ext/pg_query/src_common_wchar.c +1651 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
- data/ext/pg_query/src_port_erand48.c +127 -0
- data/ext/pg_query/src_port_pg_bitutils.c +246 -0
- data/ext/pg_query/src_port_pgsleep.c +69 -0
- data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
- data/ext/pg_query/src_port_qsort.c +240 -0
- data/ext/pg_query/src_port_random.c +31 -0
- data/ext/pg_query/src_port_snprintf.c +1449 -0
- data/ext/pg_query/src_port_strerror.c +324 -0
- data/ext/pg_query/src_port_strnlen.c +39 -0
- data/ext/pg_query/xxhash.c +43 -0
- data/lib/pg_query.rb +7 -4
- data/lib/pg_query/constants.rb +21 -0
- data/lib/pg_query/deparse.rb +15 -1581
- data/lib/pg_query/filter_columns.rb +88 -85
- data/lib/pg_query/fingerprint.rb +122 -87
- data/lib/pg_query/json_field_names.rb +1402 -0
- data/lib/pg_query/node.rb +31 -0
- data/lib/pg_query/param_refs.rb +42 -37
- data/lib/pg_query/parse.rb +220 -203
- data/lib/pg_query/parse_error.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +3211 -0
- data/lib/pg_query/scan.rb +23 -0
- data/lib/pg_query/treewalker.rb +24 -40
- data/lib/pg_query/truncate.rb +71 -42
- data/lib/pg_query/version.rb +2 -2
- metadata +472 -11
- data/ext/pg_query/pg_query_ruby.h +0 -10
- data/lib/pg_query/deep_dup.rb +0 -16
- data/lib/pg_query/deparse/alter_table.rb +0 -42
- data/lib/pg_query/deparse/interval.rb +0 -105
- data/lib/pg_query/deparse/keywords.rb +0 -159
- data/lib/pg_query/deparse/rename.rb +0 -41
- data/lib/pg_query/legacy_parsetree.rb +0 -109
- data/lib/pg_query/node_types.rb +0 -296
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
* Symbols referenced in this file:
|
|
3
|
+
* - bms_copy
|
|
4
|
+
* - bms_equal
|
|
5
|
+
* - bms_is_empty
|
|
6
|
+
* - bms_first_member
|
|
7
|
+
* - bms_free
|
|
8
|
+
* - bms_next_member
|
|
9
|
+
* - bms_num_members
|
|
10
|
+
*--------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/*-------------------------------------------------------------------------
|
|
14
|
+
*
|
|
15
|
+
* bitmapset.c
|
|
16
|
+
* PostgreSQL generic bitmap set package
|
|
17
|
+
*
|
|
18
|
+
* A bitmap set can represent any set of nonnegative integers, although
|
|
19
|
+
* it is mainly intended for sets where the maximum value is not large,
|
|
20
|
+
* say at most a few hundred. By convention, a NULL pointer is always
|
|
21
|
+
* accepted by all operations to represent the empty set. (But beware
|
|
22
|
+
* that this is not the only representation of the empty set. Use
|
|
23
|
+
* bms_is_empty() in preference to testing for NULL.)
|
|
24
|
+
*
|
|
25
|
+
*
|
|
26
|
+
* Copyright (c) 2003-2020, PostgreSQL Global Development Group
|
|
27
|
+
*
|
|
28
|
+
* IDENTIFICATION
|
|
29
|
+
* src/backend/nodes/bitmapset.c
|
|
30
|
+
*
|
|
31
|
+
*-------------------------------------------------------------------------
|
|
32
|
+
*/
|
|
33
|
+
#include "postgres.h"
|
|
34
|
+
|
|
35
|
+
#include "common/hashfn.h"
|
|
36
|
+
#include "nodes/bitmapset.h"
|
|
37
|
+
#include "nodes/pg_list.h"
|
|
38
|
+
#include "port/pg_bitutils.h"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#define WORDNUM(x) ((x) / BITS_PER_BITMAPWORD)
|
|
42
|
+
#define BITNUM(x) ((x) % BITS_PER_BITMAPWORD)
|
|
43
|
+
|
|
44
|
+
#define BITMAPSET_SIZE(nwords) \
|
|
45
|
+
(offsetof(Bitmapset, words) + (nwords) * sizeof(bitmapword))
|
|
46
|
+
|
|
47
|
+
/*----------
|
|
48
|
+
* This is a well-known cute trick for isolating the rightmost one-bit
|
|
49
|
+
* in a word. It assumes two's complement arithmetic. Consider any
|
|
50
|
+
* nonzero value, and focus attention on the rightmost one. The value is
|
|
51
|
+
* then something like
|
|
52
|
+
* xxxxxx10000
|
|
53
|
+
* where x's are unspecified bits. The two's complement negative is formed
|
|
54
|
+
* by inverting all the bits and adding one. Inversion gives
|
|
55
|
+
* yyyyyy01111
|
|
56
|
+
* where each y is the inverse of the corresponding x. Incrementing gives
|
|
57
|
+
* yyyyyy10000
|
|
58
|
+
* and then ANDing with the original value gives
|
|
59
|
+
* 00000010000
|
|
60
|
+
* This works for all cases except original value = zero, where of course
|
|
61
|
+
* we get zero.
|
|
62
|
+
*----------
|
|
63
|
+
*/
|
|
64
|
+
#define RIGHTMOST_ONE(x) ((signedbitmapword) (x) & -((signedbitmapword) (x)))
|
|
65
|
+
|
|
66
|
+
#define HAS_MULTIPLE_ONES(x) ((bitmapword) RIGHTMOST_ONE(x) != (x))
|
|
67
|
+
|
|
68
|
+
/* Select appropriate bit-twiddling functions for bitmap word size */
|
|
69
|
+
#if BITS_PER_BITMAPWORD == 32
|
|
70
|
+
#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos32(w)
|
|
71
|
+
#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos32(w)
|
|
72
|
+
#define bmw_popcount(w) pg_popcount32(w)
|
|
73
|
+
#elif BITS_PER_BITMAPWORD == 64
|
|
74
|
+
#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos64(w)
|
|
75
|
+
#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos64(w)
|
|
76
|
+
#define bmw_popcount(w) pg_popcount64(w)
|
|
77
|
+
#else
|
|
78
|
+
#error "invalid BITS_PER_BITMAPWORD"
|
|
79
|
+
#endif
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* bms_copy - make a palloc'd copy of a bitmapset
|
|
84
|
+
*/
|
|
85
|
+
Bitmapset *
|
|
86
|
+
bms_copy(const Bitmapset *a)
|
|
87
|
+
{
|
|
88
|
+
Bitmapset *result;
|
|
89
|
+
size_t size;
|
|
90
|
+
|
|
91
|
+
if (a == NULL)
|
|
92
|
+
return NULL;
|
|
93
|
+
size = BITMAPSET_SIZE(a->nwords);
|
|
94
|
+
result = (Bitmapset *) palloc(size);
|
|
95
|
+
memcpy(result, a, size);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* bms_equal - are two bitmapsets equal?
|
|
101
|
+
*
|
|
102
|
+
* This is logical not physical equality; in particular, a NULL pointer will
|
|
103
|
+
* be reported as equal to a palloc'd value containing no members.
|
|
104
|
+
*/
|
|
105
|
+
bool
|
|
106
|
+
bms_equal(const Bitmapset *a, const Bitmapset *b)
|
|
107
|
+
{
|
|
108
|
+
const Bitmapset *shorter;
|
|
109
|
+
const Bitmapset *longer;
|
|
110
|
+
int shortlen;
|
|
111
|
+
int longlen;
|
|
112
|
+
int i;
|
|
113
|
+
|
|
114
|
+
/* Handle cases where either input is NULL */
|
|
115
|
+
if (a == NULL)
|
|
116
|
+
{
|
|
117
|
+
if (b == NULL)
|
|
118
|
+
return true;
|
|
119
|
+
return bms_is_empty(b);
|
|
120
|
+
}
|
|
121
|
+
else if (b == NULL)
|
|
122
|
+
return bms_is_empty(a);
|
|
123
|
+
/* Identify shorter and longer input */
|
|
124
|
+
if (a->nwords <= b->nwords)
|
|
125
|
+
{
|
|
126
|
+
shorter = a;
|
|
127
|
+
longer = b;
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
{
|
|
131
|
+
shorter = b;
|
|
132
|
+
longer = a;
|
|
133
|
+
}
|
|
134
|
+
/* And process */
|
|
135
|
+
shortlen = shorter->nwords;
|
|
136
|
+
for (i = 0; i < shortlen; i++)
|
|
137
|
+
{
|
|
138
|
+
if (shorter->words[i] != longer->words[i])
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
longlen = longer->nwords;
|
|
142
|
+
for (; i < longlen; i++)
|
|
143
|
+
{
|
|
144
|
+
if (longer->words[i] != 0)
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* bms_compare - qsort-style comparator for bitmapsets
|
|
152
|
+
*
|
|
153
|
+
* This guarantees to report values as equal iff bms_equal would say they are
|
|
154
|
+
* equal. Otherwise, the highest-numbered bit that is set in one value but
|
|
155
|
+
* not the other determines the result. (This rule means that, for example,
|
|
156
|
+
* {6} is greater than {5}, which seems plausible.)
|
|
157
|
+
*/
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
/*
|
|
161
|
+
* bms_make_singleton - build a bitmapset containing a single member
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* bms_free - free a bitmapset
|
|
167
|
+
*
|
|
168
|
+
* Same as pfree except for allowing NULL input
|
|
169
|
+
*/
|
|
170
|
+
void
|
|
171
|
+
bms_free(Bitmapset *a)
|
|
172
|
+
{
|
|
173
|
+
if (a)
|
|
174
|
+
pfree(a);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
* These operations all make a freshly palloc'd result,
|
|
180
|
+
* leaving their inputs untouched
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* bms_union - set union
|
|
186
|
+
*/
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* bms_intersect - set intersection
|
|
191
|
+
*/
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* bms_difference - set difference (ie, A without members of B)
|
|
196
|
+
*/
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* bms_is_subset - is A a subset of B?
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* bms_subset_compare - compare A and B for equality/subset relationships
|
|
206
|
+
*
|
|
207
|
+
* This is more efficient than testing bms_is_subset in both directions.
|
|
208
|
+
*/
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* bms_is_member - is X a member of A?
|
|
213
|
+
*/
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* bms_member_index
|
|
218
|
+
* determine 0-based index of member x in the bitmap
|
|
219
|
+
*
|
|
220
|
+
* Returns (-1) when x is not a member.
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* bms_overlap - do sets overlap (ie, have a nonempty intersection)?
|
|
226
|
+
*/
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
* bms_overlap_list - does a set overlap an integer list?
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
/*
|
|
235
|
+
* bms_nonempty_difference - do sets have a nonempty difference?
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
/*
|
|
240
|
+
* bms_singleton_member - return the sole integer member of set
|
|
241
|
+
*
|
|
242
|
+
* Raises error if |a| is not 1.
|
|
243
|
+
*/
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
/*
|
|
247
|
+
* bms_get_singleton_member
|
|
248
|
+
*
|
|
249
|
+
* Test whether the given set is a singleton.
|
|
250
|
+
* If so, set *member to the value of its sole member, and return true.
|
|
251
|
+
* If not, return false, without changing *member.
|
|
252
|
+
*
|
|
253
|
+
* This is more convenient and faster than calling bms_membership() and then
|
|
254
|
+
* bms_singleton_member(), if we don't care about distinguishing empty sets
|
|
255
|
+
* from multiple-member sets.
|
|
256
|
+
*/
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
/*
|
|
260
|
+
* bms_num_members - count members of set
|
|
261
|
+
*/
|
|
262
|
+
int
|
|
263
|
+
bms_num_members(const Bitmapset *a)
|
|
264
|
+
{
|
|
265
|
+
int result = 0;
|
|
266
|
+
int nwords;
|
|
267
|
+
int wordnum;
|
|
268
|
+
|
|
269
|
+
if (a == NULL)
|
|
270
|
+
return 0;
|
|
271
|
+
nwords = a->nwords;
|
|
272
|
+
for (wordnum = 0; wordnum < nwords; wordnum++)
|
|
273
|
+
{
|
|
274
|
+
bitmapword w = a->words[wordnum];
|
|
275
|
+
|
|
276
|
+
/* No need to count the bits in a zero word */
|
|
277
|
+
if (w != 0)
|
|
278
|
+
result += bmw_popcount(w);
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/*
|
|
284
|
+
* bms_membership - does a set have zero, one, or multiple members?
|
|
285
|
+
*
|
|
286
|
+
* This is faster than making an exact count with bms_num_members().
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
/*
|
|
291
|
+
* bms_is_empty - is a set empty?
|
|
292
|
+
*
|
|
293
|
+
* This is even faster than bms_membership().
|
|
294
|
+
*/
|
|
295
|
+
bool
|
|
296
|
+
bms_is_empty(const Bitmapset *a)
|
|
297
|
+
{
|
|
298
|
+
int nwords;
|
|
299
|
+
int wordnum;
|
|
300
|
+
|
|
301
|
+
if (a == NULL)
|
|
302
|
+
return true;
|
|
303
|
+
nwords = a->nwords;
|
|
304
|
+
for (wordnum = 0; wordnum < nwords; wordnum++)
|
|
305
|
+
{
|
|
306
|
+
bitmapword w = a->words[wordnum];
|
|
307
|
+
|
|
308
|
+
if (w != 0)
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
/*
|
|
316
|
+
* These operations all "recycle" their non-const inputs, ie, either
|
|
317
|
+
* return the modified input or pfree it if it can't hold the result.
|
|
318
|
+
*
|
|
319
|
+
* These should generally be used in the style
|
|
320
|
+
*
|
|
321
|
+
* foo = bms_add_member(foo, x);
|
|
322
|
+
*/
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
/*
|
|
326
|
+
* bms_add_member - add a specified member to set
|
|
327
|
+
*
|
|
328
|
+
* Input set is modified or recycled!
|
|
329
|
+
*/
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
/*
|
|
333
|
+
* bms_del_member - remove a specified member from set
|
|
334
|
+
*
|
|
335
|
+
* No error if x is not currently a member of set
|
|
336
|
+
*
|
|
337
|
+
* Input set is modified in-place!
|
|
338
|
+
*/
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
/*
|
|
342
|
+
* bms_add_members - like bms_union, but left input is recycled
|
|
343
|
+
*/
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
/*
|
|
347
|
+
* bms_add_range
|
|
348
|
+
* Add members in the range of 'lower' to 'upper' to the set.
|
|
349
|
+
*
|
|
350
|
+
* Note this could also be done by calling bms_add_member in a loop, however,
|
|
351
|
+
* using this function will be faster when the range is large as we work at
|
|
352
|
+
* the bitmapword level rather than at bit level.
|
|
353
|
+
*/
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* bms_int_members - like bms_intersect, but left input is recycled
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
/*
|
|
362
|
+
* bms_del_members - like bms_difference, but left input is recycled
|
|
363
|
+
*/
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
/*
|
|
367
|
+
* bms_join - like bms_union, but *both* inputs are recycled
|
|
368
|
+
*/
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
/*
|
|
372
|
+
* bms_first_member - find and remove first member of a set
|
|
373
|
+
*
|
|
374
|
+
* Returns -1 if set is empty. NB: set is destructively modified!
|
|
375
|
+
*
|
|
376
|
+
* This is intended as support for iterating through the members of a set.
|
|
377
|
+
* The typical pattern is
|
|
378
|
+
*
|
|
379
|
+
* while ((x = bms_first_member(inputset)) >= 0)
|
|
380
|
+
* process member x;
|
|
381
|
+
*
|
|
382
|
+
* CAUTION: this destroys the content of "inputset". If the set must
|
|
383
|
+
* not be modified, use bms_next_member instead.
|
|
384
|
+
*/
|
|
385
|
+
int
|
|
386
|
+
bms_first_member(Bitmapset *a)
|
|
387
|
+
{
|
|
388
|
+
int nwords;
|
|
389
|
+
int wordnum;
|
|
390
|
+
|
|
391
|
+
if (a == NULL)
|
|
392
|
+
return -1;
|
|
393
|
+
nwords = a->nwords;
|
|
394
|
+
for (wordnum = 0; wordnum < nwords; wordnum++)
|
|
395
|
+
{
|
|
396
|
+
bitmapword w = a->words[wordnum];
|
|
397
|
+
|
|
398
|
+
if (w != 0)
|
|
399
|
+
{
|
|
400
|
+
int result;
|
|
401
|
+
|
|
402
|
+
w = RIGHTMOST_ONE(w);
|
|
403
|
+
a->words[wordnum] &= ~w;
|
|
404
|
+
|
|
405
|
+
result = wordnum * BITS_PER_BITMAPWORD;
|
|
406
|
+
result += bmw_rightmost_one_pos(w);
|
|
407
|
+
return result;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return -1;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/*
|
|
414
|
+
* bms_next_member - find next member of a set
|
|
415
|
+
*
|
|
416
|
+
* Returns smallest member greater than "prevbit", or -2 if there is none.
|
|
417
|
+
* "prevbit" must NOT be less than -1, or the behavior is unpredictable.
|
|
418
|
+
*
|
|
419
|
+
* This is intended as support for iterating through the members of a set.
|
|
420
|
+
* The typical pattern is
|
|
421
|
+
*
|
|
422
|
+
* x = -1;
|
|
423
|
+
* while ((x = bms_next_member(inputset, x)) >= 0)
|
|
424
|
+
* process member x;
|
|
425
|
+
*
|
|
426
|
+
* Notice that when there are no more members, we return -2, not -1 as you
|
|
427
|
+
* might expect. The rationale for that is to allow distinguishing the
|
|
428
|
+
* loop-not-started state (x == -1) from the loop-completed state (x == -2).
|
|
429
|
+
* It makes no difference in simple loop usage, but complex iteration logic
|
|
430
|
+
* might need such an ability.
|
|
431
|
+
*/
|
|
432
|
+
int
|
|
433
|
+
bms_next_member(const Bitmapset *a, int prevbit)
|
|
434
|
+
{
|
|
435
|
+
int nwords;
|
|
436
|
+
int wordnum;
|
|
437
|
+
bitmapword mask;
|
|
438
|
+
|
|
439
|
+
if (a == NULL)
|
|
440
|
+
return -2;
|
|
441
|
+
nwords = a->nwords;
|
|
442
|
+
prevbit++;
|
|
443
|
+
mask = (~(bitmapword) 0) << BITNUM(prevbit);
|
|
444
|
+
for (wordnum = WORDNUM(prevbit); wordnum < nwords; wordnum++)
|
|
445
|
+
{
|
|
446
|
+
bitmapword w = a->words[wordnum];
|
|
447
|
+
|
|
448
|
+
/* ignore bits before prevbit */
|
|
449
|
+
w &= mask;
|
|
450
|
+
|
|
451
|
+
if (w != 0)
|
|
452
|
+
{
|
|
453
|
+
int result;
|
|
454
|
+
|
|
455
|
+
result = wordnum * BITS_PER_BITMAPWORD;
|
|
456
|
+
result += bmw_rightmost_one_pos(w);
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/* in subsequent words, consider all bits */
|
|
461
|
+
mask = (~(bitmapword) 0);
|
|
462
|
+
}
|
|
463
|
+
return -2;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/*
|
|
467
|
+
* bms_prev_member - find prev member of a set
|
|
468
|
+
*
|
|
469
|
+
* Returns largest member less than "prevbit", or -2 if there is none.
|
|
470
|
+
* "prevbit" must NOT be more than one above the highest possible bit that can
|
|
471
|
+
* be set at the Bitmapset at its current size.
|
|
472
|
+
*
|
|
473
|
+
* To ease finding the highest set bit for the initial loop, the special
|
|
474
|
+
* prevbit value of -1 can be passed to have the function find the highest
|
|
475
|
+
* valued member in the set.
|
|
476
|
+
*
|
|
477
|
+
* This is intended as support for iterating through the members of a set in
|
|
478
|
+
* reverse. The typical pattern is
|
|
479
|
+
*
|
|
480
|
+
* x = -1;
|
|
481
|
+
* while ((x = bms_prev_member(inputset, x)) >= 0)
|
|
482
|
+
* process member x;
|
|
483
|
+
*
|
|
484
|
+
* Notice that when there are no more members, we return -2, not -1 as you
|
|
485
|
+
* might expect. The rationale for that is to allow distinguishing the
|
|
486
|
+
* loop-not-started state (x == -1) from the loop-completed state (x == -2).
|
|
487
|
+
* It makes no difference in simple loop usage, but complex iteration logic
|
|
488
|
+
* might need such an ability.
|
|
489
|
+
*/
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
/*
|
|
494
|
+
* bms_hash_value - compute a hash key for a Bitmapset
|
|
495
|
+
*
|
|
496
|
+
* Note: we must ensure that any two bitmapsets that are bms_equal() will
|
|
497
|
+
* hash to the same value; in practice this means that trailing all-zero
|
|
498
|
+
* words must not affect the result. Hence we strip those before applying
|
|
499
|
+
* hash_any().
|
|
500
|
+
*/
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
/*
|
|
504
|
+
* bitmap_hash - hash function for keys that are (pointers to) Bitmapsets
|
|
505
|
+
*
|
|
506
|
+
* Note: don't forget to specify bitmap_match as the match function!
|
|
507
|
+
*/
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
/*
|
|
511
|
+
* bitmap_match - match function to use with bitmap_hash
|
|
512
|
+
*/
|
|
513
|
+
|