pg_query 4.2.1 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +6 -8
- data/Rakefile +5 -6
- data/ext/pg_query/extconf.rb +14 -4
- data/ext/pg_query/include/pg_query.h +27 -3
- data/ext/pg_query/include/pg_query_enum_defs.c +311 -149
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +545 -489
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +5092 -4432
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +385 -343
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1294 -1161
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +137 -123
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1657 -1496
- data/ext/pg_query/include/{access → postgres/access}/amapi.h +3 -1
- data/ext/pg_query/include/{access → postgres/access}/attmap.h +5 -3
- data/ext/pg_query/include/{access → postgres/access}/attnum.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/clog.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/commit_ts.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/detoast.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/genam.h +7 -5
- data/ext/pg_query/include/{access → postgres/access}/gin.h +16 -3
- data/ext/pg_query/include/{access → postgres/access}/htup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/htup_details.h +6 -2
- data/ext/pg_query/include/{access → postgres/access}/itup.h +61 -58
- data/ext/pg_query/include/{access → postgres/access}/parallel.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/printtup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/relation.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/relscan.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/rmgrlist.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/sdir.h +12 -3
- data/ext/pg_query/include/{access → postgres/access}/skey.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/stratnum.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/sysattr.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/table.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/tableam.h +68 -45
- data/ext/pg_query/include/{access → postgres/access}/toast_compression.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/transam.h +1 -1
- data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
- data/ext/pg_query/include/{access → postgres/access}/tupconvert.h +5 -2
- data/ext/pg_query/include/{access → postgres/access}/tupdesc.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/tupmacs.h +58 -98
- data/ext/pg_query/include/{access → postgres/access}/twophase.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/xact.h +25 -18
- data/ext/pg_query/include/{access → postgres/access}/xlog.h +15 -16
- data/ext/pg_query/include/{access → postgres/access}/xlog_internal.h +100 -62
- data/ext/pg_query/include/postgres/access/xlogbackup.h +41 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogdefs.h +6 -25
- data/ext/pg_query/include/{access → postgres/access}/xlogprefetcher.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/xlogreader.h +7 -6
- data/ext/pg_query/include/{access → postgres/access}/xlogrecord.h +17 -5
- data/ext/pg_query/include/{access → postgres/access}/xlogrecovery.h +4 -3
- data/ext/pg_query/include/postgres/archive/archive_module.h +59 -0
- data/ext/pg_query/include/{c.h → postgres/c.h} +144 -156
- data/ext/pg_query/include/{catalog → postgres/catalog}/catalog.h +4 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/catversion.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/dependency.h +5 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/genbki.h +7 -6
- data/ext/pg_query/include/{catalog → postgres/catalog}/index.h +4 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/indexing.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/namespace.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaccess.h +10 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaddress.h +3 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute.h +19 -17
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute_d.h +19 -19
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation_d.h +4 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_control.h +9 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion.h +2 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion_d.h +1 -1
- data/ext/pg_query/include/postgres/catalog/pg_database.h +124 -0
- data/ext/pg_query/include/postgres/catalog/pg_database_d.h +52 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily.h +3 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily_d.h +4 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication.h +2 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type_d.h +1 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/storage.h +6 -6
- data/ext/pg_query/include/{commands → postgres/commands}/async.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/dbcommands.h +2 -1
- data/ext/pg_query/include/{commands → postgres/commands}/defrem.h +2 -1
- data/ext/pg_query/include/{commands → postgres/commands}/event_trigger.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/explain.h +3 -1
- data/ext/pg_query/include/{commands → postgres/commands}/prepare.h +1 -1
- data/ext/pg_query/include/{commands → postgres/commands}/tablespace.h +4 -4
- data/ext/pg_query/include/{commands → postgres/commands}/trigger.h +15 -14
- data/ext/pg_query/include/{commands → postgres/commands}/user.h +9 -3
- data/ext/pg_query/include/{commands → postgres/commands}/vacuum.h +60 -14
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/{common → postgres/common}/file_perm.h +1 -1
- data/ext/pg_query/include/{common → postgres/common}/hashfn.h +1 -1
- data/ext/pg_query/include/postgres/common/int.h +437 -0
- data/ext/pg_query/include/{common → postgres/common}/keywords.h +1 -1
- data/ext/pg_query/include/{common → postgres/common}/kwlookup.h +2 -2
- data/ext/pg_query/include/{common → postgres/common}/pg_prng.h +3 -2
- data/ext/pg_query/include/{common → postgres/common}/relpath.h +20 -13
- data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
- data/ext/pg_query/include/postgres/common/sha2.h +32 -0
- data/ext/pg_query/include/{common → postgres/common}/string.h +5 -3
- data/ext/pg_query/include/{common → postgres/common}/unicode_east_asian_fw_table.h +10 -10
- data/ext/pg_query/include/{common/unicode_combining_table.h → postgres/common/unicode_nonspacing_table.h} +31 -13
- data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5013 -0
- data/ext/pg_query/include/postgres/copyfuncs.switch.c +938 -0
- data/ext/pg_query/include/{datatype → postgres/datatype}/timestamp.h +11 -4
- data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3097 -0
- data/ext/pg_query/include/postgres/equalfuncs.switch.c +785 -0
- data/ext/pg_query/include/{executor → postgres/executor}/execdesc.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/executor.h +34 -17
- data/ext/pg_query/include/{executor → postgres/executor}/functions.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/instrument.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/spi.h +2 -2
- data/ext/pg_query/include/{executor → postgres/executor}/tablefunc.h +1 -1
- data/ext/pg_query/include/{executor → postgres/executor}/tuptable.h +18 -11
- data/ext/pg_query/include/{fmgr.h → postgres/fmgr.h} +21 -2
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/{funcapi.h → postgres/funcapi.h} +12 -12
- data/ext/pg_query/include/postgres/gram.h +1127 -0
- data/ext/pg_query/include/{parser → postgres}/gramparse.h +4 -4
- data/ext/pg_query/include/{jit → postgres/jit}/jit.h +2 -2
- data/ext/pg_query/include/postgres/kwlist_d.h +1119 -0
- data/ext/pg_query/include/{lib → postgres/lib}/dshash.h +4 -1
- data/ext/pg_query/include/{lib → postgres/lib}/ilist.h +435 -22
- data/ext/pg_query/include/{lib → postgres/lib}/pairingheap.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/simplehash.h +9 -9
- data/ext/pg_query/include/{lib → postgres/lib}/sort_template.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/stringinfo.h +3 -3
- data/ext/pg_query/include/{libpq → postgres/libpq}/auth.h +8 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/crypt.h +1 -1
- data/ext/pg_query/include/{libpq → postgres/libpq}/hba.h +24 -17
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq-be.h +36 -25
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq.h +1 -1
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqcomm.h +10 -41
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqformat.h +2 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqsignal.h +22 -10
- data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
- data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
- data/ext/pg_query/include/{mb → postgres/mb}/pg_wchar.h +35 -18
- data/ext/pg_query/include/{mb → postgres/mb}/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/{miscadmin.h → postgres/miscadmin.h} +27 -15
- data/ext/pg_query/include/{nodes → postgres/nodes}/bitmapset.h +11 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/execnodes.h +83 -30
- data/ext/pg_query/include/{nodes → postgres/nodes}/extensible.h +5 -3
- data/ext/pg_query/include/{nodes → postgres/nodes}/lockoptions.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/makefuncs.h +14 -2
- data/ext/pg_query/include/{nodes → postgres/nodes}/memnodes.h +7 -4
- data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/nodeFuncs.h +89 -29
- data/ext/pg_query/include/{nodes → postgres/nodes}/nodes.h +96 -511
- data/ext/pg_query/include/postgres/nodes/nodetags.h +471 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/params.h +3 -3
- data/ext/pg_query/include/{nodes → postgres/nodes}/parsenodes.h +377 -139
- data/ext/pg_query/include/{nodes → postgres/nodes}/pathnodes.h +1090 -440
- data/ext/pg_query/include/{nodes → postgres/nodes}/pg_list.h +30 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/plannodes.h +367 -124
- data/ext/pg_query/include/{nodes → postgres/nodes}/primnodes.h +670 -222
- data/ext/pg_query/include/{nodes → postgres/nodes}/print.h +1 -1
- data/ext/pg_query/include/{utils → postgres/nodes}/queryjumble.h +5 -7
- data/ext/pg_query/include/postgres/nodes/replnodes.h +111 -0
- data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
- data/ext/pg_query/include/{nodes → postgres/nodes}/tidbitmap.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/value.h +12 -2
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/cost.h +6 -4
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo_gene.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/optimizer.h +8 -8
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/paths.h +16 -7
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/planmain.h +3 -6
- data/ext/pg_query/include/{parser → postgres/parser}/analyze.h +4 -3
- data/ext/pg_query/include/{parser → postgres/parser}/kwlist.h +12 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_agg.h +4 -2
- data/ext/pg_query/include/{parser → postgres/parser}/parse_coerce.h +3 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_expr.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_func.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_node.h +22 -4
- data/ext/pg_query/include/{parser → postgres/parser}/parse_oper.h +3 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_relation.h +8 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_type.h +4 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parser.h +4 -4
- data/ext/pg_query/include/{parser → postgres/parser}/parsetree.h +1 -1
- data/ext/pg_query/include/{parser → postgres/parser}/scanner.h +2 -2
- data/ext/pg_query/include/{parser → postgres/parser}/scansup.h +1 -1
- data/ext/pg_query/include/{partitioning → postgres/partitioning}/partdefs.h +1 -1
- data/ext/pg_query/include/{pg_config.h → postgres/pg_config.h} +158 -218
- data/ext/pg_query/include/{pg_config_manual.h → postgres/pg_config_manual.h} +8 -46
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/{pg_getopt.h → postgres/pg_getopt.h} +1 -1
- data/ext/pg_query/include/{pg_trace.h → postgres/pg_trace.h} +1 -1
- data/ext/pg_query/include/{pgstat.h → postgres/pgstat.h} +173 -94
- data/ext/pg_query/include/{pgtime.h → postgres/pgtime.h} +3 -3
- data/ext/pg_query/include/{pl_gram.h → postgres/pl_gram.h} +66 -64
- data/ext/pg_query/include/{pl_reserved_kwlist.h → postgres/pl_reserved_kwlist.h} +1 -1
- data/ext/pg_query/include/{pl_reserved_kwlist_d.h → postgres/pl_reserved_kwlist_d.h} +1 -1
- data/ext/pg_query/include/{pl_unreserved_kwlist.h → postgres/pl_unreserved_kwlist.h} +2 -1
- data/ext/pg_query/include/{pl_unreserved_kwlist_d.h → postgres/pl_unreserved_kwlist_d.h} +48 -46
- data/ext/pg_query/include/{plpgsql.h → postgres/plpgsql.h} +28 -33
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-arm.h +3 -3
- data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-ppc.h +21 -21
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-x86.h +2 -2
- data/ext/pg_query/include/{port → postgres/port}/atomics/fallback.h +3 -3
- data/ext/pg_query/include/{port → postgres/port}/atomics/generic-gcc.h +1 -1
- data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +101 -0
- data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +106 -0
- data/ext/pg_query/include/{port → postgres/port}/atomics/generic.h +1 -1
- data/ext/pg_query/include/{port → postgres/port}/atomics.h +2 -7
- data/ext/pg_query/include/{port → postgres/port}/pg_bitutils.h +62 -25
- data/ext/pg_query/include/{port → postgres/port}/pg_bswap.h +1 -1
- data/ext/pg_query/include/{port → postgres/port}/pg_crc32c.h +1 -1
- data/ext/pg_query/include/postgres/port/simd.h +375 -0
- data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
- data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
- data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
- data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
- data/ext/pg_query/include/postgres/port/win32/sys/socket.h +26 -0
- data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
- data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
- data/ext/pg_query/include/postgres/port/win32.h +59 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
- data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
- data/ext/pg_query/include/postgres/port/win32_port.h +594 -0
- data/ext/pg_query/include/{port.h → postgres/port.h} +42 -75
- data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
- data/ext/pg_query/include/postgres/postgres.h +579 -0
- data/ext/pg_query/include/{postgres_ext.h → postgres/postgres_ext.h} +0 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/autovacuum.h +1 -4
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker_internals.h +1 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgwriter.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/interrupt.h +1 -1
- data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/postmaster.h +6 -3
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/startup.h +3 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/syslogger.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/walwriter.h +3 -1
- data/ext/pg_query/include/{regex → postgres/regex}/regex.h +9 -6
- data/ext/pg_query/include/{replication → postgres/replication}/logicallauncher.h +6 -1
- data/ext/pg_query/include/{replication → postgres/replication}/logicalproto.h +30 -10
- data/ext/pg_query/include/postgres/replication/logicalworker.h +32 -0
- data/ext/pg_query/include/{replication → postgres/replication}/origin.h +4 -4
- data/ext/pg_query/include/{replication → postgres/replication}/reorderbuffer.h +113 -45
- data/ext/pg_query/include/{replication → postgres/replication}/slot.h +25 -6
- data/ext/pg_query/include/{replication → postgres/replication}/syncrep.h +2 -8
- data/ext/pg_query/include/{replication → postgres/replication}/walreceiver.h +15 -9
- data/ext/pg_query/include/{replication → postgres/replication}/walsender.h +13 -13
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/prs2lock.h +1 -1
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteHandler.h +1 -4
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteManip.h +11 -2
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteSupport.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/backendid.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/block.h +24 -31
- data/ext/pg_query/include/{storage → postgres/storage}/buf.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/bufmgr.h +183 -87
- data/ext/pg_query/include/{storage → postgres/storage}/bufpage.h +146 -93
- data/ext/pg_query/include/{storage → postgres/storage}/condition_variable.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/dsm.h +3 -6
- data/ext/pg_query/include/{storage → postgres/storage}/dsm_impl.h +4 -1
- data/ext/pg_query/include/{storage → postgres/storage}/fd.h +24 -20
- data/ext/pg_query/include/{storage → postgres/storage}/fileset.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/ipc.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/item.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/itemid.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/itemptr.h +94 -57
- data/ext/pg_query/include/{storage → postgres/storage}/large_object.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/latch.h +9 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lmgr.h +6 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lock.h +21 -13
- data/ext/pg_query/include/{storage → postgres/storage}/lockdefs.h +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/lwlock.h +16 -2
- data/ext/pg_query/include/{storage → postgres/storage}/off.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pg_sema.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pg_shmem.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/pmsignal.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/predicate.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/proc.h +22 -17
- data/ext/pg_query/include/{storage → postgres/storage}/procarray.h +3 -2
- data/ext/pg_query/include/{storage → postgres/storage}/proclist_types.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/procsignal.h +3 -1
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/s_lock.h +66 -309
- data/ext/pg_query/include/{storage → postgres/storage}/sharedfileset.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shm_mq.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shm_toc.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/shmem.h +1 -23
- data/ext/pg_query/include/{storage → postgres/storage}/sinval.h +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/sinvaladt.h +4 -2
- data/ext/pg_query/include/{storage → postgres/storage}/smgr.h +12 -10
- data/ext/pg_query/include/{storage → postgres/storage}/spin.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/standby.h +9 -8
- data/ext/pg_query/include/{storage → postgres/storage}/standbydefs.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/sync.h +3 -3
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtag.h +7 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtaglist.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/deparse_utility.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/dest.h +1 -3
- data/ext/pg_query/include/{tcop → postgres/tcop}/fastpath.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/pquery.h +1 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/tcopprot.h +3 -6
- data/ext/pg_query/include/{tcop → postgres/tcop}/utility.h +1 -1
- data/ext/pg_query/include/{tsearch → postgres/tsearch}/ts_cache.h +2 -4
- data/ext/pg_query/include/{utils → postgres/utils}/acl.h +26 -81
- data/ext/pg_query/include/{utils → postgres/utils}/aclchk_internal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/array.h +19 -1
- data/ext/pg_query/include/{utils → postgres/utils}/backend_progress.h +2 -1
- data/ext/pg_query/include/{utils → postgres/utils}/backend_status.h +24 -3
- data/ext/pg_query/include/{utils → postgres/utils}/builtins.h +15 -6
- data/ext/pg_query/include/{utils → postgres/utils}/bytea.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/catcache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/date.h +37 -9
- data/ext/pg_query/include/{utils → postgres/utils}/datetime.h +41 -21
- data/ext/pg_query/include/{utils → postgres/utils}/datum.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/dsa.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/elog.h +104 -29
- data/ext/pg_query/include/{utils → postgres/utils}/expandeddatum.h +14 -3
- data/ext/pg_query/include/{utils → postgres/utils}/expandedrecord.h +14 -4
- data/ext/pg_query/include/{utils → postgres/utils}/float.h +7 -6
- data/ext/pg_query/include/{utils → postgres/utils}/fmgroids.h +54 -1
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrprotos.h +45 -3
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrtab.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/guc.h +59 -86
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +163 -0
- data/ext/pg_query/include/{utils → postgres/utils}/guc_tables.h +49 -3
- data/ext/pg_query/include/{utils → postgres/utils}/hsearch.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/inval.h +3 -3
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/{utils → postgres/utils}/lsyscache.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memdebug.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memutils.h +7 -51
- data/ext/pg_query/include/postgres/utils/memutils_internal.h +136 -0
- data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +237 -0
- data/ext/pg_query/include/{utils → postgres/utils}/numeric.h +20 -5
- data/ext/pg_query/include/{utils → postgres/utils}/palloc.h +9 -2
- data/ext/pg_query/include/{utils → postgres/utils}/partcache.h +3 -2
- data/ext/pg_query/include/{utils → postgres/utils}/pg_locale.h +22 -14
- data/ext/pg_query/include/{utils → postgres/utils}/pgstat_internal.h +37 -7
- data/ext/pg_query/include/{utils → postgres/utils}/plancache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/portal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/probes.h +6 -6
- data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
- data/ext/pg_query/include/{utils → postgres/utils}/queryenvironment.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/regproc.h +3 -3
- data/ext/pg_query/include/{utils → postgres/utils}/rel.h +60 -43
- data/ext/pg_query/include/{utils → postgres/utils}/relcache.h +13 -8
- data/ext/pg_query/include/{utils → postgres/utils}/reltrigger.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/resowner.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/ruleutils.h +6 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/snapmgr.h +4 -2
- data/ext/pg_query/include/{utils → postgres/utils}/snapshot.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sortsupport.h +2 -2
- data/ext/pg_query/include/{utils → postgres/utils}/syscache.h +4 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timeout.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timestamp.h +41 -11
- data/ext/pg_query/include/{utils → postgres/utils}/tuplesort.h +189 -35
- data/ext/pg_query/include/{utils → postgres/utils}/tuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/typcache.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/varlena.h +13 -1
- data/ext/pg_query/include/{utils → postgres/utils}/wait_event.h +9 -4
- data/ext/pg_query/include/{utils → postgres/utils}/xml.h +15 -5
- data/ext/pg_query/include/{postgres.h → postgres/varatt.h} +7 -457
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +6186 -5585
- data/ext/pg_query/include/protobuf/pg_query.pb.h +112443 -91222
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +19755 -17757
- data/ext/pg_query/pg_query_deparse.c +1 -10635
- data/ext/pg_query/pg_query_fingerprint.c +12 -8
- data/ext/pg_query/pg_query_fingerprint.h +1 -1
- data/ext/pg_query/pg_query_internal.h +1 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +1 -0
- data/ext/pg_query/pg_query_normalize.c +1 -1
- data/ext/pg_query/pg_query_outfuncs_json.c +6 -0
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +3 -2
- data/ext/pg_query/pg_query_parse.c +47 -5
- data/ext/pg_query/pg_query_parse_plpgsql.c +7 -5
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +1 -0
- data/ext/pg_query/pg_query_ruby.c +5 -0
- data/ext/pg_query/pg_query_ruby_freebsd.sym +2 -0
- data/ext/pg_query/pg_query_scan.c +1 -1
- data/ext/pg_query/pg_query_split.c +3 -3
- data/ext/pg_query/postgres_deparse.c +11067 -0
- data/ext/pg_query/postgres_deparse.h +9 -0
- data/ext/pg_query/src_backend_catalog_namespace.c +7 -2
- data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -1
- data/ext/pg_query/src_backend_commands_define.c +1 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +11 -70
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +14 -2
- data/ext/pg_query/src_backend_nodes_makefuncs.c +95 -1
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +283 -132
- data/ext/pg_query/src_backend_nodes_nodes.c +38 -0
- data/ext/pg_query/src_backend_nodes_value.c +1 -1
- data/ext/pg_query/src_backend_parser_gram.c +33208 -31806
- data/ext/pg_query/src_backend_parser_parser.c +28 -2
- data/ext/pg_query/src_backend_parser_scan.c +4318 -3329
- data/ext/pg_query/src_backend_parser_scansup.c +1 -1
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
- data/ext/pg_query/src_backend_tcop_postgres.c +66 -87
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_datum.c +5 -7
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_numutils.c +489 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +79 -5
- data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
- data/ext/pg_query/src_backend_utils_error_elog.c +371 -249
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +33 -1
- data/ext/pg_query/src_backend_utils_init_globals.c +6 -3
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +21 -67
- data/ext/pg_query/src_backend_utils_misc_guc_tables.c +492 -0
- data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +163 -0
- data/ext/pg_query/src_backend_utils_mmgr_aset.c +449 -312
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +398 -49
- data/ext/pg_query/src_backend_utils_mmgr_slab.c +1021 -0
- data/ext/pg_query/src_common_encnames.c +4 -1
- data/ext/pg_query/src_common_hashfn.c +1 -1
- data/ext/pg_query/src_common_keywords.c +1 -1
- data/ext/pg_query/src_common_kwlist_d.h +534 -510
- data/ext/pg_query/src_common_kwlookup.c +1 -1
- data/ext/pg_query/src_common_psprintf.c +1 -1
- data/ext/pg_query/src_common_stringinfo.c +4 -4
- data/ext/pg_query/src_common_wchar.c +9 -8
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +661 -694
- 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 +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
- data/ext/pg_query/src_port_pg_bitutils.c +79 -5
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_snprintf.c +6 -10
- data/ext/pg_query/src_port_strerror.c +1 -1
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/fingerprint.rb +2 -3
- data/lib/pg_query/node.rb +16 -11
- data/lib/pg_query/parse.rb +1 -1
- data/lib/pg_query/pg_query_pb.rb +166 -3191
- data/lib/pg_query/treewalker.rb +23 -5
- data/lib/pg_query/version.rb +1 -1
- metadata +432 -380
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
- data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
- data/ext/pg_query/include/commands/variable.h +0 -38
- data/ext/pg_query/include/common/ip.h +0 -31
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/kwlist_d.h +0 -1095
- data/ext/pg_query/include/parser/gram.h +0 -1101
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/postmaster/pgarch.h +0 -73
- data/ext/pg_query/include/replication/logicalworker.h +0 -19
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/utils/dynahash.h +0 -20
- data/ext/pg_query/include/utils/pg_lsn.h +0 -29
- data/ext/pg_query/include/utils/pidfile.h +0 -56
- data/ext/pg_query/include/utils/ps_status.h +0 -25
- data/ext/pg_query/include/utils/rls.h +0 -50
- data/ext/pg_query/include/utils/tzparser.h +0 -39
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2201
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
- data/ext/pg_query/src_common_pg_prng.c +0 -152
- data/ext/pg_query/src_common_string.c +0 -92
- data/ext/pg_query/src_port_pgsleep.c +0 -69
- data/ext/pg_query/src_port_strnlen.c +0 -39
- /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
- /data/ext/pg_query/include/{plerrcodes.h → postgres/plerrcodes.h} +0 -0
- /data/ext/pg_query/include/{storage → postgres/storage}/lwlocknames.h +0 -0
- /data/ext/pg_query/include/{utils → postgres/utils}/errcodes.h +0 -0
@@ -3,7 +3,7 @@
|
|
3
3
|
* dshash.h
|
4
4
|
* Concurrent hash tables backed by dynamic shared memory areas.
|
5
5
|
*
|
6
|
-
* Portions Copyright (c) 1996-
|
6
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
7
7
|
* Portions Copyright (c) 1994, Regents of the University of California
|
8
8
|
*
|
9
9
|
* IDENTIFICATION
|
@@ -23,6 +23,9 @@ typedef struct dshash_table dshash_table;
|
|
23
23
|
/* A handle for a dshash_table which can be shared with other processes. */
|
24
24
|
typedef dsa_pointer dshash_table_handle;
|
25
25
|
|
26
|
+
/* Sentinel value to use for invalid dshash_table handles. */
|
27
|
+
#define DSHASH_HANDLE_INVALID ((dshash_table_handle) InvalidDsaPointer)
|
28
|
+
|
26
29
|
/* The type for hash values. */
|
27
30
|
typedef uint32 dshash_hash;
|
28
31
|
|
@@ -10,20 +10,36 @@
|
|
10
10
|
* the link fields in the remainder would be wasted space. But usually,
|
11
11
|
* it saves space to not have separately-allocated list nodes.)
|
12
12
|
*
|
13
|
+
* The doubly-linked list comes in 2 forms. dlist_head defines a head of a
|
14
|
+
* doubly-linked list of dlist_nodes, whereas dclist_head defines the head of
|
15
|
+
* a doubly-linked list of dlist_nodes with an additional 'count' field to
|
16
|
+
* keep track of how many items are contained within the given list. For
|
17
|
+
* simplicity, dlist_head and dclist_head share the same node and iterator
|
18
|
+
* types. The functions to manipulate a dlist_head always have a name
|
19
|
+
* starting with "dlist", whereas functions to manipulate a dclist_head have a
|
20
|
+
* name starting with "dclist". dclist_head comes with an additional function
|
21
|
+
* (dclist_count) to return the number of entries in the list. dclists are
|
22
|
+
* able to store a maximum of PG_UINT32_MAX elements. It is up to the caller
|
23
|
+
* to ensure no more than this many items are added to a dclist.
|
24
|
+
*
|
13
25
|
* None of the functions here allocate any memory; they just manipulate
|
14
|
-
* externally managed memory.
|
15
|
-
*
|
26
|
+
* externally managed memory. With the exception doubly-linked count lists
|
27
|
+
* providing the ability to obtain the number of items in the list, the APIs
|
28
|
+
* for singly and both doubly linked lists are identical as far as
|
29
|
+
* capabilities of both allow.
|
16
30
|
*
|
17
31
|
* Each list has a list header, which exists even when the list is empty.
|
18
32
|
* An empty singly-linked list has a NULL pointer in its header.
|
19
|
-
*
|
20
|
-
*
|
33
|
+
*
|
34
|
+
* For both doubly-linked list types, there are two valid ways to represent an
|
35
|
+
* empty list. The head's 'next' pointer can either be NULL or the head's
|
36
|
+
* 'next' and 'prev' links can both point back to the list head (circular).
|
21
37
|
* (If a dlist is modified and then all its elements are deleted, it will be
|
22
|
-
* in the circular state.)
|
38
|
+
* in the circular state.). We prefer circular dlists because there are some
|
23
39
|
* operations that can be done without branches (and thus faster) on lists
|
24
40
|
* that use circular representation. However, it is often convenient to
|
25
41
|
* initialize list headers to zeroes rather than setting them up with an
|
26
|
-
* explicit initialization function, so we also allow the
|
42
|
+
* explicit initialization function, so we also allow the NULL initialization.
|
27
43
|
*
|
28
44
|
* EXAMPLES
|
29
45
|
*
|
@@ -96,7 +112,7 @@
|
|
96
112
|
* }
|
97
113
|
*
|
98
114
|
*
|
99
|
-
* Portions Copyright (c) 1996-
|
115
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
100
116
|
* Portions Copyright (c) 1994, Regents of the University of California
|
101
117
|
*
|
102
118
|
* IDENTIFICATION
|
@@ -146,15 +162,17 @@ typedef struct dlist_head
|
|
146
162
|
|
147
163
|
|
148
164
|
/*
|
149
|
-
* Doubly linked list iterator.
|
165
|
+
* Doubly linked list iterator type for dlist_head and dclist_head types.
|
150
166
|
*
|
151
|
-
* Used as state in dlist_foreach() and dlist_reverse_foreach()
|
152
|
-
*
|
167
|
+
* Used as state in dlist_foreach() and dlist_reverse_foreach() (and the
|
168
|
+
* dclist variant thereof).
|
169
|
+
*
|
170
|
+
* To get the current element of the iteration use the 'cur' member.
|
153
171
|
*
|
154
172
|
* Iterations using this are *not* allowed to change the list while iterating!
|
155
173
|
*
|
156
174
|
* NB: We use an extra "end" field here to avoid multiple evaluations of
|
157
|
-
* arguments in the dlist_foreach()
|
175
|
+
* arguments in the dlist_foreach() and dclist_foreach() macros.
|
158
176
|
*/
|
159
177
|
typedef struct dlist_iter
|
160
178
|
{
|
@@ -163,10 +181,12 @@ typedef struct dlist_iter
|
|
163
181
|
} dlist_iter;
|
164
182
|
|
165
183
|
/*
|
166
|
-
* Doubly linked list iterator
|
184
|
+
* Doubly linked list iterator for both dlist_head and dclist_head types.
|
185
|
+
* This iterator type allows some modifications while iterating.
|
167
186
|
*
|
168
|
-
* Used as state in dlist_foreach_modify()
|
169
|
-
*
|
187
|
+
* Used as state in dlist_foreach_modify() and dclist_foreach_modify().
|
188
|
+
*
|
189
|
+
* To get the current element of the iteration use the 'cur' member.
|
170
190
|
*
|
171
191
|
* Iterations using this are only allowed to change the list at the current
|
172
192
|
* point of iteration. It is fine to delete the current node, but it is *not*
|
@@ -182,6 +202,19 @@ typedef struct dlist_mutable_iter
|
|
182
202
|
dlist_node *end; /* last node we'll iterate to */
|
183
203
|
} dlist_mutable_iter;
|
184
204
|
|
205
|
+
/*
|
206
|
+
* Head of a doubly linked list with a count of the number of items
|
207
|
+
*
|
208
|
+
* This internally makes use of a dlist to implement the actual list. When
|
209
|
+
* items are added or removed from the list the count is updated to reflect
|
210
|
+
* the current number of items in the list.
|
211
|
+
*/
|
212
|
+
typedef struct dclist_head
|
213
|
+
{
|
214
|
+
dlist_head dlist; /* the actual list header */
|
215
|
+
uint32 count; /* the number of items in the list */
|
216
|
+
} dclist_head;
|
217
|
+
|
185
218
|
/*
|
186
219
|
* Node of a singly linked list.
|
187
220
|
*
|
@@ -246,17 +279,19 @@ typedef struct slist_mutable_iter
|
|
246
279
|
|
247
280
|
/* Static initializers */
|
248
281
|
#define DLIST_STATIC_INIT(name) {{&(name).head, &(name).head}}
|
282
|
+
#define DCLIST_STATIC_INIT(name) {{{&(name).dlist.head, &(name).dlist.head}}, 0}
|
249
283
|
#define SLIST_STATIC_INIT(name) {{NULL}}
|
250
284
|
|
251
285
|
|
252
286
|
/* Prototypes for functions too big to be inline */
|
253
287
|
|
254
288
|
/* Caution: this is O(n); consider using slist_delete_current() instead */
|
255
|
-
extern void slist_delete(slist_head *head, slist_node *node);
|
289
|
+
extern void slist_delete(slist_head *head, const slist_node *node);
|
256
290
|
|
257
291
|
#ifdef ILIST_DEBUG
|
258
|
-
extern void
|
259
|
-
extern void
|
292
|
+
extern void dlist_member_check(const dlist_head *head, const dlist_node *node);
|
293
|
+
extern void dlist_check(const dlist_head *head);
|
294
|
+
extern void slist_check(const slist_head *head);
|
260
295
|
#else
|
261
296
|
/*
|
262
297
|
* These seemingly useless casts to void are here to keep the compiler quiet
|
@@ -264,6 +299,7 @@ extern void slist_check(slist_head *head);
|
|
264
299
|
* in which functions the only point of passing the list head pointer is to be
|
265
300
|
* able to run these checks.
|
266
301
|
*/
|
302
|
+
#define dlist_member_check(head, node) ((void) (head))
|
267
303
|
#define dlist_check(head) ((void) (head))
|
268
304
|
#define slist_check(head) ((void) (head))
|
269
305
|
#endif /* ILIST_DEBUG */
|
@@ -280,13 +316,24 @@ dlist_init(dlist_head *head)
|
|
280
316
|
head->head.next = head->head.prev = &head->head;
|
281
317
|
}
|
282
318
|
|
319
|
+
/*
|
320
|
+
* Initialize a doubly linked list element.
|
321
|
+
*
|
322
|
+
* This is only needed when dlist_node_is_detached() may be needed.
|
323
|
+
*/
|
324
|
+
static inline void
|
325
|
+
dlist_node_init(dlist_node *node)
|
326
|
+
{
|
327
|
+
node->next = node->prev = NULL;
|
328
|
+
}
|
329
|
+
|
283
330
|
/*
|
284
331
|
* Is the list empty?
|
285
332
|
*
|
286
333
|
* An empty list has either its first 'next' pointer set to NULL, or to itself.
|
287
334
|
*/
|
288
335
|
static inline bool
|
289
|
-
dlist_is_empty(dlist_head *head)
|
336
|
+
dlist_is_empty(const dlist_head *head)
|
290
337
|
{
|
291
338
|
dlist_check(head);
|
292
339
|
|
@@ -361,6 +408,41 @@ dlist_delete(dlist_node *node)
|
|
361
408
|
node->next->prev = node->prev;
|
362
409
|
}
|
363
410
|
|
411
|
+
/*
|
412
|
+
* Like dlist_delete(), but also sets next/prev to NULL to signal not being in
|
413
|
+
* a list.
|
414
|
+
*/
|
415
|
+
static inline void
|
416
|
+
dlist_delete_thoroughly(dlist_node *node)
|
417
|
+
{
|
418
|
+
node->prev->next = node->next;
|
419
|
+
node->next->prev = node->prev;
|
420
|
+
node->next = NULL;
|
421
|
+
node->prev = NULL;
|
422
|
+
}
|
423
|
+
|
424
|
+
/*
|
425
|
+
* Same as dlist_delete, but performs checks in ILIST_DEBUG builds to ensure
|
426
|
+
* that 'node' belongs to 'head'.
|
427
|
+
*/
|
428
|
+
static inline void
|
429
|
+
dlist_delete_from(dlist_head *head, dlist_node *node)
|
430
|
+
{
|
431
|
+
dlist_member_check(head, node);
|
432
|
+
dlist_delete(node);
|
433
|
+
}
|
434
|
+
|
435
|
+
/*
|
436
|
+
* Like dlist_delete_from, but also sets next/prev to NULL to signal not
|
437
|
+
* being in a list.
|
438
|
+
*/
|
439
|
+
static inline void
|
440
|
+
dlist_delete_from_thoroughly(dlist_head *head, dlist_node *node)
|
441
|
+
{
|
442
|
+
dlist_member_check(head, node);
|
443
|
+
dlist_delete_thoroughly(node);
|
444
|
+
}
|
445
|
+
|
364
446
|
/*
|
365
447
|
* Remove and return the first node from a list (there must be one).
|
366
448
|
*/
|
@@ -418,7 +500,7 @@ dlist_move_tail(dlist_head *head, dlist_node *node)
|
|
418
500
|
* Caution: unreliable if 'node' is not in the list.
|
419
501
|
*/
|
420
502
|
static inline bool
|
421
|
-
dlist_has_next(dlist_head *head, dlist_node *node)
|
503
|
+
dlist_has_next(const dlist_head *head, const dlist_node *node)
|
422
504
|
{
|
423
505
|
return node->next != &head->head;
|
424
506
|
}
|
@@ -428,11 +510,26 @@ dlist_has_next(dlist_head *head, dlist_node *node)
|
|
428
510
|
* Caution: unreliable if 'node' is not in the list.
|
429
511
|
*/
|
430
512
|
static inline bool
|
431
|
-
dlist_has_prev(dlist_head *head, dlist_node *node)
|
513
|
+
dlist_has_prev(const dlist_head *head, const dlist_node *node)
|
432
514
|
{
|
433
515
|
return node->prev != &head->head;
|
434
516
|
}
|
435
517
|
|
518
|
+
/*
|
519
|
+
* Check if node is detached. A node is only detached if it either has been
|
520
|
+
* initialized with dlist_init_node(), or deleted with
|
521
|
+
* dlist_delete_thoroughly() / dlist_delete_from_thoroughly() /
|
522
|
+
* dclist_delete_from_thoroughly().
|
523
|
+
*/
|
524
|
+
static inline bool
|
525
|
+
dlist_node_is_detached(const dlist_node *node)
|
526
|
+
{
|
527
|
+
Assert((node->next == NULL && node->prev == NULL) ||
|
528
|
+
(node->next != NULL && node->prev != NULL));
|
529
|
+
|
530
|
+
return node->next == NULL;
|
531
|
+
}
|
532
|
+
|
436
533
|
/*
|
437
534
|
* Return the next node in the list (there must be one).
|
438
535
|
*/
|
@@ -562,6 +659,322 @@ dlist_tail_node(dlist_head *head)
|
|
562
659
|
(iter).cur != (iter).end; \
|
563
660
|
(iter).cur = (iter).cur->prev)
|
564
661
|
|
662
|
+
/* doubly-linked count list implementation */
|
663
|
+
|
664
|
+
/*
|
665
|
+
* dclist_init
|
666
|
+
* Initialize a doubly linked count list.
|
667
|
+
*
|
668
|
+
* Previous state will be thrown away without any cleanup.
|
669
|
+
*/
|
670
|
+
static inline void
|
671
|
+
dclist_init(dclist_head *head)
|
672
|
+
{
|
673
|
+
dlist_init(&head->dlist);
|
674
|
+
head->count = 0;
|
675
|
+
}
|
676
|
+
|
677
|
+
/*
|
678
|
+
* dclist_is_empty
|
679
|
+
* Returns true if the list is empty, otherwise false.
|
680
|
+
*/
|
681
|
+
static inline bool
|
682
|
+
dclist_is_empty(const dclist_head *head)
|
683
|
+
{
|
684
|
+
Assert(dlist_is_empty(&head->dlist) == (head->count == 0));
|
685
|
+
return (head->count == 0);
|
686
|
+
}
|
687
|
+
|
688
|
+
/*
|
689
|
+
* dclist_push_head
|
690
|
+
* Insert a node at the beginning of the list.
|
691
|
+
*/
|
692
|
+
static inline void
|
693
|
+
dclist_push_head(dclist_head *head, dlist_node *node)
|
694
|
+
{
|
695
|
+
if (head->dlist.head.next == NULL) /* convert NULL header to circular */
|
696
|
+
dclist_init(head);
|
697
|
+
|
698
|
+
dlist_push_head(&head->dlist, node);
|
699
|
+
head->count++;
|
700
|
+
|
701
|
+
Assert(head->count > 0); /* count overflow check */
|
702
|
+
}
|
703
|
+
|
704
|
+
/*
|
705
|
+
* dclist_push_tail
|
706
|
+
* Insert a node at the end of the list.
|
707
|
+
*/
|
708
|
+
static inline void
|
709
|
+
dclist_push_tail(dclist_head *head, dlist_node *node)
|
710
|
+
{
|
711
|
+
if (head->dlist.head.next == NULL) /* convert NULL header to circular */
|
712
|
+
dclist_init(head);
|
713
|
+
|
714
|
+
dlist_push_tail(&head->dlist, node);
|
715
|
+
head->count++;
|
716
|
+
|
717
|
+
Assert(head->count > 0); /* count overflow check */
|
718
|
+
}
|
719
|
+
|
720
|
+
/*
|
721
|
+
* dclist_insert_after
|
722
|
+
* Insert a node after another *in the same list*
|
723
|
+
*
|
724
|
+
* Caution: 'after' must be a member of 'head'.
|
725
|
+
*/
|
726
|
+
static inline void
|
727
|
+
dclist_insert_after(dclist_head *head, dlist_node *after, dlist_node *node)
|
728
|
+
{
|
729
|
+
dlist_member_check(&head->dlist, after);
|
730
|
+
Assert(head->count > 0); /* must be at least 1 already */
|
731
|
+
|
732
|
+
dlist_insert_after(after, node);
|
733
|
+
head->count++;
|
734
|
+
|
735
|
+
Assert(head->count > 0); /* count overflow check */
|
736
|
+
}
|
737
|
+
|
738
|
+
/*
|
739
|
+
* dclist_insert_before
|
740
|
+
* Insert a node before another *in the same list*
|
741
|
+
*
|
742
|
+
* Caution: 'before' must be a member of 'head'.
|
743
|
+
*/
|
744
|
+
static inline void
|
745
|
+
dclist_insert_before(dclist_head *head, dlist_node *before, dlist_node *node)
|
746
|
+
{
|
747
|
+
dlist_member_check(&head->dlist, before);
|
748
|
+
Assert(head->count > 0); /* must be at least 1 already */
|
749
|
+
|
750
|
+
dlist_insert_before(before, node);
|
751
|
+
head->count++;
|
752
|
+
|
753
|
+
Assert(head->count > 0); /* count overflow check */
|
754
|
+
}
|
755
|
+
|
756
|
+
/*
|
757
|
+
* dclist_delete_from
|
758
|
+
* Deletes 'node' from 'head'.
|
759
|
+
*
|
760
|
+
* Caution: 'node' must be a member of 'head'.
|
761
|
+
*/
|
762
|
+
static inline void
|
763
|
+
dclist_delete_from(dclist_head *head, dlist_node *node)
|
764
|
+
{
|
765
|
+
Assert(head->count > 0);
|
766
|
+
|
767
|
+
dlist_delete_from(&head->dlist, node);
|
768
|
+
head->count--;
|
769
|
+
}
|
770
|
+
|
771
|
+
/*
|
772
|
+
* Like dclist_delete_from(), but also sets next/prev to NULL to signal not
|
773
|
+
* being in a list.
|
774
|
+
*/
|
775
|
+
static inline void
|
776
|
+
dclist_delete_from_thoroughly(dclist_head *head, dlist_node *node)
|
777
|
+
{
|
778
|
+
Assert(head->count > 0);
|
779
|
+
|
780
|
+
dlist_delete_from_thoroughly(&head->dlist, node);
|
781
|
+
head->count--;
|
782
|
+
}
|
783
|
+
|
784
|
+
/*
|
785
|
+
* dclist_pop_head_node
|
786
|
+
* Remove and return the first node from a list (there must be one).
|
787
|
+
*/
|
788
|
+
static inline dlist_node *
|
789
|
+
dclist_pop_head_node(dclist_head *head)
|
790
|
+
{
|
791
|
+
dlist_node *node;
|
792
|
+
|
793
|
+
Assert(head->count > 0);
|
794
|
+
|
795
|
+
node = dlist_pop_head_node(&head->dlist);
|
796
|
+
head->count--;
|
797
|
+
return node;
|
798
|
+
}
|
799
|
+
|
800
|
+
/*
|
801
|
+
* dclist_move_head
|
802
|
+
* Move 'node' from its current position in the list to the head position
|
803
|
+
* in 'head'.
|
804
|
+
*
|
805
|
+
* Caution: 'node' must be a member of 'head'.
|
806
|
+
*/
|
807
|
+
static inline void
|
808
|
+
dclist_move_head(dclist_head *head, dlist_node *node)
|
809
|
+
{
|
810
|
+
dlist_member_check(&head->dlist, node);
|
811
|
+
Assert(head->count > 0);
|
812
|
+
|
813
|
+
dlist_move_head(&head->dlist, node);
|
814
|
+
}
|
815
|
+
|
816
|
+
/*
|
817
|
+
* dclist_move_tail
|
818
|
+
* Move 'node' from its current position in the list to the tail position
|
819
|
+
* in 'head'.
|
820
|
+
*
|
821
|
+
* Caution: 'node' must be a member of 'head'.
|
822
|
+
*/
|
823
|
+
static inline void
|
824
|
+
dclist_move_tail(dclist_head *head, dlist_node *node)
|
825
|
+
{
|
826
|
+
dlist_member_check(&head->dlist, node);
|
827
|
+
Assert(head->count > 0);
|
828
|
+
|
829
|
+
dlist_move_tail(&head->dlist, node);
|
830
|
+
}
|
831
|
+
|
832
|
+
/*
|
833
|
+
* dclist_has_next
|
834
|
+
* Check whether 'node' has a following node.
|
835
|
+
*
|
836
|
+
* Caution: 'node' must be a member of 'head'.
|
837
|
+
*/
|
838
|
+
static inline bool
|
839
|
+
dclist_has_next(const dclist_head *head, const dlist_node *node)
|
840
|
+
{
|
841
|
+
dlist_member_check(&head->dlist, node);
|
842
|
+
Assert(head->count > 0);
|
843
|
+
|
844
|
+
return dlist_has_next(&head->dlist, node);
|
845
|
+
}
|
846
|
+
|
847
|
+
/*
|
848
|
+
* dclist_has_prev
|
849
|
+
* Check whether 'node' has a preceding node.
|
850
|
+
*
|
851
|
+
* Caution: 'node' must be a member of 'head'.
|
852
|
+
*/
|
853
|
+
static inline bool
|
854
|
+
dclist_has_prev(const dclist_head *head, const dlist_node *node)
|
855
|
+
{
|
856
|
+
dlist_member_check(&head->dlist, node);
|
857
|
+
Assert(head->count > 0);
|
858
|
+
|
859
|
+
return dlist_has_prev(&head->dlist, node);
|
860
|
+
}
|
861
|
+
|
862
|
+
/*
|
863
|
+
* dclist_next_node
|
864
|
+
* Return the next node in the list (there must be one).
|
865
|
+
*/
|
866
|
+
static inline dlist_node *
|
867
|
+
dclist_next_node(dclist_head *head, dlist_node *node)
|
868
|
+
{
|
869
|
+
Assert(head->count > 0);
|
870
|
+
|
871
|
+
return dlist_next_node(&head->dlist, node);
|
872
|
+
}
|
873
|
+
|
874
|
+
/*
|
875
|
+
* dclist_prev_node
|
876
|
+
* Return the prev node in the list (there must be one).
|
877
|
+
*/
|
878
|
+
static inline dlist_node *
|
879
|
+
dclist_prev_node(dclist_head *head, dlist_node *node)
|
880
|
+
{
|
881
|
+
Assert(head->count > 0);
|
882
|
+
|
883
|
+
return dlist_prev_node(&head->dlist, node);
|
884
|
+
}
|
885
|
+
|
886
|
+
/* internal support function to get address of head element's struct */
|
887
|
+
static inline void *
|
888
|
+
dclist_head_element_off(dclist_head *head, size_t off)
|
889
|
+
{
|
890
|
+
Assert(!dclist_is_empty(head));
|
891
|
+
|
892
|
+
return (char *) head->dlist.head.next - off;
|
893
|
+
}
|
894
|
+
|
895
|
+
/*
|
896
|
+
* dclist_head_node
|
897
|
+
* Return the first node in the list (there must be one).
|
898
|
+
*/
|
899
|
+
static inline dlist_node *
|
900
|
+
dclist_head_node(dclist_head *head)
|
901
|
+
{
|
902
|
+
Assert(head->count > 0);
|
903
|
+
|
904
|
+
return (dlist_node *) dlist_head_element_off(&head->dlist, 0);
|
905
|
+
}
|
906
|
+
|
907
|
+
/* internal support function to get address of tail element's struct */
|
908
|
+
static inline void *
|
909
|
+
dclist_tail_element_off(dclist_head *head, size_t off)
|
910
|
+
{
|
911
|
+
Assert(!dclist_is_empty(head));
|
912
|
+
|
913
|
+
return (char *) head->dlist.head.prev - off;
|
914
|
+
}
|
915
|
+
|
916
|
+
/*
|
917
|
+
* Return the last node in the list (there must be one).
|
918
|
+
*/
|
919
|
+
static inline dlist_node *
|
920
|
+
dclist_tail_node(dclist_head *head)
|
921
|
+
{
|
922
|
+
Assert(head->count > 0);
|
923
|
+
|
924
|
+
return (dlist_node *) dlist_tail_element_off(&head->dlist, 0);
|
925
|
+
}
|
926
|
+
|
927
|
+
/*
|
928
|
+
* dclist_count
|
929
|
+
* Returns the stored number of entries in 'head'
|
930
|
+
*/
|
931
|
+
static inline uint32
|
932
|
+
dclist_count(const dclist_head *head)
|
933
|
+
{
|
934
|
+
Assert(dlist_is_empty(&head->dlist) == (head->count == 0));
|
935
|
+
|
936
|
+
return head->count;
|
937
|
+
}
|
938
|
+
|
939
|
+
/*
|
940
|
+
* Return the containing struct of 'type' where 'membername' is the dlist_node
|
941
|
+
* pointed at by 'ptr'.
|
942
|
+
*
|
943
|
+
* This is used to convert a dlist_node * back to its containing struct.
|
944
|
+
*
|
945
|
+
* Note: This is effectively just the same as dlist_container, so reuse that.
|
946
|
+
*/
|
947
|
+
#define dclist_container(type, membername, ptr) \
|
948
|
+
dlist_container(type, membername, ptr)
|
949
|
+
|
950
|
+
/*
|
951
|
+
* Return the address of the first element in the list.
|
952
|
+
*
|
953
|
+
* The list must not be empty.
|
954
|
+
*/
|
955
|
+
#define dclist_head_element(type, membername, lhead) \
|
956
|
+
(AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \
|
957
|
+
(type *) dclist_head_element_off(lhead, offsetof(type, membername)))
|
958
|
+
|
959
|
+
/*
|
960
|
+
* Return the address of the last element in the list.
|
961
|
+
*
|
962
|
+
* The list must not be empty.
|
963
|
+
*/
|
964
|
+
#define dclist_tail_element(type, membername, lhead) \
|
965
|
+
(AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \
|
966
|
+
((type *) dclist_tail_element_off(lhead, offsetof(type, membername))))
|
967
|
+
|
968
|
+
|
969
|
+
/* Iterators for dclists */
|
970
|
+
#define dclist_foreach(iter, lhead) \
|
971
|
+
dlist_foreach(iter, &((lhead)->dlist))
|
972
|
+
|
973
|
+
#define dclist_foreach_modify(iter, lhead) \
|
974
|
+
dlist_foreach_modify(iter, &((lhead)->dlist))
|
975
|
+
|
976
|
+
#define dclist_reverse_foreach(iter, lhead) \
|
977
|
+
dlist_reverse_foreach(iter, &((lhead)->dlist))
|
565
978
|
|
566
979
|
/* singly linked list implementation */
|
567
980
|
|
@@ -579,7 +992,7 @@ slist_init(slist_head *head)
|
|
579
992
|
* Is the list empty?
|
580
993
|
*/
|
581
994
|
static inline bool
|
582
|
-
slist_is_empty(slist_head *head)
|
995
|
+
slist_is_empty(const slist_head *head)
|
583
996
|
{
|
584
997
|
slist_check(head);
|
585
998
|
|
@@ -627,7 +1040,7 @@ slist_pop_head_node(slist_head *head)
|
|
627
1040
|
* Check whether 'node' has a following node.
|
628
1041
|
*/
|
629
1042
|
static inline bool
|
630
|
-
slist_has_next(slist_head *head, slist_node *node)
|
1043
|
+
slist_has_next(const slist_head *head, const slist_node *node)
|
631
1044
|
{
|
632
1045
|
slist_check(head);
|
633
1046
|
|
@@ -87,7 +87,7 @@
|
|
87
87
|
* looking or is done - buckets following a deleted element are shifted
|
88
88
|
* backwards, unless they're empty or already at their optimal position.
|
89
89
|
*
|
90
|
-
* Portions Copyright (c) 1996-
|
90
|
+
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
91
91
|
* Portions Copyright (c) 1994, Regents of the University of California
|
92
92
|
*
|
93
93
|
* src/include/lib/simplehash.h
|
@@ -546,13 +546,13 @@ SH_GROW(SH_TYPE * tb, uint64 newsize)
|
|
546
546
|
if (oldentry->status == SH_STATUS_IN_USE)
|
547
547
|
{
|
548
548
|
uint32 hash;
|
549
|
-
uint32
|
549
|
+
uint32 startelem2;
|
550
550
|
uint32 curelem;
|
551
551
|
SH_ELEMENT_TYPE *newentry;
|
552
552
|
|
553
553
|
hash = SH_ENTRY_HASH(tb, oldentry);
|
554
|
-
|
555
|
-
curelem =
|
554
|
+
startelem2 = SH_INITIAL_BUCKET(tb, hash);
|
555
|
+
curelem = startelem2;
|
556
556
|
|
557
557
|
/* find empty element to put data into */
|
558
558
|
while (true)
|
@@ -564,7 +564,7 @@ SH_GROW(SH_TYPE * tb, uint64 newsize)
|
|
564
564
|
break;
|
565
565
|
}
|
566
566
|
|
567
|
-
curelem = SH_NEXT(tb, curelem,
|
567
|
+
curelem = SH_NEXT(tb, curelem, startelem2);
|
568
568
|
}
|
569
569
|
|
570
570
|
/* copy entry to new slot */
|
@@ -810,7 +810,7 @@ SH_LOOKUP_HASH_INTERNAL(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash)
|
|
810
810
|
}
|
811
811
|
|
812
812
|
/*
|
813
|
-
* Lookup
|
813
|
+
* Lookup entry in hash table. Returns NULL if key not present.
|
814
814
|
*/
|
815
815
|
SH_SCOPE SH_ELEMENT_TYPE *
|
816
816
|
SH_LOOKUP(SH_TYPE * tb, SH_KEY_TYPE key)
|
@@ -821,7 +821,7 @@ SH_LOOKUP(SH_TYPE * tb, SH_KEY_TYPE key)
|
|
821
821
|
}
|
822
822
|
|
823
823
|
/*
|
824
|
-
* Lookup
|
824
|
+
* Lookup entry in hash table using an already-calculated hash.
|
825
825
|
*
|
826
826
|
* Returns NULL if key not present.
|
827
827
|
*/
|
@@ -964,7 +964,6 @@ SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry)
|
|
964
964
|
SH_SCOPE void
|
965
965
|
SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter)
|
966
966
|
{
|
967
|
-
int i;
|
968
967
|
uint64 startelem = PG_UINT64_MAX;
|
969
968
|
|
970
969
|
/*
|
@@ -972,7 +971,7 @@ SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter)
|
|
972
971
|
* supported, we want to start/end at an element that cannot be affected
|
973
972
|
* by elements being shifted.
|
974
973
|
*/
|
975
|
-
for (i = 0; i < tb->size; i++)
|
974
|
+
for (uint32 i = 0; i < tb->size; i++)
|
976
975
|
{
|
977
976
|
SH_ELEMENT_TYPE *entry = &tb->data[i];
|
978
977
|
|
@@ -983,6 +982,7 @@ SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter)
|
|
983
982
|
}
|
984
983
|
}
|
985
984
|
|
985
|
+
/* we should have found an empty element */
|
986
986
|
Assert(startelem < SH_MAX_SIZE);
|
987
987
|
|
988
988
|
/*
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* A template for a sort algorithm that supports varying degrees of
|
6
6
|
* specialization.
|
7
7
|
*
|
8
|
-
* Copyright (c) 2021-
|
8
|
+
* Copyright (c) 2021-2023, PostgreSQL Global Development Group
|
9
9
|
* Portions Copyright (c) 1992-1994, Regents of the University of California
|
10
10
|
*
|
11
11
|
* Usage notes:
|