pg_query 4.2.1 → 5.1.0
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 +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:
|