pg_query 2.0.3 → 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 +165 -0
- data/README.md +67 -29
- data/Rakefile +8 -23
- data/ext/pg_query/extconf.rb +21 -3
- data/ext/pg_query/include/pg_query.h +29 -4
- data/ext/pg_query/include/pg_query_enum_defs.c +551 -272
- data/ext/pg_query/include/pg_query_fingerprint_conds.c +563 -470
- data/ext/pg_query/include/pg_query_fingerprint_defs.c +5403 -3945
- data/ext/pg_query/include/pg_query_outfuncs_conds.c +402 -330
- data/ext/pg_query/include/pg_query_outfuncs_defs.c +1319 -1059
- data/ext/pg_query/include/pg_query_readfuncs_conds.c +141 -118
- data/ext/pg_query/include/pg_query_readfuncs_defs.c +1685 -1379
- data/ext/pg_query/include/{access → postgres/access}/amapi.h +47 -1
- data/ext/pg_query/include/{access → postgres/access}/attmap.h +5 -3
- data/ext/pg_query/include/{access → postgres/access}/attnum.h +2 -2
- data/ext/pg_query/include/{access → postgres/access}/clog.h +4 -2
- data/ext/pg_query/include/{access → postgres/access}/commit_ts.h +6 -9
- data/ext/pg_query/include/{access → postgres/access}/detoast.h +1 -11
- data/ext/pg_query/include/{access → postgres/access}/genam.h +21 -16
- data/ext/pg_query/include/{access → postgres/access}/gin.h +17 -4
- data/ext/pg_query/include/{access → postgres/access}/htup.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/htup_details.h +80 -88
- data/ext/pg_query/include/{access → postgres/access}/itup.h +61 -52
- 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 +17 -2
- data/ext/pg_query/include/postgres/access/rmgr.h +62 -0
- data/ext/pg_query/include/{access → postgres/access}/rmgrlist.h +24 -24
- 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 +4 -2
- data/ext/pg_query/include/{access → postgres/access}/sysattr.h +1 -1
- data/ext/pg_query/include/{access → postgres/access}/table.h +2 -1
- data/ext/pg_query/include/{access → postgres/access}/tableam.h +337 -62
- data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
- data/ext/pg_query/include/{access → postgres/access}/transam.h +123 -13
- 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 +60 -100
- data/ext/pg_query/include/{access → postgres/access}/twophase.h +5 -1
- data/ext/pg_query/include/{access → postgres/access}/xact.h +99 -32
- data/ext/pg_query/include/{access → postgres/access}/xlog.h +69 -165
- data/ext/pg_query/include/{access → postgres/access}/xlog_internal.h +147 -73
- data/ext/pg_query/include/postgres/access/xlogbackup.h +41 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogdefs.h +13 -40
- data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
- data/ext/pg_query/include/{access → postgres/access}/xlogreader.h +154 -37
- data/ext/pg_query/include/{access → postgres/access}/xlogrecord.h +34 -13
- data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
- data/ext/pg_query/include/postgres/archive/archive_module.h +59 -0
- data/ext/pg_query/include/{c.h → postgres/c.h} +245 -188
- data/ext/pg_query/include/{catalog → postgres/catalog}/catalog.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/catversion.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/dependency.h +14 -19
- data/ext/pg_query/include/postgres/catalog/genbki.h +143 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/index.h +20 -5
- data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
- data/ext/pg_query/include/{catalog → postgres/catalog}/namespace.h +5 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaccess.h +73 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/objectaddress.h +12 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate.h +14 -10
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am.h +4 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute.h +45 -26
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute_d.h +19 -16
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid_d.h +19 -9
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class.h +45 -15
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class_d.h +31 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation.h +35 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation_d.h +21 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint.h +39 -13
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint_d.h +10 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_control.h +13 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion_d.h +4 -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 +11 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger.h +9 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index.h +17 -7
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index_d.h +20 -17
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language.h +10 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator.h +21 -16
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator_d.h +37 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily.h +8 -4
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily_d.h +6 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table.h +20 -9
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc.h +20 -11
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc_d.h +10 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication.h +49 -6
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin.h +6 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin_d.h +5 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic.h +19 -12
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_d.h +2 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext.h +19 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext_d.h +7 -2
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform.h +8 -5
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger.h +24 -8
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger_d.h +4 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict.h +8 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template.h +6 -3
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template_d.h +3 -1
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type.h +56 -24
- data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type_d.h +70 -31
- data/ext/pg_query/include/{catalog → postgres/catalog}/storage.h +9 -7
- data/ext/pg_query/include/{commands → postgres/commands}/async.h +4 -5
- data/ext/pg_query/include/{commands → postgres/commands}/dbcommands.h +3 -1
- data/ext/pg_query/include/{commands → postgres/commands}/defrem.h +12 -24
- data/ext/pg_query/include/{commands → postgres/commands}/event_trigger.h +2 -2
- 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 +6 -4
- data/ext/pg_query/include/{commands → postgres/commands}/trigger.h +36 -25
- data/ext/pg_query/include/{commands → postgres/commands}/user.h +10 -4
- data/ext/pg_query/include/{commands → postgres/commands}/vacuum.h +140 -47
- data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
- data/ext/pg_query/include/{common → postgres/common}/file_perm.h +4 -4
- 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 +2 -6
- data/ext/pg_query/include/{common → postgres/common}/kwlookup.h +2 -2
- data/ext/pg_query/include/postgres/common/pg_prng.h +61 -0
- data/ext/pg_query/include/{common → postgres/common}/relpath.h +21 -14
- 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/postgres/common/string.h +44 -0
- data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +125 -0
- data/ext/pg_query/include/{common/unicode_combining_table.h → postgres/common/unicode_nonspacing_table.h} +138 -8
- 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 +50 -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 +98 -32
- data/ext/pg_query/include/{executor → postgres/executor}/functions.h +17 -3
- data/ext/pg_query/include/{executor → postgres/executor}/instrument.h +33 -16
- data/ext/pg_query/include/{executor → postgres/executor}/spi.h +42 -4
- 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} +33 -8
- data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
- data/ext/pg_query/include/{funcapi.h → postgres/funcapi.h} +22 -10
- 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 +12 -12
- data/ext/pg_query/include/postgres/kwlist_d.h +1119 -0
- data/ext/pg_query/include/postgres/lib/dshash.h +115 -0
- data/ext/pg_query/include/{lib → postgres/lib}/ilist.h +454 -22
- data/ext/pg_query/include/{lib → postgres/lib}/pairingheap.h +1 -1
- data/ext/pg_query/include/{lib → postgres/lib}/simplehash.h +158 -33
- data/ext/pg_query/include/postgres/lib/sort_template.h +432 -0
- data/ext/pg_query/include/{lib → postgres/lib}/stringinfo.h +3 -3
- data/ext/pg_query/include/{libpq → postgres/libpq}/auth.h +12 -4
- data/ext/pg_query/include/{libpq → postgres/libpq}/crypt.h +5 -4
- data/ext/pg_query/include/{libpq → postgres/libpq}/hba.h +54 -8
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq-be.h +45 -17
- data/ext/pg_query/include/{libpq → postgres/libpq}/libpq.h +31 -20
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqcomm.h +26 -71
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqformat.h +2 -2
- data/ext/pg_query/include/{libpq → postgres/libpq}/pqsignal.h +25 -13
- 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 +125 -25
- data/ext/pg_query/include/{mb → postgres/mb}/stringinfo_mb.h +1 -1
- data/ext/pg_query/include/{miscadmin.h → postgres/miscadmin.h} +96 -65
- data/ext/pg_query/include/{nodes → postgres/nodes}/bitmapset.h +11 -7
- data/ext/pg_query/include/{nodes → postgres/nodes}/execnodes.h +351 -103
- data/ext/pg_query/include/{nodes → postgres/nodes}/extensible.h +8 -4
- data/ext/pg_query/include/{nodes → postgres/nodes}/lockoptions.h +1 -1
- data/ext/pg_query/include/{nodes → postgres/nodes}/makefuncs.h +19 -6
- data/ext/pg_query/include/{nodes → postgres/nodes}/memnodes.h +11 -6
- 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 +100 -496
- 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 +678 -207
- data/ext/pg_query/include/{nodes → postgres/nodes}/pathnodes.h +1282 -454
- data/ext/pg_query/include/{nodes → postgres/nodes}/pg_list.h +103 -73
- data/ext/pg_query/include/{nodes → postgres/nodes}/plannodes.h +474 -133
- data/ext/pg_query/include/{nodes → postgres/nodes}/primnodes.h +754 -254
- data/ext/pg_query/include/{nodes → postgres/nodes}/print.h +1 -1
- data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
- 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/postgres/nodes/value.h +90 -0
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/cost.h +14 -5
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo.h +9 -7
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo_gene.h +1 -1
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/optimizer.h +31 -28
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/paths.h +29 -12
- data/ext/pg_query/include/{optimizer → postgres/optimizer}/planmain.h +15 -17
- data/ext/pg_query/include/{parser → postgres/parser}/analyze.h +20 -5
- data/ext/pg_query/include/postgres/parser/kwlist.h +498 -0
- data/ext/pg_query/include/{parser → postgres/parser}/parse_agg.h +5 -8
- data/ext/pg_query/include/{parser → postgres/parser}/parse_coerce.h +6 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_expr.h +2 -3
- data/ext/pg_query/include/{parser → postgres/parser}/parse_func.h +2 -1
- data/ext/pg_query/include/{parser → postgres/parser}/parse_node.h +41 -11
- data/ext/pg_query/include/{parser → postgres/parser}/parse_oper.h +3 -5
- data/ext/pg_query/include/{parser → postgres/parser}/parse_relation.h +11 -5
- data/ext/pg_query/include/{parser → postgres/parser}/parse_type.h +4 -3
- data/ext/pg_query/include/postgres/parser/parser.h +68 -0
- 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 +2 -5
- data/ext/pg_query/include/{partitioning → postgres/partitioning}/partdefs.h +1 -1
- data/ext/pg_query/include/{pg_config.h → postgres/pg_config.h} +216 -228
- data/ext/pg_query/include/{pg_config_manual.h → postgres/pg_config_manual.h} +80 -58
- data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
- data/ext/pg_query/include/{pg_getopt.h → postgres/pg_getopt.h} +6 -6
- data/ext/pg_query/include/{pg_trace.h → postgres/pg_trace.h} +1 -1
- data/ext/pg_query/include/postgres/pgstat.h +778 -0
- data/ext/pg_query/include/{pgtime.h → postgres/pgtime.h} +16 -6
- data/ext/pg_query/include/{pl_gram.h → postgres/pl_gram.h} +116 -116
- 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} +10 -10
- data/ext/pg_query/include/{pl_unreserved_kwlist.h → postgres/pl_unreserved_kwlist.h} +3 -3
- data/ext/pg_query/include/{pl_unreserved_kwlist_d.h → postgres/pl_unreserved_kwlist_d.h} +60 -60
- data/ext/pg_query/include/{plerrcodes.h → postgres/plerrcodes.h} +9 -1
- data/ext/pg_query/include/{plpgsql.h → postgres/plpgsql.h} +79 -86
- data/ext/pg_query/include/{port → postgres/port}/atomics/arch-arm.h +9 -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 +3 -3
- 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 +129 -16
- 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} +107 -111
- 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 +17 -20
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker.h +3 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker_internals.h +2 -2
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgwriter.h +6 -6
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/interrupt.h +1 -1
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/pgarch.h +7 -10
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/postmaster.h +21 -17
- data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/syslogger.h +16 -11
- data/ext/pg_query/include/{postmaster → postgres/postmaster}/walwriter.h +5 -3
- data/ext/pg_query/include/{regex → postgres/regex}/regex.h +27 -22
- data/ext/pg_query/include/{replication → postgres/replication}/logicallauncher.h +8 -5
- data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
- data/ext/pg_query/include/postgres/replication/logicalworker.h +32 -0
- data/ext/pg_query/include/{replication → postgres/replication}/origin.h +8 -8
- data/ext/pg_query/include/postgres/replication/reorderbuffer.h +753 -0
- data/ext/pg_query/include/{replication → postgres/replication}/slot.h +42 -12
- data/ext/pg_query/include/{replication → postgres/replication}/syncrep.h +6 -12
- data/ext/pg_query/include/{replication → postgres/replication}/walreceiver.h +158 -20
- data/ext/pg_query/include/{replication → postgres/replication}/walsender.h +20 -20
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/prs2lock.h +1 -1
- data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteHandler.h +1 -6
- 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 +3 -3
- data/ext/pg_query/include/{storage → postgres/storage}/block.h +24 -37
- data/ext/pg_query/include/{storage → postgres/storage}/buf.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/bufmgr.h +196 -95
- data/ext/pg_query/include/{storage → postgres/storage}/bufpage.h +152 -101
- data/ext/pg_query/include/{storage → postgres/storage}/condition_variable.h +14 -3
- data/ext/pg_query/include/{storage → postgres/storage}/dsm.h +6 -6
- data/ext/pg_query/include/{storage → postgres/storage}/dsm_impl.h +6 -2
- data/ext/pg_query/include/{storage → postgres/storage}/fd.h +48 -14
- data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
- data/ext/pg_query/include/{storage → postgres/storage}/ipc.h +5 -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 +96 -57
- data/ext/pg_query/include/{storage → postgres/storage}/large_object.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/latch.h +17 -13
- data/ext/pg_query/include/{storage → postgres/storage}/lmgr.h +7 -1
- data/ext/pg_query/include/{storage → postgres/storage}/lock.h +37 -25
- data/ext/pg_query/include/{storage → postgres/storage}/lockdefs.h +4 -4
- data/ext/pg_query/include/{storage → postgres/storage}/lwlock.h +21 -33
- data/ext/pg_query/include/{storage → postgres/storage}/lwlocknames.h +0 -1
- 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 +9 -7
- data/ext/pg_query/include/{storage → postgres/storage}/pmsignal.h +15 -4
- data/ext/pg_query/include/{storage → postgres/storage}/predicate.h +5 -5
- data/ext/pg_query/include/{storage → postgres/storage}/proc.h +200 -67
- data/ext/pg_query/include/postgres/storage/procarray.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/proclist_types.h +1 -1
- data/ext/pg_query/include/{storage → postgres/storage}/procsignal.h +5 -7
- data/ext/pg_query/include/postgres/storage/relfilelocator.h +99 -0
- data/ext/pg_query/include/{storage → postgres/storage}/s_lock.h +118 -298
- data/ext/pg_query/include/{storage → postgres/storage}/sharedfileset.h +3 -11
- data/ext/pg_query/include/{storage → postgres/storage}/shm_mq.h +5 -4
- 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 +5 -5
- data/ext/pg_query/include/{storage → postgres/storage}/sinvaladt.h +4 -2
- data/ext/pg_query/include/{storage → postgres/storage}/smgr.h +21 -17
- data/ext/pg_query/include/{storage → postgres/storage}/spin.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/standby.h +17 -9
- data/ext/pg_query/include/{storage → postgres/storage}/standbydefs.h +2 -2
- data/ext/pg_query/include/{storage → postgres/storage}/sync.h +9 -5
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtag.h +7 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtaglist.h +3 -2
- 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 -2
- data/ext/pg_query/include/{tcop → postgres/tcop}/pquery.h +7 -1
- data/ext/pg_query/include/{tcop → postgres/tcop}/tcopprot.h +19 -14
- data/ext/pg_query/include/{tcop → postgres/tcop}/utility.h +7 -3
- data/ext/pg_query/include/{tsearch → postgres/tsearch}/ts_cache.h +3 -5
- data/ext/pg_query/include/{utils → postgres/utils}/acl.h +37 -71
- data/ext/pg_query/include/{utils → postgres/utils}/aclchk_internal.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/array.h +26 -2
- data/ext/pg_query/include/postgres/utils/backend_progress.h +45 -0
- data/ext/pg_query/include/postgres/utils/backend_status.h +342 -0
- data/ext/pg_query/include/{utils → postgres/utils}/builtins.h +20 -11
- data/ext/pg_query/include/{utils → postgres/utils}/bytea.h +3 -2
- 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 +48 -27
- data/ext/pg_query/include/{utils → postgres/utils}/datum.h +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/dsa.h +5 -1
- data/ext/pg_query/include/{utils → postgres/utils}/elog.h +154 -48
- data/ext/pg_query/include/{utils → postgres/utils}/errcodes.h +2 -0
- 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 +13 -12
- data/ext/pg_query/include/{utils → postgres/utils}/fmgroids.h +1353 -696
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrprotos.h +243 -18
- data/ext/pg_query/include/{utils → postgres/utils}/fmgrtab.h +6 -5
- data/ext/pg_query/include/{utils → postgres/utils}/guc.h +120 -121
- data/ext/pg_query/include/postgres/utils/guc_hooks.h +163 -0
- data/ext/pg_query/include/{utils → postgres/utils}/guc_tables.h +71 -21
- data/ext/pg_query/include/{utils → postgres/utils}/hsearch.h +15 -11
- data/ext/pg_query/include/{utils → postgres/utils}/inval.h +7 -3
- data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
- data/ext/pg_query/include/{utils → postgres/utils}/lsyscache.h +16 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memdebug.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/memutils.h +14 -53
- 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 +38 -9
- data/ext/pg_query/include/{utils → postgres/utils}/palloc.h +33 -4
- data/ext/pg_query/include/{utils → postgres/utils}/partcache.h +3 -2
- data/ext/pg_query/include/{utils → postgres/utils}/pg_locale.h +37 -21
- data/ext/pg_query/include/postgres/utils/pgstat_internal.h +814 -0
- data/ext/pg_query/include/{utils → postgres/utils}/plancache.h +6 -5
- data/ext/pg_query/include/{utils → postgres/utils}/portal.h +12 -1
- data/ext/pg_query/include/{utils → postgres/utils}/probes.h +59 -59
- 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/postgres/utils/regproc.h +39 -0
- data/ext/pg_query/include/{utils → postgres/utils}/rel.h +129 -61
- data/ext/pg_query/include/{utils → postgres/utils}/relcache.h +21 -14
- 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 +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sharedtuplestore.h +1 -1
- data/ext/pg_query/include/{utils → postgres/utils}/snapmgr.h +38 -15
- data/ext/pg_query/include/{utils → postgres/utils}/snapshot.h +14 -1
- data/ext/pg_query/include/{utils → postgres/utils}/sortsupport.h +117 -2
- data/ext/pg_query/include/{utils → postgres/utils}/syscache.h +9 -1
- data/ext/pg_query/include/{utils → postgres/utils}/timeout.h +11 -4
- data/ext/pg_query/include/{utils → postgres/utils}/timestamp.h +46 -15
- data/ext/pg_query/include/{utils → postgres/utils}/tuplesort.h +209 -41
- data/ext/pg_query/include/{utils → postgres/utils}/tuplestore.h +2 -2
- data/ext/pg_query/include/{utils → postgres/utils}/typcache.h +24 -17
- data/ext/pg_query/include/{utils → postgres/utils}/varlena.h +17 -3
- data/ext/pg_query/include/postgres/utils/wait_event.h +294 -0
- data/ext/pg_query/include/{utils → postgres/utils}/xml.h +18 -8
- data/ext/pg_query/include/{postgres.h → postgres/varatt.h} +65 -471
- data/ext/pg_query/include/protobuf/pg_query.pb-c.h +7494 -6382
- data/ext/pg_query/include/protobuf/pg_query.pb.h +116922 -84792
- data/ext/pg_query/include/protobuf-c/protobuf-c.h +7 -3
- data/ext/pg_query/include/protobuf-c.h +7 -3
- data/ext/pg_query/pg_query.c +10 -1
- data/ext/pg_query/pg_query.pb-c.c +21026 -17002
- data/ext/pg_query/pg_query_deparse.c +1 -9896
- data/ext/pg_query/pg_query_fingerprint.c +162 -50
- data/ext/pg_query/pg_query_fingerprint.h +3 -1
- data/ext/pg_query/pg_query_internal.h +1 -1
- data/ext/pg_query/pg_query_json_plpgsql.c +56 -12
- data/ext/pg_query/pg_query_normalize.c +259 -64
- data/ext/pg_query/pg_query_outfuncs.h +1 -0
- data/ext/pg_query/pg_query_outfuncs_json.c +71 -16
- data/ext/pg_query/pg_query_outfuncs_protobuf.c +73 -12
- data/ext/pg_query/pg_query_parse.c +47 -5
- data/ext/pg_query/pg_query_parse_plpgsql.c +86 -21
- data/ext/pg_query/pg_query_readfuncs_protobuf.c +43 -8
- data/ext/pg_query/pg_query_ruby.c +6 -1
- data/ext/pg_query/pg_query_ruby_freebsd.sym +2 -0
- data/ext/pg_query/pg_query_scan.c +3 -2
- data/ext/pg_query/pg_query_split.c +6 -5
- data/ext/pg_query/postgres_deparse.c +11067 -0
- data/ext/pg_query/postgres_deparse.h +9 -0
- data/ext/pg_query/protobuf-c.c +34 -27
- data/ext/pg_query/src_backend_catalog_namespace.c +27 -10
- data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
- data/ext/pg_query/src_backend_commands_define.c +11 -1
- data/ext/pg_query/src_backend_nodes_bitmapset.c +13 -70
- data/ext/pg_query/src_backend_nodes_copyfuncs.c +103 -5894
- data/ext/pg_query/src_backend_nodes_equalfuncs.c +102 -3830
- data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
- data/ext/pg_query/src_backend_nodes_list.c +99 -12
- data/ext/pg_query/src_backend_nodes_makefuncs.c +99 -4
- data/ext/pg_query/src_backend_nodes_nodeFuncs.c +325 -131
- data/ext/pg_query/src_backend_nodes_nodes.c +38 -0
- data/ext/pg_query/src_backend_nodes_value.c +28 -19
- data/ext/pg_query/src_backend_parser_gram.c +36104 -32074
- data/ext/pg_query/src_backend_parser_parser.c +53 -8
- data/ext/pg_query/src_backend_parser_scan.c +4893 -3701
- data/ext/pg_query/src_backend_parser_scansup.c +4 -28
- data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
- data/ext/pg_query/src_backend_tcop_postgres.c +133 -105
- data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
- data/ext/pg_query/src_backend_utils_adt_datum.c +17 -7
- data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
- data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
- data/ext/pg_query/src_backend_utils_adt_numutils.c +489 -0
- data/ext/pg_query/src_backend_utils_adt_ruleutils.c +187 -19
- data/ext/pg_query/src_backend_utils_error_assert.c +17 -18
- data/ext/pg_query/src_backend_utils_error_elog.c +513 -318
- data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +44 -17
- data/ext/pg_query/src_backend_utils_init_globals.c +9 -6
- data/ext/pg_query/src_backend_utils_mb_mbutils.c +74 -131
- 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 +453 -314
- data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
- data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +549 -76
- 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 +420 -0
- data/ext/pg_query/src_common_keywords.c +15 -2
- data/ext/pg_query/src_common_kwlist_d.h +545 -498
- 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 +717 -113
- data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
- data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -18
- data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1136 -1195
- data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
- data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
- data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
- data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +60 -60
- data/ext/pg_query/src_port_pg_bitutils.c +103 -40
- data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
- data/ext/pg_query/src_port_qsort.c +12 -224
- data/ext/pg_query/src_port_snprintf.c +51 -29
- data/ext/pg_query/src_port_strerror.c +9 -19
- data/ext/pg_query/src_port_strlcpy.c +79 -0
- data/lib/pg_query/deparse.rb +7 -1
- data/lib/pg_query/filter_columns.rb +7 -5
- data/lib/pg_query/fingerprint.rb +21 -9
- data/lib/pg_query/node.rb +18 -13
- data/lib/pg_query/param_refs.rb +1 -1
- data/lib/pg_query/parse.rb +141 -50
- data/lib/pg_query/pg_query_pb.rb +175 -3031
- data/lib/pg_query/treewalker.rb +26 -2
- data/lib/pg_query/truncate.rb +54 -8
- data/lib/pg_query/version.rb +1 -1
- data/lib/pg_query.rb +0 -1
- metadata +443 -380
- data/ext/pg_query/guc-file.c +0 -0
- data/ext/pg_query/include/access/rmgr.h +0 -35
- data/ext/pg_query/include/access/xloginsert.h +0 -64
- data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
- data/ext/pg_query/include/catalog/genbki.h +0 -64
- data/ext/pg_query/include/catalog/indexing.h +0 -366
- data/ext/pg_query/include/commands/variable.h +0 -38
- data/ext/pg_query/include/common/ip.h +0 -37
- data/ext/pg_query/include/common/string.h +0 -19
- data/ext/pg_query/include/getaddrinfo.h +0 -162
- data/ext/pg_query/include/kwlist_d.h +0 -1072
- data/ext/pg_query/include/nodes/value.h +0 -61
- data/ext/pg_query/include/parser/gram.h +0 -1067
- data/ext/pg_query/include/parser/kwlist.h +0 -477
- data/ext/pg_query/include/parser/parse_clause.h +0 -54
- data/ext/pg_query/include/parser/parse_collate.h +0 -27
- data/ext/pg_query/include/parser/parse_target.h +0 -46
- data/ext/pg_query/include/parser/parser.h +0 -41
- data/ext/pg_query/include/pg_config_os.h +0 -8
- data/ext/pg_query/include/pgstat.h +0 -1487
- data/ext/pg_query/include/portability/instr_time.h +0 -256
- data/ext/pg_query/include/postmaster/fork_process.h +0 -17
- data/ext/pg_query/include/replication/logicalproto.h +0 -110
- data/ext/pg_query/include/replication/logicalworker.h +0 -19
- data/ext/pg_query/include/replication/reorderbuffer.h +0 -467
- data/ext/pg_query/include/storage/relfilenode.h +0 -99
- data/ext/pg_query/include/utils/dynahash.h +0 -19
- 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/regproc.h +0 -28
- 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_libpq_pqcomm.c +0 -651
- data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
- data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2230
- data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -370
- data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1086
- data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1831
- data/ext/pg_query/src_common_string.c +0 -86
- data/ext/pg_query/src_port_erand48.c +0 -127
- data/ext/pg_query/src_port_pgsleep.c +0 -69
- data/ext/pg_query/src_port_random.c +0 -31
- data/ext/pg_query/src_port_strnlen.c +0 -39
- data/lib/pg_query/json_field_names.rb +0 -1402
- /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
|
@@ -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
|
*/
|
|
@@ -394,12 +476,31 @@ dlist_move_head(dlist_head *head, dlist_node *node)
|
|
|
394
476
|
dlist_check(head);
|
|
395
477
|
}
|
|
396
478
|
|
|
479
|
+
/*
|
|
480
|
+
* Move element from its current position in the list to the tail position in
|
|
481
|
+
* the same list.
|
|
482
|
+
*
|
|
483
|
+
* Undefined behaviour if 'node' is not already part of the list.
|
|
484
|
+
*/
|
|
485
|
+
static inline void
|
|
486
|
+
dlist_move_tail(dlist_head *head, dlist_node *node)
|
|
487
|
+
{
|
|
488
|
+
/* fast path if it's already at the tail */
|
|
489
|
+
if (head->head.prev == node)
|
|
490
|
+
return;
|
|
491
|
+
|
|
492
|
+
dlist_delete(node);
|
|
493
|
+
dlist_push_tail(head, node);
|
|
494
|
+
|
|
495
|
+
dlist_check(head);
|
|
496
|
+
}
|
|
497
|
+
|
|
397
498
|
/*
|
|
398
499
|
* Check whether 'node' has a following node.
|
|
399
500
|
* Caution: unreliable if 'node' is not in the list.
|
|
400
501
|
*/
|
|
401
502
|
static inline bool
|
|
402
|
-
dlist_has_next(dlist_head *head, dlist_node *node)
|
|
503
|
+
dlist_has_next(const dlist_head *head, const dlist_node *node)
|
|
403
504
|
{
|
|
404
505
|
return node->next != &head->head;
|
|
405
506
|
}
|
|
@@ -409,11 +510,26 @@ dlist_has_next(dlist_head *head, dlist_node *node)
|
|
|
409
510
|
* Caution: unreliable if 'node' is not in the list.
|
|
410
511
|
*/
|
|
411
512
|
static inline bool
|
|
412
|
-
dlist_has_prev(dlist_head *head, dlist_node *node)
|
|
513
|
+
dlist_has_prev(const dlist_head *head, const dlist_node *node)
|
|
413
514
|
{
|
|
414
515
|
return node->prev != &head->head;
|
|
415
516
|
}
|
|
416
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
|
+
|
|
417
533
|
/*
|
|
418
534
|
* Return the next node in the list (there must be one).
|
|
419
535
|
*/
|
|
@@ -543,6 +659,322 @@ dlist_tail_node(dlist_head *head)
|
|
|
543
659
|
(iter).cur != (iter).end; \
|
|
544
660
|
(iter).cur = (iter).cur->prev)
|
|
545
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))
|
|
546
978
|
|
|
547
979
|
/* singly linked list implementation */
|
|
548
980
|
|
|
@@ -560,7 +992,7 @@ slist_init(slist_head *head)
|
|
|
560
992
|
* Is the list empty?
|
|
561
993
|
*/
|
|
562
994
|
static inline bool
|
|
563
|
-
slist_is_empty(slist_head *head)
|
|
995
|
+
slist_is_empty(const slist_head *head)
|
|
564
996
|
{
|
|
565
997
|
slist_check(head);
|
|
566
998
|
|
|
@@ -608,7 +1040,7 @@ slist_pop_head_node(slist_head *head)
|
|
|
608
1040
|
* Check whether 'node' has a following node.
|
|
609
1041
|
*/
|
|
610
1042
|
static inline bool
|
|
611
|
-
slist_has_next(slist_head *head, slist_node *node)
|
|
1043
|
+
slist_has_next(const slist_head *head, const slist_node *node)
|
|
612
1044
|
{
|
|
613
1045
|
slist_check(head);
|
|
614
1046
|
|