pg_query 4.2.1 → 6.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.
Files changed (901) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +61 -0
  3. data/README.md +7 -9
  4. data/Rakefile +5 -6
  5. data/ext/pg_query/ext_symbols_freebsd.sym +1 -0
  6. data/ext/pg_query/ext_symbols_freebsd_with_ruby_abi_version.sym +2 -0
  7. data/ext/pg_query/ext_symbols_openbsd.sym +1 -0
  8. data/ext/pg_query/ext_symbols_openbsd_with_ruby_abi_version.sym +2 -0
  9. data/ext/pg_query/ext_symbols_with_ruby_abi_version.sym +2 -0
  10. data/ext/pg_query/extconf.rb +33 -9
  11. data/ext/pg_query/include/pg_query.h +28 -3
  12. data/ext/pg_query/include/pg_query_enum_defs.c +599 -167
  13. data/ext/pg_query/include/pg_query_fingerprint_conds.c +640 -520
  14. data/ext/pg_query/include/pg_query_fingerprint_defs.c +6400 -4633
  15. data/ext/pg_query/include/pg_query_outfuncs_conds.c +433 -343
  16. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1472 -1152
  17. data/ext/pg_query/include/pg_query_readfuncs_conds.c +154 -124
  18. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1886 -1506
  19. data/ext/pg_query/include/postgres/access/amapi.h +303 -0
  20. data/ext/pg_query/include/postgres/access/attmap.h +54 -0
  21. data/ext/pg_query/include/postgres/access/attnum.h +64 -0
  22. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  23. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  24. data/ext/pg_query/include/postgres/access/clog.h +62 -0
  25. data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
  26. data/ext/pg_query/include/postgres/access/detoast.h +82 -0
  27. data/ext/pg_query/include/postgres/access/genam.h +246 -0
  28. data/ext/pg_query/include/postgres/access/gin.h +91 -0
  29. data/ext/pg_query/include/postgres/access/htup.h +89 -0
  30. data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
  31. data/ext/pg_query/include/postgres/access/itup.h +170 -0
  32. data/ext/pg_query/include/postgres/access/parallel.h +81 -0
  33. data/ext/pg_query/include/postgres/access/printtup.h +35 -0
  34. data/ext/pg_query/include/postgres/access/relation.h +28 -0
  35. data/ext/pg_query/include/postgres/access/relscan.h +191 -0
  36. data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
  37. data/ext/pg_query/include/postgres/access/sdir.h +67 -0
  38. data/ext/pg_query/include/postgres/access/skey.h +151 -0
  39. data/ext/pg_query/include/postgres/access/slru.h +218 -0
  40. data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
  41. data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
  42. data/ext/pg_query/include/postgres/access/table.h +28 -0
  43. data/ext/pg_query/include/postgres/access/tableam.h +2110 -0
  44. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  45. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  46. data/ext/pg_query/include/postgres/access/transam.h +418 -0
  47. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  48. data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
  49. data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
  50. data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
  51. data/ext/pg_query/include/postgres/access/twophase.h +65 -0
  52. data/ext/pg_query/include/postgres/access/xact.h +530 -0
  53. data/ext/pg_query/include/postgres/access/xlog.h +310 -0
  54. data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
  55. data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
  56. data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
  57. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  58. data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
  59. data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
  60. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  61. data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
  62. data/ext/pg_query/include/postgres/c.h +1374 -0
  63. data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
  64. data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
  65. data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
  66. data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
  67. data/ext/pg_query/include/postgres/catalog/index.h +218 -0
  68. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  69. data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
  70. data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
  71. data/ext/pg_query/include/postgres/catalog/objectaddress.h +93 -0
  72. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
  73. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
  74. data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
  75. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
  76. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
  77. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
  78. data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
  79. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
  80. data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
  81. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
  83. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
  84. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
  85. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
  86. data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
  87. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
  88. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
  89. data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
  90. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
  91. data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
  92. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
  93. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
  94. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
  95. data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
  96. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
  97. data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
  98. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
  99. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
  100. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
  101. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
  102. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
  103. data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
  104. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
  105. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
  106. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
  107. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
  108. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
  109. data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
  110. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
  111. data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
  112. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
  113. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
  114. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
  115. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
  116. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
  117. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
  118. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
  119. data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
  120. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
  121. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
  122. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
  126. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
  127. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
  128. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
  129. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
  130. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
  131. data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
  132. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
  133. data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
  134. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  135. data/ext/pg_query/include/postgres/commands/async.h +49 -0
  136. data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
  137. data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
  138. data/ext/pg_query/include/postgres/commands/event_trigger.h +97 -0
  139. data/ext/pg_query/include/postgres/commands/explain.h +145 -0
  140. data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
  141. data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
  142. data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
  143. data/ext/pg_query/include/postgres/commands/user.h +43 -0
  144. data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
  145. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  146. data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
  147. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  148. data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
  149. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
  150. data/ext/pg_query/include/postgres/common/int.h +512 -0
  151. data/ext/pg_query/include/postgres/common/keywords.h +29 -0
  152. data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
  153. data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
  154. data/ext/pg_query/include/postgres/common/relpath.h +97 -0
  155. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  156. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  157. data/ext/pg_query/include/postgres/common/string.h +44 -0
  158. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
  159. data/ext/pg_query/include/postgres/common/unicode_nonspacing_table.h +326 -0
  160. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
  161. data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
  162. data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
  163. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
  164. data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
  165. data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
  166. data/ext/pg_query/include/postgres/executor/executor.h +681 -0
  167. data/ext/pg_query/include/postgres/executor/functions.h +56 -0
  168. data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
  169. data/ext/pg_query/include/postgres/executor/spi.h +207 -0
  170. data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
  171. data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
  172. data/ext/pg_query/include/postgres/fmgr.h +800 -0
  173. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  174. data/ext/pg_query/include/postgres/funcapi.h +360 -0
  175. data/ext/pg_query/include/postgres/gram.h +1168 -0
  176. data/ext/pg_query/include/postgres/gramparse.h +75 -0
  177. data/ext/pg_query/include/postgres/jit/jit.h +106 -0
  178. data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
  179. data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
  180. data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
  181. data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
  182. data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
  183. data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
  184. data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
  185. data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
  186. data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
  187. data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
  188. data/ext/pg_query/include/postgres/libpq/libpq-be.h +361 -0
  189. data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
  190. data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
  191. data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
  192. data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
  193. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  194. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  195. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  196. data/ext/pg_query/include/postgres/mb/pg_wchar.h +793 -0
  197. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
  198. data/ext/pg_query/include/postgres/miscadmin.h +527 -0
  199. data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
  200. data/ext/pg_query/include/postgres/nodes/execnodes.h +2855 -0
  201. data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
  202. data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
  203. data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
  204. data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
  205. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  206. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
  207. data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
  208. data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
  209. data/ext/pg_query/include/postgres/nodes/params.h +170 -0
  210. data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
  211. data/ext/pg_query/include/postgres/nodes/pathnodes.h +3438 -0
  212. data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
  213. data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
  214. data/ext/pg_query/include/postgres/nodes/primnodes.h +2339 -0
  215. data/ext/pg_query/include/postgres/nodes/print.h +34 -0
  216. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  217. data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
  218. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  219. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
  220. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  221. data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
  222. data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
  223. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
  224. data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
  225. data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
  226. data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
  227. data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
  228. data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
  229. data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
  230. data/ext/pg_query/include/postgres/parser/parse_coerce.h +105 -0
  231. data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
  232. data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
  233. data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
  234. data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
  235. data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
  236. data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
  237. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  238. data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
  239. data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
  240. data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
  241. data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
  242. data/ext/pg_query/include/postgres/pg_config.h +985 -0
  243. data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
  244. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  245. data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
  246. data/ext/pg_query/include/postgres/pg_trace.h +17 -0
  247. data/ext/pg_query/include/postgres/pgstat.h +780 -0
  248. data/ext/pg_query/include/postgres/pgtime.h +94 -0
  249. data/ext/pg_query/include/postgres/pl_gram.h +385 -0
  250. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
  251. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
  252. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
  253. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
  254. data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
  255. data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
  256. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
  257. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  258. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
  259. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
  260. data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
  261. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
  262. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
  263. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
  264. data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
  265. data/ext/pg_query/include/postgres/port/atomics.h +606 -0
  266. data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
  267. data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
  268. data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
  269. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  270. data/ext/pg_query/include/postgres/port/simd.h +422 -0
  271. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  272. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  273. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  274. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  275. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  276. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  277. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  278. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  279. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  280. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
  281. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  282. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  283. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  284. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  285. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  286. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  287. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  288. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  289. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  290. data/ext/pg_query/include/postgres/port/win32_port.h +582 -0
  291. data/ext/pg_query/include/postgres/port.h +555 -0
  292. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  293. data/ext/pg_query/include/postgres/postgres.h +579 -0
  294. data/ext/pg_query/include/postgres/postgres_ext.h +73 -0
  295. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
  296. data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
  297. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
  298. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
  299. data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
  300. data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
  301. data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
  302. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  303. data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
  304. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  305. data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
  306. data/ext/pg_query/include/postgres/regex/regex.h +272 -0
  307. data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
  308. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  309. data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
  310. data/ext/pg_query/include/postgres/replication/origin.h +73 -0
  311. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +734 -0
  312. data/ext/pg_query/include/postgres/replication/slot.h +289 -0
  313. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  314. data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
  315. data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
  316. data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
  317. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
  318. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
  319. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
  320. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
  321. data/ext/pg_query/include/postgres/storage/block.h +108 -0
  322. data/ext/pg_query/include/postgres/storage/buf.h +46 -0
  323. data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
  324. data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
  325. data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
  326. data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
  327. data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
  328. data/ext/pg_query/include/postgres/storage/fd.h +219 -0
  329. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  330. data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
  331. data/ext/pg_query/include/postgres/storage/item.h +19 -0
  332. data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
  333. data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
  334. data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
  335. data/ext/pg_query/include/postgres/storage/latch.h +196 -0
  336. data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
  337. data/ext/pg_query/include/postgres/storage/lock.h +624 -0
  338. data/ext/pg_query/include/postgres/storage/lockdefs.h +61 -0
  339. data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
  340. data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
  341. data/ext/pg_query/include/postgres/storage/off.h +57 -0
  342. data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
  343. data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
  344. data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
  345. data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
  346. data/ext/pg_query/include/postgres/storage/proc.h +488 -0
  347. data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
  348. data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
  349. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  350. data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
  351. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  352. data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
  353. data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
  354. data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
  355. data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
  356. data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
  357. data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
  358. data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
  359. data/ext/pg_query/include/postgres/storage/smgr.h +130 -0
  360. data/ext/pg_query/include/postgres/storage/spin.h +77 -0
  361. data/ext/pg_query/include/postgres/storage/standby.h +109 -0
  362. data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
  363. data/ext/pg_query/include/postgres/storage/sync.h +66 -0
  364. data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
  365. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
  366. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
  367. data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
  368. data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
  369. data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
  370. data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
  371. data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
  372. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
  373. data/ext/pg_query/include/postgres/utils/acl.h +290 -0
  374. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
  375. data/ext/pg_query/include/postgres/utils/array.h +481 -0
  376. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  377. data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
  378. data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
  379. data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
  380. data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
  381. data/ext/pg_query/include/postgres/utils/catcache.h +231 -0
  382. data/ext/pg_query/include/postgres/utils/date.h +118 -0
  383. data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
  384. data/ext/pg_query/include/postgres/utils/datum.h +76 -0
  385. data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
  386. data/ext/pg_query/include/postgres/utils/elog.h +540 -0
  387. data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
  388. data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
  389. data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
  390. data/ext/pg_query/include/postgres/utils/float.h +357 -0
  391. data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
  392. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
  393. data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
  394. data/ext/pg_query/include/postgres/utils/guc.h +456 -0
  395. data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
  396. data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
  397. data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
  398. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  399. data/ext/pg_query/include/postgres/utils/inval.h +68 -0
  400. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  401. data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
  402. data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
  403. data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
  404. data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
  405. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
  406. data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
  407. data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
  408. data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
  409. data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
  410. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +827 -0
  411. data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
  412. data/ext/pg_query/include/postgres/utils/portal.h +252 -0
  413. data/ext/pg_query/include/postgres/utils/probes.h +114 -0
  414. data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
  415. data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
  416. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  417. data/ext/pg_query/include/postgres/utils/rel.h +711 -0
  418. data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
  419. data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
  420. data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
  421. data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
  422. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
  423. data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
  424. data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
  425. data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
  426. data/ext/pg_query/include/postgres/utils/syscache.h +136 -0
  427. data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
  428. data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
  429. data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
  430. data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
  431. data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
  432. data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
  433. data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
  434. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  435. data/ext/pg_query/include/postgres/utils/xml.h +94 -0
  436. data/ext/pg_query/include/postgres/varatt.h +358 -0
  437. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +7723 -6368
  438. data/ext/pg_query/include/protobuf/pg_query.pb.h +120022 -87031
  439. data/ext/pg_query/pg_query.c +10 -1
  440. data/ext/pg_query/pg_query.pb-c.c +22595 -17738
  441. data/ext/pg_query/pg_query_deparse.c +1 -10635
  442. data/ext/pg_query/pg_query_fingerprint.c +12 -8
  443. data/ext/pg_query/pg_query_fingerprint.h +1 -1
  444. data/ext/pg_query/pg_query_internal.h +1 -1
  445. data/ext/pg_query/pg_query_json_plpgsql.c +1 -0
  446. data/ext/pg_query/pg_query_normalize.c +43 -2
  447. data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
  448. data/ext/pg_query/pg_query_outfuncs_protobuf.c +3 -2
  449. data/ext/pg_query/pg_query_parse.c +47 -5
  450. data/ext/pg_query/pg_query_parse_plpgsql.c +19 -18
  451. data/ext/pg_query/pg_query_readfuncs_protobuf.c +3 -2
  452. data/ext/pg_query/pg_query_ruby.c +5 -0
  453. data/ext/pg_query/pg_query_scan.c +2 -2
  454. data/ext/pg_query/pg_query_split.c +3 -3
  455. data/ext/pg_query/postgres_deparse.c +11496 -0
  456. data/ext/pg_query/postgres_deparse.h +9 -0
  457. data/ext/pg_query/src_backend_catalog_namespace.c +243 -63
  458. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  459. data/ext/pg_query/src_backend_commands_define.c +2 -3
  460. data/ext/pg_query/src_backend_nodes_bitmapset.c +140 -156
  461. data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
  462. data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
  463. data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
  464. data/ext/pg_query/src_backend_nodes_list.c +16 -8
  465. data/ext/pg_query/src_backend_nodes_makefuncs.c +134 -1
  466. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +391 -133
  467. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  468. data/ext/pg_query/src_backend_parser_gram.c +43710 -39953
  469. data/ext/pg_query/src_backend_parser_parser.c +34 -8
  470. data/ext/pg_query/src_backend_parser_scan.c +6971 -3373
  471. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  472. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  473. data/ext/pg_query/src_backend_tcop_postgres.c +99 -96
  474. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  475. data/ext/pg_query/src_backend_utils_adt_datum.c +2 -2
  476. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  477. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  478. data/ext/pg_query/src_backend_utils_adt_numutils.c +488 -0
  479. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +177 -30
  480. data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
  481. data/ext/pg_query/src_backend_utils_error_elog.c +397 -270
  482. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +36 -2
  483. data/ext/pg_query/src_backend_utils_init_globals.c +20 -5
  484. data/ext/pg_query/src_backend_utils_mb_mbutils.c +31 -84
  485. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +502 -0
  486. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +166 -0
  487. data/ext/pg_query/src_backend_utils_mmgr_aset.c +704 -497
  488. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  489. data/ext/pg_query/src_backend_utils_mmgr_generation.c +1115 -0
  490. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +637 -233
  491. data/ext/pg_query/src_backend_utils_mmgr_slab.c +1079 -0
  492. data/ext/pg_query/src_common_encnames.c +46 -44
  493. data/ext/pg_query/src_common_hashfn.c +1 -1
  494. data/ext/pg_query/src_common_keywords.c +1 -1
  495. data/ext/pg_query/src_common_kwlist_d.h +586 -517
  496. data/ext/pg_query/src_common_kwlookup.c +1 -1
  497. data/ext/pg_query/src_common_psprintf.c +3 -3
  498. data/ext/pg_query/src_common_stringinfo.c +21 -4
  499. data/ext/pg_query/src_common_wchar.c +100 -116
  500. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  501. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
  502. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +829 -763
  503. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  504. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  505. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  506. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
  507. data/ext/pg_query/src_port_pg_bitutils.c +251 -32
  508. data/ext/pg_query/src_port_pgstrcasecmp.c +57 -1
  509. data/ext/pg_query/src_port_snprintf.c +20 -27
  510. data/ext/pg_query/src_port_strerror.c +1 -3
  511. data/ext/pg_query/src_port_strlcpy.c +79 -0
  512. data/lib/pg_query/fingerprint.rb +5 -8
  513. data/lib/pg_query/node.rb +16 -11
  514. data/lib/pg_query/param_refs.rb +2 -2
  515. data/lib/pg_query/parse.rb +6 -8
  516. data/lib/pg_query/parse_error.rb +1 -0
  517. data/lib/pg_query/pg_query_pb.rb +173 -3196
  518. data/lib/pg_query/scan.rb +1 -0
  519. data/lib/pg_query/treewalker.rb +52 -11
  520. data/lib/pg_query/truncate.rb +18 -20
  521. data/lib/pg_query/version.rb +1 -1
  522. metadata +443 -442
  523. data/ext/pg_query/guc-file.c +0 -0
  524. data/ext/pg_query/include/access/amapi.h +0 -290
  525. data/ext/pg_query/include/access/attmap.h +0 -52
  526. data/ext/pg_query/include/access/attnum.h +0 -64
  527. data/ext/pg_query/include/access/clog.h +0 -63
  528. data/ext/pg_query/include/access/commit_ts.h +0 -74
  529. data/ext/pg_query/include/access/detoast.h +0 -82
  530. data/ext/pg_query/include/access/genam.h +0 -231
  531. data/ext/pg_query/include/access/gin.h +0 -78
  532. data/ext/pg_query/include/access/htup.h +0 -89
  533. data/ext/pg_query/include/access/htup_details.h +0 -807
  534. data/ext/pg_query/include/access/itup.h +0 -167
  535. data/ext/pg_query/include/access/parallel.h +0 -82
  536. data/ext/pg_query/include/access/printtup.h +0 -35
  537. data/ext/pg_query/include/access/relation.h +0 -28
  538. data/ext/pg_query/include/access/relscan.h +0 -191
  539. data/ext/pg_query/include/access/rmgrlist.h +0 -49
  540. data/ext/pg_query/include/access/sdir.h +0 -58
  541. data/ext/pg_query/include/access/skey.h +0 -151
  542. data/ext/pg_query/include/access/stratnum.h +0 -85
  543. data/ext/pg_query/include/access/sysattr.h +0 -29
  544. data/ext/pg_query/include/access/table.h +0 -28
  545. data/ext/pg_query/include/access/tableam.h +0 -2077
  546. data/ext/pg_query/include/access/toast_compression.h +0 -73
  547. data/ext/pg_query/include/access/transam.h +0 -375
  548. data/ext/pg_query/include/access/tupconvert.h +0 -51
  549. data/ext/pg_query/include/access/tupdesc.h +0 -154
  550. data/ext/pg_query/include/access/tupmacs.h +0 -247
  551. data/ext/pg_query/include/access/twophase.h +0 -65
  552. data/ext/pg_query/include/access/xact.h +0 -523
  553. data/ext/pg_query/include/access/xlog.h +0 -303
  554. data/ext/pg_query/include/access/xlog_internal.h +0 -366
  555. data/ext/pg_query/include/access/xlogdefs.h +0 -101
  556. data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
  557. data/ext/pg_query/include/access/xlogreader.h +0 -443
  558. data/ext/pg_query/include/access/xlogrecord.h +0 -236
  559. data/ext/pg_query/include/access/xlogrecovery.h +0 -157
  560. data/ext/pg_query/include/c.h +0 -1391
  561. data/ext/pg_query/include/catalog/catalog.h +0 -44
  562. data/ext/pg_query/include/catalog/catversion.h +0 -58
  563. data/ext/pg_query/include/catalog/dependency.h +0 -269
  564. data/ext/pg_query/include/catalog/genbki.h +0 -142
  565. data/ext/pg_query/include/catalog/index.h +0 -214
  566. data/ext/pg_query/include/catalog/indexing.h +0 -54
  567. data/ext/pg_query/include/catalog/namespace.h +0 -190
  568. data/ext/pg_query/include/catalog/objectaccess.h +0 -265
  569. data/ext/pg_query/include/catalog/objectaddress.h +0 -89
  570. data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
  571. data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
  572. data/ext/pg_query/include/catalog/pg_am.h +0 -63
  573. data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
  574. data/ext/pg_query/include/catalog/pg_attribute.h +0 -221
  575. data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
  576. data/ext/pg_query/include/catalog/pg_authid.h +0 -63
  577. data/ext/pg_query/include/catalog/pg_authid_d.h +0 -57
  578. data/ext/pg_query/include/catalog/pg_class.h +0 -230
  579. data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
  580. data/ext/pg_query/include/catalog/pg_collation.h +0 -98
  581. data/ext/pg_query/include/catalog/pg_collation_d.h +0 -62
  582. data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
  583. data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
  584. data/ext/pg_query/include/catalog/pg_control.h +0 -250
  585. data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
  586. data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
  587. data/ext/pg_query/include/catalog/pg_depend.h +0 -77
  588. data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
  589. data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
  590. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
  591. data/ext/pg_query/include/catalog/pg_index.h +0 -90
  592. data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
  593. data/ext/pg_query/include/catalog/pg_language.h +0 -72
  594. data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
  595. data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
  596. data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
  597. data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
  598. data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
  599. data/ext/pg_query/include/catalog/pg_operator.h +0 -107
  600. data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
  601. data/ext/pg_query/include/catalog/pg_opfamily.h +0 -63
  602. data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -49
  603. data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
  604. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
  605. data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
  606. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
  607. data/ext/pg_query/include/catalog/pg_proc.h +0 -220
  608. data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
  609. data/ext/pg_query/include/catalog/pg_publication.h +0 -161
  610. data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
  611. data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
  612. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
  613. data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
  614. data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
  615. data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
  616. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
  617. data/ext/pg_query/include/catalog/pg_transform.h +0 -48
  618. data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
  619. data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
  620. data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
  621. data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
  622. data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
  623. data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
  624. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
  625. data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
  626. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
  627. data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
  628. data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
  629. data/ext/pg_query/include/catalog/pg_type.h +0 -404
  630. data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
  631. data/ext/pg_query/include/catalog/storage.h +0 -50
  632. data/ext/pg_query/include/commands/async.h +0 -53
  633. data/ext/pg_query/include/commands/dbcommands.h +0 -36
  634. data/ext/pg_query/include/commands/defrem.h +0 -160
  635. data/ext/pg_query/include/commands/event_trigger.h +0 -88
  636. data/ext/pg_query/include/commands/explain.h +0 -127
  637. data/ext/pg_query/include/commands/prepare.h +0 -61
  638. data/ext/pg_query/include/commands/tablespace.h +0 -69
  639. data/ext/pg_query/include/commands/trigger.h +0 -287
  640. data/ext/pg_query/include/commands/user.h +0 -37
  641. data/ext/pg_query/include/commands/vacuum.h +0 -340
  642. data/ext/pg_query/include/commands/variable.h +0 -38
  643. data/ext/pg_query/include/common/file_perm.h +0 -56
  644. data/ext/pg_query/include/common/hashfn.h +0 -104
  645. data/ext/pg_query/include/common/ip.h +0 -31
  646. data/ext/pg_query/include/common/keywords.h +0 -29
  647. data/ext/pg_query/include/common/kwlookup.h +0 -44
  648. data/ext/pg_query/include/common/pg_prng.h +0 -60
  649. data/ext/pg_query/include/common/relpath.h +0 -90
  650. data/ext/pg_query/include/common/string.h +0 -42
  651. data/ext/pg_query/include/common/unicode_combining_table.h +0 -308
  652. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
  653. data/ext/pg_query/include/datatype/timestamp.h +0 -236
  654. data/ext/pg_query/include/executor/execdesc.h +0 -70
  655. data/ext/pg_query/include/executor/executor.h +0 -663
  656. data/ext/pg_query/include/executor/functions.h +0 -55
  657. data/ext/pg_query/include/executor/instrument.h +0 -118
  658. data/ext/pg_query/include/executor/spi.h +0 -213
  659. data/ext/pg_query/include/executor/tablefunc.h +0 -67
  660. data/ext/pg_query/include/executor/tuptable.h +0 -487
  661. data/ext/pg_query/include/fmgr.h +0 -781
  662. data/ext/pg_query/include/funcapi.h +0 -360
  663. data/ext/pg_query/include/getaddrinfo.h +0 -162
  664. data/ext/pg_query/include/jit/jit.h +0 -105
  665. data/ext/pg_query/include/kwlist_d.h +0 -1095
  666. data/ext/pg_query/include/lib/dshash.h +0 -112
  667. data/ext/pg_query/include/lib/ilist.h +0 -746
  668. data/ext/pg_query/include/lib/pairingheap.h +0 -102
  669. data/ext/pg_query/include/lib/simplehash.h +0 -1184
  670. data/ext/pg_query/include/lib/sort_template.h +0 -432
  671. data/ext/pg_query/include/lib/stringinfo.h +0 -161
  672. data/ext/pg_query/include/libpq/auth.h +0 -31
  673. data/ext/pg_query/include/libpq/crypt.h +0 -47
  674. data/ext/pg_query/include/libpq/hba.h +0 -179
  675. data/ext/pg_query/include/libpq/libpq-be.h +0 -343
  676. data/ext/pg_query/include/libpq/libpq.h +0 -144
  677. data/ext/pg_query/include/libpq/pqcomm.h +0 -194
  678. data/ext/pg_query/include/libpq/pqformat.h +0 -210
  679. data/ext/pg_query/include/libpq/pqsignal.h +0 -42
  680. data/ext/pg_query/include/mb/pg_wchar.h +0 -755
  681. data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
  682. data/ext/pg_query/include/miscadmin.h +0 -495
  683. data/ext/pg_query/include/nodes/bitmapset.h +0 -122
  684. data/ext/pg_query/include/nodes/execnodes.h +0 -2715
  685. data/ext/pg_query/include/nodes/extensible.h +0 -162
  686. data/ext/pg_query/include/nodes/lockoptions.h +0 -61
  687. data/ext/pg_query/include/nodes/makefuncs.h +0 -109
  688. data/ext/pg_query/include/nodes/memnodes.h +0 -110
  689. data/ext/pg_query/include/nodes/nodeFuncs.h +0 -162
  690. data/ext/pg_query/include/nodes/nodes.h +0 -861
  691. data/ext/pg_query/include/nodes/params.h +0 -170
  692. data/ext/pg_query/include/nodes/parsenodes.h +0 -3812
  693. data/ext/pg_query/include/nodes/pathnodes.h +0 -2734
  694. data/ext/pg_query/include/nodes/pg_list.h +0 -612
  695. data/ext/pg_query/include/nodes/plannodes.h +0 -1349
  696. data/ext/pg_query/include/nodes/primnodes.h +0 -1593
  697. data/ext/pg_query/include/nodes/print.h +0 -34
  698. data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
  699. data/ext/pg_query/include/nodes/value.h +0 -80
  700. data/ext/pg_query/include/optimizer/cost.h +0 -213
  701. data/ext/pg_query/include/optimizer/geqo.h +0 -90
  702. data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
  703. data/ext/pg_query/include/optimizer/optimizer.h +0 -202
  704. data/ext/pg_query/include/optimizer/paths.h +0 -257
  705. data/ext/pg_query/include/optimizer/planmain.h +0 -120
  706. data/ext/pg_query/include/parser/analyze.h +0 -63
  707. data/ext/pg_query/include/parser/gram.h +0 -1101
  708. data/ext/pg_query/include/parser/gramparse.h +0 -75
  709. data/ext/pg_query/include/parser/kwlist.h +0 -487
  710. data/ext/pg_query/include/parser/parse_agg.h +0 -63
  711. data/ext/pg_query/include/parser/parse_coerce.h +0 -100
  712. data/ext/pg_query/include/parser/parse_expr.h +0 -25
  713. data/ext/pg_query/include/parser/parse_func.h +0 -74
  714. data/ext/pg_query/include/parser/parse_node.h +0 -339
  715. data/ext/pg_query/include/parser/parse_oper.h +0 -65
  716. data/ext/pg_query/include/parser/parse_relation.h +0 -124
  717. data/ext/pg_query/include/parser/parse_type.h +0 -60
  718. data/ext/pg_query/include/parser/parser.h +0 -68
  719. data/ext/pg_query/include/parser/parsetree.h +0 -61
  720. data/ext/pg_query/include/parser/scanner.h +0 -152
  721. data/ext/pg_query/include/parser/scansup.h +0 -27
  722. data/ext/pg_query/include/partitioning/partdefs.h +0 -26
  723. data/ext/pg_query/include/pg_config.h +0 -1037
  724. data/ext/pg_query/include/pg_config_manual.h +0 -410
  725. data/ext/pg_query/include/pg_config_os.h +0 -8
  726. data/ext/pg_query/include/pg_getopt.h +0 -56
  727. data/ext/pg_query/include/pg_trace.h +0 -17
  728. data/ext/pg_query/include/pgstat.h +0 -699
  729. data/ext/pg_query/include/pgtime.h +0 -94
  730. data/ext/pg_query/include/pl_gram.h +0 -383
  731. data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
  732. data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
  733. data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -111
  734. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -244
  735. data/ext/pg_query/include/plerrcodes.h +0 -998
  736. data/ext/pg_query/include/plpgsql.h +0 -1345
  737. data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
  738. data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
  739. data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
  740. data/ext/pg_query/include/port/atomics/fallback.h +0 -170
  741. data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
  742. data/ext/pg_query/include/port/atomics/generic.h +0 -401
  743. data/ext/pg_query/include/port/atomics.h +0 -524
  744. data/ext/pg_query/include/port/pg_bitutils.h +0 -302
  745. data/ext/pg_query/include/port/pg_bswap.h +0 -161
  746. data/ext/pg_query/include/port/pg_crc32c.h +0 -101
  747. data/ext/pg_query/include/port.h +0 -553
  748. data/ext/pg_query/include/portability/instr_time.h +0 -256
  749. data/ext/pg_query/include/postgres.h +0 -808
  750. data/ext/pg_query/include/postgres_ext.h +0 -74
  751. data/ext/pg_query/include/postmaster/autovacuum.h +0 -83
  752. data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
  753. data/ext/pg_query/include/postmaster/bgworker.h +0 -162
  754. data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
  755. data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
  756. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  757. data/ext/pg_query/include/postmaster/interrupt.h +0 -32
  758. data/ext/pg_query/include/postmaster/pgarch.h +0 -73
  759. data/ext/pg_query/include/postmaster/postmaster.h +0 -78
  760. data/ext/pg_query/include/postmaster/startup.h +0 -39
  761. data/ext/pg_query/include/postmaster/syslogger.h +0 -103
  762. data/ext/pg_query/include/postmaster/walwriter.h +0 -21
  763. data/ext/pg_query/include/regex/regex.h +0 -186
  764. data/ext/pg_query/include/replication/logicallauncher.h +0 -29
  765. data/ext/pg_query/include/replication/logicalproto.h +0 -254
  766. data/ext/pg_query/include/replication/logicalworker.h +0 -19
  767. data/ext/pg_query/include/replication/origin.h +0 -73
  768. data/ext/pg_query/include/replication/reorderbuffer.h +0 -685
  769. data/ext/pg_query/include/replication/slot.h +0 -230
  770. data/ext/pg_query/include/replication/syncrep.h +0 -115
  771. data/ext/pg_query/include/replication/walreceiver.h +0 -472
  772. data/ext/pg_query/include/replication/walsender.h +0 -74
  773. data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
  774. data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -38
  775. data/ext/pg_query/include/rewrite/rewriteManip.h +0 -87
  776. data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
  777. data/ext/pg_query/include/storage/backendid.h +0 -37
  778. data/ext/pg_query/include/storage/block.h +0 -115
  779. data/ext/pg_query/include/storage/buf.h +0 -46
  780. data/ext/pg_query/include/storage/bufmgr.h +0 -297
  781. data/ext/pg_query/include/storage/bufpage.h +0 -457
  782. data/ext/pg_query/include/storage/condition_variable.h +0 -73
  783. data/ext/pg_query/include/storage/dsm.h +0 -64
  784. data/ext/pg_query/include/storage/dsm_impl.h +0 -76
  785. data/ext/pg_query/include/storage/fd.h +0 -198
  786. data/ext/pg_query/include/storage/fileset.h +0 -40
  787. data/ext/pg_query/include/storage/ipc.h +0 -84
  788. data/ext/pg_query/include/storage/item.h +0 -19
  789. data/ext/pg_query/include/storage/itemid.h +0 -184
  790. data/ext/pg_query/include/storage/itemptr.h +0 -208
  791. data/ext/pg_query/include/storage/large_object.h +0 -100
  792. data/ext/pg_query/include/storage/latch.h +0 -186
  793. data/ext/pg_query/include/storage/lmgr.h +0 -115
  794. data/ext/pg_query/include/storage/lock.h +0 -616
  795. data/ext/pg_query/include/storage/lockdefs.h +0 -59
  796. data/ext/pg_query/include/storage/lwlock.h +0 -206
  797. data/ext/pg_query/include/storage/lwlocknames.h +0 -50
  798. data/ext/pg_query/include/storage/off.h +0 -57
  799. data/ext/pg_query/include/storage/pg_sema.h +0 -61
  800. data/ext/pg_query/include/storage/pg_shmem.h +0 -92
  801. data/ext/pg_query/include/storage/pmsignal.h +0 -105
  802. data/ext/pg_query/include/storage/predicate.h +0 -87
  803. data/ext/pg_query/include/storage/proc.h +0 -461
  804. data/ext/pg_query/include/storage/procarray.h +0 -98
  805. data/ext/pg_query/include/storage/proclist_types.h +0 -51
  806. data/ext/pg_query/include/storage/procsignal.h +0 -71
  807. data/ext/pg_query/include/storage/relfilenode.h +0 -99
  808. data/ext/pg_query/include/storage/s_lock.h +0 -1110
  809. data/ext/pg_query/include/storage/sharedfileset.h +0 -37
  810. data/ext/pg_query/include/storage/shm_mq.h +0 -86
  811. data/ext/pg_query/include/storage/shm_toc.h +0 -58
  812. data/ext/pg_query/include/storage/shmem.h +0 -81
  813. data/ext/pg_query/include/storage/sinval.h +0 -153
  814. data/ext/pg_query/include/storage/sinvaladt.h +0 -43
  815. data/ext/pg_query/include/storage/smgr.h +0 -111
  816. data/ext/pg_query/include/storage/spin.h +0 -77
  817. data/ext/pg_query/include/storage/standby.h +0 -98
  818. data/ext/pg_query/include/storage/standbydefs.h +0 -74
  819. data/ext/pg_query/include/storage/sync.h +0 -66
  820. data/ext/pg_query/include/tcop/cmdtag.h +0 -58
  821. data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
  822. data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
  823. data/ext/pg_query/include/tcop/dest.h +0 -149
  824. data/ext/pg_query/include/tcop/fastpath.h +0 -20
  825. data/ext/pg_query/include/tcop/pquery.h +0 -51
  826. data/ext/pg_query/include/tcop/tcopprot.h +0 -97
  827. data/ext/pg_query/include/tcop/utility.h +0 -112
  828. data/ext/pg_query/include/tsearch/ts_cache.h +0 -98
  829. data/ext/pg_query/include/utils/acl.h +0 -333
  830. data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
  831. data/ext/pg_query/include/utils/array.h +0 -464
  832. data/ext/pg_query/include/utils/backend_progress.h +0 -44
  833. data/ext/pg_query/include/utils/backend_status.h +0 -321
  834. data/ext/pg_query/include/utils/builtins.h +0 -127
  835. data/ext/pg_query/include/utils/bytea.h +0 -28
  836. data/ext/pg_query/include/utils/catcache.h +0 -231
  837. data/ext/pg_query/include/utils/date.h +0 -90
  838. data/ext/pg_query/include/utils/datetime.h +0 -344
  839. data/ext/pg_query/include/utils/datum.h +0 -76
  840. data/ext/pg_query/include/utils/dsa.h +0 -123
  841. data/ext/pg_query/include/utils/dynahash.h +0 -20
  842. data/ext/pg_query/include/utils/elog.h +0 -470
  843. data/ext/pg_query/include/utils/errcodes.h +0 -354
  844. data/ext/pg_query/include/utils/expandeddatum.h +0 -159
  845. data/ext/pg_query/include/utils/expandedrecord.h +0 -231
  846. data/ext/pg_query/include/utils/float.h +0 -356
  847. data/ext/pg_query/include/utils/fmgroids.h +0 -3261
  848. data/ext/pg_query/include/utils/fmgrprotos.h +0 -2829
  849. data/ext/pg_query/include/utils/fmgrtab.h +0 -49
  850. data/ext/pg_query/include/utils/guc.h +0 -469
  851. data/ext/pg_query/include/utils/guc_tables.h +0 -276
  852. data/ext/pg_query/include/utils/hsearch.h +0 -153
  853. data/ext/pg_query/include/utils/inval.h +0 -68
  854. data/ext/pg_query/include/utils/lsyscache.h +0 -208
  855. data/ext/pg_query/include/utils/memdebug.h +0 -82
  856. data/ext/pg_query/include/utils/memutils.h +0 -230
  857. data/ext/pg_query/include/utils/numeric.h +0 -90
  858. data/ext/pg_query/include/utils/palloc.h +0 -158
  859. data/ext/pg_query/include/utils/partcache.h +0 -102
  860. data/ext/pg_query/include/utils/pg_locale.h +0 -127
  861. data/ext/pg_query/include/utils/pg_lsn.h +0 -29
  862. data/ext/pg_query/include/utils/pgstat_internal.h +0 -784
  863. data/ext/pg_query/include/utils/pidfile.h +0 -56
  864. data/ext/pg_query/include/utils/plancache.h +0 -236
  865. data/ext/pg_query/include/utils/portal.h +0 -252
  866. data/ext/pg_query/include/utils/probes.h +0 -114
  867. data/ext/pg_query/include/utils/ps_status.h +0 -25
  868. data/ext/pg_query/include/utils/queryenvironment.h +0 -74
  869. data/ext/pg_query/include/utils/queryjumble.h +0 -88
  870. data/ext/pg_query/include/utils/regproc.h +0 -39
  871. data/ext/pg_query/include/utils/rel.h +0 -695
  872. data/ext/pg_query/include/utils/relcache.h +0 -153
  873. data/ext/pg_query/include/utils/reltrigger.h +0 -81
  874. data/ext/pg_query/include/utils/resowner.h +0 -86
  875. data/ext/pg_query/include/utils/rls.h +0 -50
  876. data/ext/pg_query/include/utils/ruleutils.h +0 -47
  877. data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
  878. data/ext/pg_query/include/utils/snapmgr.h +0 -179
  879. data/ext/pg_query/include/utils/snapshot.h +0 -219
  880. data/ext/pg_query/include/utils/sortsupport.h +0 -391
  881. data/ext/pg_query/include/utils/syscache.h +0 -224
  882. data/ext/pg_query/include/utils/timeout.h +0 -95
  883. data/ext/pg_query/include/utils/timestamp.h +0 -117
  884. data/ext/pg_query/include/utils/tuplesort.h +0 -291
  885. data/ext/pg_query/include/utils/tuplestore.h +0 -91
  886. data/ext/pg_query/include/utils/typcache.h +0 -209
  887. data/ext/pg_query/include/utils/tzparser.h +0 -39
  888. data/ext/pg_query/include/utils/varlena.h +0 -41
  889. data/ext/pg_query/include/utils/wait_event.h +0 -289
  890. data/ext/pg_query/include/utils/xml.h +0 -84
  891. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2201
  892. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
  893. data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
  894. data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
  895. data/ext/pg_query/src_common_pg_prng.c +0 -152
  896. data/ext/pg_query/src_common_string.c +0 -92
  897. data/ext/pg_query/src_port_pgsleep.c +0 -69
  898. data/ext/pg_query/src_port_strnlen.c +0 -39
  899. /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
  900. /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
  901. /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
@@ -0,0 +1,1206 @@
1
+ /*
2
+ * simplehash.h
3
+ *
4
+ * When included this file generates a "templated" (by way of macros)
5
+ * open-addressing hash table implementation specialized to user-defined
6
+ * types.
7
+ *
8
+ * It's probably not worthwhile to generate such a specialized implementation
9
+ * for hash tables that aren't performance or space sensitive.
10
+ *
11
+ * Compared to dynahash, simplehash has the following benefits:
12
+ *
13
+ * - Due to the "templated" code generation has known structure sizes and no
14
+ * indirect function calls (which show up substantially in dynahash
15
+ * profiles). These features considerably increase speed for small
16
+ * entries.
17
+ * - Open addressing has better CPU cache behavior than dynahash's chained
18
+ * hashtables.
19
+ * - The generated interface is type-safe and easier to use than dynahash,
20
+ * though at the cost of more complex setup.
21
+ * - Allocates memory in a MemoryContext or another allocator with a
22
+ * malloc/free style interface (which isn't easily usable in a shared
23
+ * memory context)
24
+ * - Does not require the overhead of a separate memory context.
25
+ *
26
+ * Usage notes:
27
+ *
28
+ * To generate a hash-table and associated functions for a use case several
29
+ * macros have to be #define'ed before this file is included. Including
30
+ * the file #undef's all those, so a new hash table can be generated
31
+ * afterwards.
32
+ * The relevant parameters are:
33
+ * - SH_PREFIX - prefix for all symbol names generated. A prefix of 'foo'
34
+ * will result in hash table type 'foo_hash' and functions like
35
+ * 'foo_insert'/'foo_lookup' and so forth.
36
+ * - SH_ELEMENT_TYPE - type of the contained elements
37
+ * - SH_KEY_TYPE - type of the hashtable's key
38
+ * - SH_DECLARE - if defined function prototypes and type declarations are
39
+ * generated
40
+ * - SH_DEFINE - if defined function definitions are generated
41
+ * - SH_SCOPE - in which scope (e.g. extern, static inline) do function
42
+ * declarations reside
43
+ * - SH_RAW_ALLOCATOR - if defined, memory contexts are not used; instead,
44
+ * use this to allocate bytes. The allocator must zero the returned space.
45
+ * - SH_USE_NONDEFAULT_ALLOCATOR - if defined no element allocator functions
46
+ * are defined, so you can supply your own
47
+ * The following parameters are only relevant when SH_DEFINE is defined:
48
+ * - SH_KEY - name of the element in SH_ELEMENT_TYPE containing the hash key
49
+ * - SH_EQUAL(table, a, b) - compare two table keys
50
+ * - SH_HASH_KEY(table, key) - generate hash for the key
51
+ * - SH_STORE_HASH - if defined the hash is stored in the elements
52
+ * - SH_GET_HASH(tb, a) - return the field to store the hash in
53
+ *
54
+ * The element type is required to contain a "status" member that can store
55
+ * the range of values defined in the SH_STATUS enum.
56
+ *
57
+ * While SH_STORE_HASH (and subsequently SH_GET_HASH) are optional, because
58
+ * the hash table implementation needs to compare hashes to move elements
59
+ * (particularly when growing the hash), it's preferable, if possible, to
60
+ * store the element's hash in the element's data type. If the hash is so
61
+ * stored, the hash table will also compare hashes before calling SH_EQUAL
62
+ * when comparing two keys.
63
+ *
64
+ * For convenience the hash table create functions accept a void pointer
65
+ * that will be stored in the hash table type's member private_data. This
66
+ * allows callbacks to reference caller provided data.
67
+ *
68
+ * For examples of usage look at tidbitmap.c (file local definition) and
69
+ * execnodes.h/execGrouping.c (exposed declaration, file local
70
+ * implementation).
71
+ *
72
+ * Hash table design:
73
+ *
74
+ * The hash table design chosen is a variant of linear open-addressing. The
75
+ * reason for doing so is that linear addressing is CPU cache & pipeline
76
+ * friendly. The biggest disadvantage of simple linear addressing schemes
77
+ * are highly variable lookup times due to clustering, and deletions
78
+ * leaving a lot of tombstones around. To address these issues a variant
79
+ * of "robin hood" hashing is employed. Robin hood hashing optimizes
80
+ * chaining lengths by moving elements close to their optimal bucket
81
+ * ("rich" elements), out of the way if a to-be-inserted element is further
82
+ * away from its optimal position (i.e. it's "poor"). While that can make
83
+ * insertions slower, the average lookup performance is a lot better, and
84
+ * higher fill factors can be used in a still performant manner. To avoid
85
+ * tombstones - which normally solve the issue that a deleted node's
86
+ * presence is relevant to determine whether a lookup needs to continue
87
+ * looking or is done - buckets following a deleted element are shifted
88
+ * backwards, unless they're empty or already at their optimal position.
89
+ *
90
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
91
+ * Portions Copyright (c) 1994, Regents of the University of California
92
+ *
93
+ * src/include/lib/simplehash.h
94
+ */
95
+
96
+ #include "port/pg_bitutils.h"
97
+
98
+ /* helpers */
99
+ #define SH_MAKE_PREFIX(a) CppConcat(a,_)
100
+ #define SH_MAKE_NAME(name) SH_MAKE_NAME_(SH_MAKE_PREFIX(SH_PREFIX),name)
101
+ #define SH_MAKE_NAME_(a,b) CppConcat(a,b)
102
+
103
+ /* name macros for: */
104
+
105
+ /* type declarations */
106
+ #define SH_TYPE SH_MAKE_NAME(hash)
107
+ #define SH_STATUS SH_MAKE_NAME(status)
108
+ #define SH_STATUS_EMPTY SH_MAKE_NAME(SH_EMPTY)
109
+ #define SH_STATUS_IN_USE SH_MAKE_NAME(SH_IN_USE)
110
+ #define SH_ITERATOR SH_MAKE_NAME(iterator)
111
+
112
+ /* function declarations */
113
+ #define SH_CREATE SH_MAKE_NAME(create)
114
+ #define SH_DESTROY SH_MAKE_NAME(destroy)
115
+ #define SH_RESET SH_MAKE_NAME(reset)
116
+ #define SH_INSERT SH_MAKE_NAME(insert)
117
+ #define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
118
+ #define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
119
+ #define SH_DELETE SH_MAKE_NAME(delete)
120
+ #define SH_LOOKUP SH_MAKE_NAME(lookup)
121
+ #define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
122
+ #define SH_GROW SH_MAKE_NAME(grow)
123
+ #define SH_START_ITERATE SH_MAKE_NAME(start_iterate)
124
+ #define SH_START_ITERATE_AT SH_MAKE_NAME(start_iterate_at)
125
+ #define SH_ITERATE SH_MAKE_NAME(iterate)
126
+ #define SH_ALLOCATE SH_MAKE_NAME(allocate)
127
+ #define SH_FREE SH_MAKE_NAME(free)
128
+ #define SH_STAT SH_MAKE_NAME(stat)
129
+
130
+ /* internal helper functions (no externally visible prototypes) */
131
+ #define SH_COMPUTE_SIZE SH_MAKE_NAME(compute_size)
132
+ #define SH_UPDATE_PARAMETERS SH_MAKE_NAME(update_parameters)
133
+ #define SH_NEXT SH_MAKE_NAME(next)
134
+ #define SH_PREV SH_MAKE_NAME(prev)
135
+ #define SH_DISTANCE_FROM_OPTIMAL SH_MAKE_NAME(distance)
136
+ #define SH_INITIAL_BUCKET SH_MAKE_NAME(initial_bucket)
137
+ #define SH_ENTRY_HASH SH_MAKE_NAME(entry_hash)
138
+ #define SH_INSERT_HASH_INTERNAL SH_MAKE_NAME(insert_hash_internal)
139
+ #define SH_LOOKUP_HASH_INTERNAL SH_MAKE_NAME(lookup_hash_internal)
140
+
141
+ /* generate forward declarations necessary to use the hash table */
142
+ #ifdef SH_DECLARE
143
+
144
+ /* type definitions */
145
+ typedef struct SH_TYPE
146
+ {
147
+ /*
148
+ * Size of data / bucket array, 64 bits to handle UINT32_MAX sized hash
149
+ * tables. Note that the maximum number of elements is lower
150
+ * (SH_MAX_FILLFACTOR)
151
+ */
152
+ uint64 size;
153
+
154
+ /* how many elements have valid contents */
155
+ uint32 members;
156
+
157
+ /* mask for bucket and size calculations, based on size */
158
+ uint32 sizemask;
159
+
160
+ /* boundary after which to grow hashtable */
161
+ uint32 grow_threshold;
162
+
163
+ /* hash buckets */
164
+ SH_ELEMENT_TYPE *data;
165
+
166
+ #ifndef SH_RAW_ALLOCATOR
167
+ /* memory context to use for allocations */
168
+ MemoryContext ctx;
169
+ #endif
170
+
171
+ /* user defined data, useful for callbacks */
172
+ void *private_data;
173
+ } SH_TYPE;
174
+
175
+ typedef enum SH_STATUS
176
+ {
177
+ SH_STATUS_EMPTY = 0x00,
178
+ SH_STATUS_IN_USE = 0x01
179
+ } SH_STATUS;
180
+
181
+ typedef struct SH_ITERATOR
182
+ {
183
+ uint32 cur; /* current element */
184
+ uint32 end;
185
+ bool done; /* iterator exhausted? */
186
+ } SH_ITERATOR;
187
+
188
+ /* externally visible function prototypes */
189
+ #ifdef SH_RAW_ALLOCATOR
190
+ /* <prefix>_hash <prefix>_create(uint32 nelements, void *private_data) */
191
+ SH_SCOPE SH_TYPE *SH_CREATE(uint32 nelements, void *private_data);
192
+ #else
193
+ /*
194
+ * <prefix>_hash <prefix>_create(MemoryContext ctx, uint32 nelements,
195
+ * void *private_data)
196
+ */
197
+ SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
198
+ void *private_data);
199
+ #endif
200
+
201
+ /* void <prefix>_destroy(<prefix>_hash *tb) */
202
+ SH_SCOPE void SH_DESTROY(SH_TYPE * tb);
203
+
204
+ /* void <prefix>_reset(<prefix>_hash *tb) */
205
+ SH_SCOPE void SH_RESET(SH_TYPE * tb);
206
+
207
+ /* void <prefix>_grow(<prefix>_hash *tb, uint64 newsize) */
208
+ SH_SCOPE void SH_GROW(SH_TYPE * tb, uint64 newsize);
209
+
210
+ /* <element> *<prefix>_insert(<prefix>_hash *tb, <key> key, bool *found) */
211
+ SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT(SH_TYPE * tb, SH_KEY_TYPE key, bool *found);
212
+
213
+ /*
214
+ * <element> *<prefix>_insert_hash(<prefix>_hash *tb, <key> key, uint32 hash,
215
+ * bool *found)
216
+ */
217
+ SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
218
+ uint32 hash, bool *found);
219
+
220
+ /* <element> *<prefix>_lookup(<prefix>_hash *tb, <key> key) */
221
+ SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP(SH_TYPE * tb, SH_KEY_TYPE key);
222
+
223
+ /* <element> *<prefix>_lookup_hash(<prefix>_hash *tb, <key> key, uint32 hash) */
224
+ SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
225
+ uint32 hash);
226
+
227
+ /* void <prefix>_delete_item(<prefix>_hash *tb, <element> *entry) */
228
+ SH_SCOPE void SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry);
229
+
230
+ /* bool <prefix>_delete(<prefix>_hash *tb, <key> key) */
231
+ SH_SCOPE bool SH_DELETE(SH_TYPE * tb, SH_KEY_TYPE key);
232
+
233
+ /* void <prefix>_start_iterate(<prefix>_hash *tb, <prefix>_iterator *iter) */
234
+ SH_SCOPE void SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
235
+
236
+ /*
237
+ * void <prefix>_start_iterate_at(<prefix>_hash *tb, <prefix>_iterator *iter,
238
+ * uint32 at)
239
+ */
240
+ SH_SCOPE void SH_START_ITERATE_AT(SH_TYPE * tb, SH_ITERATOR * iter, uint32 at);
241
+
242
+ /* <element> *<prefix>_iterate(<prefix>_hash *tb, <prefix>_iterator *iter) */
243
+ SH_SCOPE SH_ELEMENT_TYPE *SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
244
+
245
+ /* void <prefix>_stat(<prefix>_hash *tb */
246
+ SH_SCOPE void SH_STAT(SH_TYPE * tb);
247
+
248
+ #endif /* SH_DECLARE */
249
+
250
+
251
+ /* generate implementation of the hash table */
252
+ #ifdef SH_DEFINE
253
+
254
+ #ifndef SH_RAW_ALLOCATOR
255
+ #include "utils/memutils.h"
256
+ #endif
257
+
258
+ /* max data array size,we allow up to PG_UINT32_MAX buckets, including 0 */
259
+ #define SH_MAX_SIZE (((uint64) PG_UINT32_MAX) + 1)
260
+
261
+ /* normal fillfactor, unless already close to maximum */
262
+ #ifndef SH_FILLFACTOR
263
+ #define SH_FILLFACTOR (0.9)
264
+ #endif
265
+ /* increase fillfactor if we otherwise would error out */
266
+ #define SH_MAX_FILLFACTOR (0.98)
267
+ /* grow if actual and optimal location bigger than */
268
+ #ifndef SH_GROW_MAX_DIB
269
+ #define SH_GROW_MAX_DIB 25
270
+ #endif
271
+ /* grow if more than elements to move when inserting */
272
+ #ifndef SH_GROW_MAX_MOVE
273
+ #define SH_GROW_MAX_MOVE 150
274
+ #endif
275
+ #ifndef SH_GROW_MIN_FILLFACTOR
276
+ /* but do not grow due to SH_GROW_MAX_* if below */
277
+ #define SH_GROW_MIN_FILLFACTOR 0.1
278
+ #endif
279
+
280
+ #ifdef SH_STORE_HASH
281
+ #define SH_COMPARE_KEYS(tb, ahash, akey, b) (ahash == SH_GET_HASH(tb, b) && SH_EQUAL(tb, b->SH_KEY, akey))
282
+ #else
283
+ #define SH_COMPARE_KEYS(tb, ahash, akey, b) (SH_EQUAL(tb, b->SH_KEY, akey))
284
+ #endif
285
+
286
+ /*
287
+ * Wrap the following definitions in include guards, to avoid multiple
288
+ * definition errors if this header is included more than once. The rest of
289
+ * the file deliberately has no include guards, because it can be included
290
+ * with different parameters to define functions and types with non-colliding
291
+ * names.
292
+ */
293
+ #ifndef SIMPLEHASH_H
294
+ #define SIMPLEHASH_H
295
+
296
+ #ifdef FRONTEND
297
+ #define sh_error(...) pg_fatal(__VA_ARGS__)
298
+ #define sh_log(...) pg_log_info(__VA_ARGS__)
299
+ #else
300
+ #define sh_error(...) elog(ERROR, __VA_ARGS__)
301
+ #define sh_log(...) elog(LOG, __VA_ARGS__)
302
+ #endif
303
+
304
+ #endif
305
+
306
+ /*
307
+ * Compute allocation size for hashtable. Result can be passed to
308
+ * SH_UPDATE_PARAMETERS.
309
+ */
310
+ static inline uint64
311
+ SH_COMPUTE_SIZE(uint64 newsize)
312
+ {
313
+ uint64 size;
314
+
315
+ /* supporting zero sized hashes would complicate matters */
316
+ size = Max(newsize, 2);
317
+
318
+ /* round up size to the next power of 2, that's how bucketing works */
319
+ size = pg_nextpower2_64(size);
320
+ Assert(size <= SH_MAX_SIZE);
321
+
322
+ /*
323
+ * Verify that allocation of ->data is possible on this platform, without
324
+ * overflowing Size.
325
+ */
326
+ if (unlikely((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2))
327
+ sh_error("hash table too large");
328
+
329
+ return size;
330
+ }
331
+
332
+ /*
333
+ * Update sizing parameters for hashtable. Called when creating and growing
334
+ * the hashtable.
335
+ */
336
+ static inline void
337
+ SH_UPDATE_PARAMETERS(SH_TYPE * tb, uint64 newsize)
338
+ {
339
+ uint64 size = SH_COMPUTE_SIZE(newsize);
340
+
341
+ /* now set size */
342
+ tb->size = size;
343
+ tb->sizemask = (uint32) (size - 1);
344
+
345
+ /*
346
+ * Compute the next threshold at which we need to grow the hash table
347
+ * again.
348
+ */
349
+ if (tb->size == SH_MAX_SIZE)
350
+ tb->grow_threshold = ((double) tb->size) * SH_MAX_FILLFACTOR;
351
+ else
352
+ tb->grow_threshold = ((double) tb->size) * SH_FILLFACTOR;
353
+ }
354
+
355
+ /* return the optimal bucket for the hash */
356
+ static inline uint32
357
+ SH_INITIAL_BUCKET(SH_TYPE * tb, uint32 hash)
358
+ {
359
+ return hash & tb->sizemask;
360
+ }
361
+
362
+ /* return next bucket after the current, handling wraparound */
363
+ static inline uint32
364
+ SH_NEXT(SH_TYPE * tb, uint32 curelem, uint32 startelem)
365
+ {
366
+ curelem = (curelem + 1) & tb->sizemask;
367
+
368
+ Assert(curelem != startelem);
369
+
370
+ return curelem;
371
+ }
372
+
373
+ /* return bucket before the current, handling wraparound */
374
+ static inline uint32
375
+ SH_PREV(SH_TYPE * tb, uint32 curelem, uint32 startelem)
376
+ {
377
+ curelem = (curelem - 1) & tb->sizemask;
378
+
379
+ Assert(curelem != startelem);
380
+
381
+ return curelem;
382
+ }
383
+
384
+ /* return distance between bucket and its optimal position */
385
+ static inline uint32
386
+ SH_DISTANCE_FROM_OPTIMAL(SH_TYPE * tb, uint32 optimal, uint32 bucket)
387
+ {
388
+ if (optimal <= bucket)
389
+ return bucket - optimal;
390
+ else
391
+ return (tb->size + bucket) - optimal;
392
+ }
393
+
394
+ static inline uint32
395
+ SH_ENTRY_HASH(SH_TYPE * tb, SH_ELEMENT_TYPE * entry)
396
+ {
397
+ #ifdef SH_STORE_HASH
398
+ return SH_GET_HASH(tb, entry);
399
+ #else
400
+ return SH_HASH_KEY(tb, entry->SH_KEY);
401
+ #endif
402
+ }
403
+
404
+ /* default memory allocator function */
405
+ static inline void *SH_ALLOCATE(SH_TYPE * type, Size size);
406
+ static inline void SH_FREE(SH_TYPE * type, void *pointer);
407
+
408
+ #ifndef SH_USE_NONDEFAULT_ALLOCATOR
409
+
410
+ /* default memory allocator function */
411
+ static inline void *
412
+ SH_ALLOCATE(SH_TYPE * type, Size size)
413
+ {
414
+ #ifdef SH_RAW_ALLOCATOR
415
+ return SH_RAW_ALLOCATOR(size);
416
+ #else
417
+ return MemoryContextAllocExtended(type->ctx, size,
418
+ MCXT_ALLOC_HUGE | MCXT_ALLOC_ZERO);
419
+ #endif
420
+ }
421
+
422
+ /* default memory free function */
423
+ static inline void
424
+ SH_FREE(SH_TYPE * type, void *pointer)
425
+ {
426
+ pfree(pointer);
427
+ }
428
+
429
+ #endif
430
+
431
+ /*
432
+ * Create a hash table with enough space for `nelements` distinct members.
433
+ * Memory for the hash table is allocated from the passed-in context. If
434
+ * desired, the array of elements can be allocated using a passed-in allocator;
435
+ * this could be useful in order to place the array of elements in a shared
436
+ * memory, or in a context that will outlive the rest of the hash table.
437
+ * Memory other than for the array of elements will still be allocated from
438
+ * the passed-in context.
439
+ */
440
+ #ifdef SH_RAW_ALLOCATOR
441
+ SH_SCOPE SH_TYPE *
442
+ SH_CREATE(uint32 nelements, void *private_data)
443
+ #else
444
+ SH_SCOPE SH_TYPE *
445
+ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
446
+ #endif
447
+ {
448
+ SH_TYPE *tb;
449
+ uint64 size;
450
+
451
+ #ifdef SH_RAW_ALLOCATOR
452
+ tb = (SH_TYPE *) SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
453
+ #else
454
+ tb = (SH_TYPE *) MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
455
+ tb->ctx = ctx;
456
+ #endif
457
+ tb->private_data = private_data;
458
+
459
+ /* increase nelements by fillfactor, want to store nelements elements */
460
+ size = Min((double) SH_MAX_SIZE, ((double) nelements) / SH_FILLFACTOR);
461
+
462
+ size = SH_COMPUTE_SIZE(size);
463
+
464
+ tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * size);
465
+
466
+ SH_UPDATE_PARAMETERS(tb, size);
467
+ return tb;
468
+ }
469
+
470
+ /* destroy a previously created hash table */
471
+ SH_SCOPE void
472
+ SH_DESTROY(SH_TYPE * tb)
473
+ {
474
+ SH_FREE(tb, tb->data);
475
+ pfree(tb);
476
+ }
477
+
478
+ /* reset the contents of a previously created hash table */
479
+ SH_SCOPE void
480
+ SH_RESET(SH_TYPE * tb)
481
+ {
482
+ memset(tb->data, 0, sizeof(SH_ELEMENT_TYPE) * tb->size);
483
+ tb->members = 0;
484
+ }
485
+
486
+ /*
487
+ * Grow a hash table to at least `newsize` buckets.
488
+ *
489
+ * Usually this will automatically be called by insertions/deletions, when
490
+ * necessary. But resizing to the exact input size can be advantageous
491
+ * performance-wise, when known at some point.
492
+ */
493
+ SH_SCOPE void
494
+ SH_GROW(SH_TYPE * tb, uint64 newsize)
495
+ {
496
+ uint64 oldsize = tb->size;
497
+ SH_ELEMENT_TYPE *olddata = tb->data;
498
+ SH_ELEMENT_TYPE *newdata;
499
+ uint32 i;
500
+ uint32 startelem = 0;
501
+ uint32 copyelem;
502
+
503
+ Assert(oldsize == pg_nextpower2_64(oldsize));
504
+ Assert(oldsize != SH_MAX_SIZE);
505
+ Assert(oldsize < newsize);
506
+
507
+ newsize = SH_COMPUTE_SIZE(newsize);
508
+
509
+ tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * newsize);
510
+
511
+ /*
512
+ * Update parameters for new table after allocation succeeds to avoid
513
+ * inconsistent state on OOM.
514
+ */
515
+ SH_UPDATE_PARAMETERS(tb, newsize);
516
+
517
+ newdata = tb->data;
518
+
519
+ /*
520
+ * Copy entries from the old data to newdata. We theoretically could use
521
+ * SH_INSERT here, to avoid code duplication, but that's more general than
522
+ * we need. We neither want tb->members increased, nor do we need to do
523
+ * deal with deleted elements, nor do we need to compare keys. So a
524
+ * special-cased implementation is lot faster. As resizing can be time
525
+ * consuming and frequent, that's worthwhile to optimize.
526
+ *
527
+ * To be able to simply move entries over, we have to start not at the
528
+ * first bucket (i.e olddata[0]), but find the first bucket that's either
529
+ * empty, or is occupied by an entry at its optimal position. Such a
530
+ * bucket has to exist in any table with a load factor under 1, as not all
531
+ * buckets are occupied, i.e. there always has to be an empty bucket. By
532
+ * starting at such a bucket we can move the entries to the larger table,
533
+ * without having to deal with conflicts.
534
+ */
535
+
536
+ /* search for the first element in the hash that's not wrapped around */
537
+ for (i = 0; i < oldsize; i++)
538
+ {
539
+ SH_ELEMENT_TYPE *oldentry = &olddata[i];
540
+ uint32 hash;
541
+ uint32 optimal;
542
+
543
+ if (oldentry->status != SH_STATUS_IN_USE)
544
+ {
545
+ startelem = i;
546
+ break;
547
+ }
548
+
549
+ hash = SH_ENTRY_HASH(tb, oldentry);
550
+ optimal = SH_INITIAL_BUCKET(tb, hash);
551
+
552
+ if (optimal == i)
553
+ {
554
+ startelem = i;
555
+ break;
556
+ }
557
+ }
558
+
559
+ /* and copy all elements in the old table */
560
+ copyelem = startelem;
561
+ for (i = 0; i < oldsize; i++)
562
+ {
563
+ SH_ELEMENT_TYPE *oldentry = &olddata[copyelem];
564
+
565
+ if (oldentry->status == SH_STATUS_IN_USE)
566
+ {
567
+ uint32 hash;
568
+ uint32 startelem2;
569
+ uint32 curelem;
570
+ SH_ELEMENT_TYPE *newentry;
571
+
572
+ hash = SH_ENTRY_HASH(tb, oldentry);
573
+ startelem2 = SH_INITIAL_BUCKET(tb, hash);
574
+ curelem = startelem2;
575
+
576
+ /* find empty element to put data into */
577
+ while (true)
578
+ {
579
+ newentry = &newdata[curelem];
580
+
581
+ if (newentry->status == SH_STATUS_EMPTY)
582
+ {
583
+ break;
584
+ }
585
+
586
+ curelem = SH_NEXT(tb, curelem, startelem2);
587
+ }
588
+
589
+ /* copy entry to new slot */
590
+ memcpy(newentry, oldentry, sizeof(SH_ELEMENT_TYPE));
591
+ }
592
+
593
+ /* can't use SH_NEXT here, would use new size */
594
+ copyelem++;
595
+ if (copyelem >= oldsize)
596
+ {
597
+ copyelem = 0;
598
+ }
599
+ }
600
+
601
+ SH_FREE(tb, olddata);
602
+ }
603
+
604
+ /*
605
+ * This is a separate static inline function, so it can be reliably be inlined
606
+ * into its wrapper functions even if SH_SCOPE is extern.
607
+ */
608
+ static inline SH_ELEMENT_TYPE *
609
+ SH_INSERT_HASH_INTERNAL(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash, bool *found)
610
+ {
611
+ uint32 startelem;
612
+ uint32 curelem;
613
+ SH_ELEMENT_TYPE *data;
614
+ uint32 insertdist;
615
+
616
+ restart:
617
+ insertdist = 0;
618
+
619
+ /*
620
+ * We do the grow check even if the key is actually present, to avoid
621
+ * doing the check inside the loop. This also lets us avoid having to
622
+ * re-find our position in the hashtable after resizing.
623
+ *
624
+ * Note that this also reached when resizing the table due to
625
+ * SH_GROW_MAX_DIB / SH_GROW_MAX_MOVE.
626
+ */
627
+ if (unlikely(tb->members >= tb->grow_threshold))
628
+ {
629
+ if (unlikely(tb->size == SH_MAX_SIZE))
630
+ sh_error("hash table size exceeded");
631
+
632
+ /*
633
+ * When optimizing, it can be very useful to print these out.
634
+ */
635
+ /* SH_STAT(tb); */
636
+ SH_GROW(tb, tb->size * 2);
637
+ /* SH_STAT(tb); */
638
+ }
639
+
640
+ /* perform insert, start bucket search at optimal location */
641
+ data = tb->data;
642
+ startelem = SH_INITIAL_BUCKET(tb, hash);
643
+ curelem = startelem;
644
+ while (true)
645
+ {
646
+ uint32 curdist;
647
+ uint32 curhash;
648
+ uint32 curoptimal;
649
+ SH_ELEMENT_TYPE *entry = &data[curelem];
650
+
651
+ /* any empty bucket can directly be used */
652
+ if (entry->status == SH_STATUS_EMPTY)
653
+ {
654
+ tb->members++;
655
+ entry->SH_KEY = key;
656
+ #ifdef SH_STORE_HASH
657
+ SH_GET_HASH(tb, entry) = hash;
658
+ #endif
659
+ entry->status = SH_STATUS_IN_USE;
660
+ *found = false;
661
+ return entry;
662
+ }
663
+
664
+ /*
665
+ * If the bucket is not empty, we either found a match (in which case
666
+ * we're done), or we have to decide whether to skip over or move the
667
+ * colliding entry. When the colliding element's distance to its
668
+ * optimal position is smaller than the to-be-inserted entry's, we
669
+ * shift the colliding entry (and its followers) forward by one.
670
+ */
671
+
672
+ if (SH_COMPARE_KEYS(tb, hash, key, entry))
673
+ {
674
+ Assert(entry->status == SH_STATUS_IN_USE);
675
+ *found = true;
676
+ return entry;
677
+ }
678
+
679
+ curhash = SH_ENTRY_HASH(tb, entry);
680
+ curoptimal = SH_INITIAL_BUCKET(tb, curhash);
681
+ curdist = SH_DISTANCE_FROM_OPTIMAL(tb, curoptimal, curelem);
682
+
683
+ if (insertdist > curdist)
684
+ {
685
+ SH_ELEMENT_TYPE *lastentry = entry;
686
+ uint32 emptyelem = curelem;
687
+ uint32 moveelem;
688
+ int32 emptydist = 0;
689
+
690
+ /* find next empty bucket */
691
+ while (true)
692
+ {
693
+ SH_ELEMENT_TYPE *emptyentry;
694
+
695
+ emptyelem = SH_NEXT(tb, emptyelem, startelem);
696
+ emptyentry = &data[emptyelem];
697
+
698
+ if (emptyentry->status == SH_STATUS_EMPTY)
699
+ {
700
+ lastentry = emptyentry;
701
+ break;
702
+ }
703
+
704
+ /*
705
+ * To avoid negative consequences from overly imbalanced
706
+ * hashtables, grow the hashtable if collisions would require
707
+ * us to move a lot of entries. The most likely cause of such
708
+ * imbalance is filling a (currently) small table, from a
709
+ * currently big one, in hash-table order. Don't grow if the
710
+ * hashtable would be too empty, to prevent quick space
711
+ * explosion for some weird edge cases.
712
+ */
713
+ if (unlikely(++emptydist > SH_GROW_MAX_MOVE) &&
714
+ ((double) tb->members / tb->size) >= SH_GROW_MIN_FILLFACTOR)
715
+ {
716
+ tb->grow_threshold = 0;
717
+ goto restart;
718
+ }
719
+ }
720
+
721
+ /* shift forward, starting at last occupied element */
722
+
723
+ /*
724
+ * TODO: This could be optimized to be one memcpy in many cases,
725
+ * excepting wrapping around at the end of ->data. Hasn't shown up
726
+ * in profiles so far though.
727
+ */
728
+ moveelem = emptyelem;
729
+ while (moveelem != curelem)
730
+ {
731
+ SH_ELEMENT_TYPE *moveentry;
732
+
733
+ moveelem = SH_PREV(tb, moveelem, startelem);
734
+ moveentry = &data[moveelem];
735
+
736
+ memcpy(lastentry, moveentry, sizeof(SH_ELEMENT_TYPE));
737
+ lastentry = moveentry;
738
+ }
739
+
740
+ /* and fill the now empty spot */
741
+ tb->members++;
742
+
743
+ entry->SH_KEY = key;
744
+ #ifdef SH_STORE_HASH
745
+ SH_GET_HASH(tb, entry) = hash;
746
+ #endif
747
+ entry->status = SH_STATUS_IN_USE;
748
+ *found = false;
749
+ return entry;
750
+ }
751
+
752
+ curelem = SH_NEXT(tb, curelem, startelem);
753
+ insertdist++;
754
+
755
+ /*
756
+ * To avoid negative consequences from overly imbalanced hashtables,
757
+ * grow the hashtable if collisions lead to large runs. The most
758
+ * likely cause of such imbalance is filling a (currently) small
759
+ * table, from a currently big one, in hash-table order. Don't grow
760
+ * if the hashtable would be too empty, to prevent quick space
761
+ * explosion for some weird edge cases.
762
+ */
763
+ if (unlikely(insertdist > SH_GROW_MAX_DIB) &&
764
+ ((double) tb->members / tb->size) >= SH_GROW_MIN_FILLFACTOR)
765
+ {
766
+ tb->grow_threshold = 0;
767
+ goto restart;
768
+ }
769
+ }
770
+ }
771
+
772
+ /*
773
+ * Insert the key into the hash-table, set *found to true if the key already
774
+ * exists, false otherwise. Returns the hash-table entry in either case.
775
+ */
776
+ SH_SCOPE SH_ELEMENT_TYPE *
777
+ SH_INSERT(SH_TYPE * tb, SH_KEY_TYPE key, bool *found)
778
+ {
779
+ uint32 hash = SH_HASH_KEY(tb, key);
780
+
781
+ return SH_INSERT_HASH_INTERNAL(tb, key, hash, found);
782
+ }
783
+
784
+ /*
785
+ * Insert the key into the hash-table using an already-calculated hash. Set
786
+ * *found to true if the key already exists, false otherwise. Returns the
787
+ * hash-table entry in either case.
788
+ */
789
+ SH_SCOPE SH_ELEMENT_TYPE *
790
+ SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash, bool *found)
791
+ {
792
+ return SH_INSERT_HASH_INTERNAL(tb, key, hash, found);
793
+ }
794
+
795
+ /*
796
+ * This is a separate static inline function, so it can be reliably be inlined
797
+ * into its wrapper functions even if SH_SCOPE is extern.
798
+ */
799
+ static inline SH_ELEMENT_TYPE *
800
+ SH_LOOKUP_HASH_INTERNAL(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash)
801
+ {
802
+ const uint32 startelem = SH_INITIAL_BUCKET(tb, hash);
803
+ uint32 curelem = startelem;
804
+
805
+ while (true)
806
+ {
807
+ SH_ELEMENT_TYPE *entry = &tb->data[curelem];
808
+
809
+ if (entry->status == SH_STATUS_EMPTY)
810
+ {
811
+ return NULL;
812
+ }
813
+
814
+ Assert(entry->status == SH_STATUS_IN_USE);
815
+
816
+ if (SH_COMPARE_KEYS(tb, hash, key, entry))
817
+ return entry;
818
+
819
+ /*
820
+ * TODO: we could stop search based on distance. If the current
821
+ * buckets's distance-from-optimal is smaller than what we've skipped
822
+ * already, the entry doesn't exist. Probably only do so if
823
+ * SH_STORE_HASH is defined, to avoid re-computing hashes?
824
+ */
825
+
826
+ curelem = SH_NEXT(tb, curelem, startelem);
827
+ }
828
+ }
829
+
830
+ /*
831
+ * Lookup entry in hash table. Returns NULL if key not present.
832
+ */
833
+ SH_SCOPE SH_ELEMENT_TYPE *
834
+ SH_LOOKUP(SH_TYPE * tb, SH_KEY_TYPE key)
835
+ {
836
+ uint32 hash = SH_HASH_KEY(tb, key);
837
+
838
+ return SH_LOOKUP_HASH_INTERNAL(tb, key, hash);
839
+ }
840
+
841
+ /*
842
+ * Lookup entry in hash table using an already-calculated hash.
843
+ *
844
+ * Returns NULL if key not present.
845
+ */
846
+ SH_SCOPE SH_ELEMENT_TYPE *
847
+ SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash)
848
+ {
849
+ return SH_LOOKUP_HASH_INTERNAL(tb, key, hash);
850
+ }
851
+
852
+ /*
853
+ * Delete entry from hash table by key. Returns whether to-be-deleted key was
854
+ * present.
855
+ */
856
+ SH_SCOPE bool
857
+ SH_DELETE(SH_TYPE * tb, SH_KEY_TYPE key)
858
+ {
859
+ uint32 hash = SH_HASH_KEY(tb, key);
860
+ uint32 startelem = SH_INITIAL_BUCKET(tb, hash);
861
+ uint32 curelem = startelem;
862
+
863
+ while (true)
864
+ {
865
+ SH_ELEMENT_TYPE *entry = &tb->data[curelem];
866
+
867
+ if (entry->status == SH_STATUS_EMPTY)
868
+ return false;
869
+
870
+ if (entry->status == SH_STATUS_IN_USE &&
871
+ SH_COMPARE_KEYS(tb, hash, key, entry))
872
+ {
873
+ SH_ELEMENT_TYPE *lastentry = entry;
874
+
875
+ tb->members--;
876
+
877
+ /*
878
+ * Backward shift following elements till either an empty element
879
+ * or an element at its optimal position is encountered.
880
+ *
881
+ * While that sounds expensive, the average chain length is short,
882
+ * and deletions would otherwise require tombstones.
883
+ */
884
+ while (true)
885
+ {
886
+ SH_ELEMENT_TYPE *curentry;
887
+ uint32 curhash;
888
+ uint32 curoptimal;
889
+
890
+ curelem = SH_NEXT(tb, curelem, startelem);
891
+ curentry = &tb->data[curelem];
892
+
893
+ if (curentry->status != SH_STATUS_IN_USE)
894
+ {
895
+ lastentry->status = SH_STATUS_EMPTY;
896
+ break;
897
+ }
898
+
899
+ curhash = SH_ENTRY_HASH(tb, curentry);
900
+ curoptimal = SH_INITIAL_BUCKET(tb, curhash);
901
+
902
+ /* current is at optimal position, done */
903
+ if (curoptimal == curelem)
904
+ {
905
+ lastentry->status = SH_STATUS_EMPTY;
906
+ break;
907
+ }
908
+
909
+ /* shift */
910
+ memcpy(lastentry, curentry, sizeof(SH_ELEMENT_TYPE));
911
+
912
+ lastentry = curentry;
913
+ }
914
+
915
+ return true;
916
+ }
917
+
918
+ /* TODO: return false; if distance too big */
919
+
920
+ curelem = SH_NEXT(tb, curelem, startelem);
921
+ }
922
+ }
923
+
924
+ /*
925
+ * Delete entry from hash table by entry pointer
926
+ */
927
+ SH_SCOPE void
928
+ SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry)
929
+ {
930
+ SH_ELEMENT_TYPE *lastentry = entry;
931
+ uint32 hash = SH_ENTRY_HASH(tb, entry);
932
+ uint32 startelem = SH_INITIAL_BUCKET(tb, hash);
933
+ uint32 curelem;
934
+
935
+ /* Calculate the index of 'entry' */
936
+ curelem = entry - &tb->data[0];
937
+
938
+ tb->members--;
939
+
940
+ /*
941
+ * Backward shift following elements till either an empty element or an
942
+ * element at its optimal position is encountered.
943
+ *
944
+ * While that sounds expensive, the average chain length is short, and
945
+ * deletions would otherwise require tombstones.
946
+ */
947
+ while (true)
948
+ {
949
+ SH_ELEMENT_TYPE *curentry;
950
+ uint32 curhash;
951
+ uint32 curoptimal;
952
+
953
+ curelem = SH_NEXT(tb, curelem, startelem);
954
+ curentry = &tb->data[curelem];
955
+
956
+ if (curentry->status != SH_STATUS_IN_USE)
957
+ {
958
+ lastentry->status = SH_STATUS_EMPTY;
959
+ break;
960
+ }
961
+
962
+ curhash = SH_ENTRY_HASH(tb, curentry);
963
+ curoptimal = SH_INITIAL_BUCKET(tb, curhash);
964
+
965
+ /* current is at optimal position, done */
966
+ if (curoptimal == curelem)
967
+ {
968
+ lastentry->status = SH_STATUS_EMPTY;
969
+ break;
970
+ }
971
+
972
+ /* shift */
973
+ memcpy(lastentry, curentry, sizeof(SH_ELEMENT_TYPE));
974
+
975
+ lastentry = curentry;
976
+ }
977
+ }
978
+
979
+ /*
980
+ * Initialize iterator.
981
+ */
982
+ SH_SCOPE void
983
+ SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter)
984
+ {
985
+ uint64 startelem = PG_UINT64_MAX;
986
+
987
+ /*
988
+ * Search for the first empty element. As deletions during iterations are
989
+ * supported, we want to start/end at an element that cannot be affected
990
+ * by elements being shifted.
991
+ */
992
+ for (uint32 i = 0; i < tb->size; i++)
993
+ {
994
+ SH_ELEMENT_TYPE *entry = &tb->data[i];
995
+
996
+ if (entry->status != SH_STATUS_IN_USE)
997
+ {
998
+ startelem = i;
999
+ break;
1000
+ }
1001
+ }
1002
+
1003
+ /* we should have found an empty element */
1004
+ Assert(startelem < SH_MAX_SIZE);
1005
+
1006
+ /*
1007
+ * Iterate backwards, that allows the current element to be deleted, even
1008
+ * if there are backward shifts
1009
+ */
1010
+ iter->cur = startelem;
1011
+ iter->end = iter->cur;
1012
+ iter->done = false;
1013
+ }
1014
+
1015
+ /*
1016
+ * Initialize iterator to a specific bucket. That's really only useful for
1017
+ * cases where callers are partially iterating over the hashspace, and that
1018
+ * iteration deletes and inserts elements based on visited entries. Doing that
1019
+ * repeatedly could lead to an unbalanced keyspace when always starting at the
1020
+ * same position.
1021
+ */
1022
+ SH_SCOPE void
1023
+ SH_START_ITERATE_AT(SH_TYPE * tb, SH_ITERATOR * iter, uint32 at)
1024
+ {
1025
+ /*
1026
+ * Iterate backwards, that allows the current element to be deleted, even
1027
+ * if there are backward shifts.
1028
+ */
1029
+ iter->cur = at & tb->sizemask; /* ensure at is within a valid range */
1030
+ iter->end = iter->cur;
1031
+ iter->done = false;
1032
+ }
1033
+
1034
+ /*
1035
+ * Iterate over all entries in the hash-table. Return the next occupied entry,
1036
+ * or NULL if done.
1037
+ *
1038
+ * During iteration the current entry in the hash table may be deleted,
1039
+ * without leading to elements being skipped or returned twice. Additionally
1040
+ * the rest of the table may be modified (i.e. there can be insertions or
1041
+ * deletions), but if so, there's neither a guarantee that all nodes are
1042
+ * visited at least once, nor a guarantee that a node is visited at most once.
1043
+ */
1044
+ SH_SCOPE SH_ELEMENT_TYPE *
1045
+ SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter)
1046
+ {
1047
+ while (!iter->done)
1048
+ {
1049
+ SH_ELEMENT_TYPE *elem;
1050
+
1051
+ elem = &tb->data[iter->cur];
1052
+
1053
+ /* next element in backward direction */
1054
+ iter->cur = (iter->cur - 1) & tb->sizemask;
1055
+
1056
+ if ((iter->cur & tb->sizemask) == (iter->end & tb->sizemask))
1057
+ iter->done = true;
1058
+ if (elem->status == SH_STATUS_IN_USE)
1059
+ {
1060
+ return elem;
1061
+ }
1062
+ }
1063
+
1064
+ return NULL;
1065
+ }
1066
+
1067
+ /*
1068
+ * Report some statistics about the state of the hashtable. For
1069
+ * debugging/profiling purposes only.
1070
+ */
1071
+ SH_SCOPE void
1072
+ SH_STAT(SH_TYPE * tb)
1073
+ {
1074
+ uint32 max_chain_length = 0;
1075
+ uint32 total_chain_length = 0;
1076
+ double avg_chain_length;
1077
+ double fillfactor;
1078
+ uint32 i;
1079
+
1080
+ uint32 *collisions = (uint32 *) palloc0(tb->size * sizeof(uint32));
1081
+ uint32 total_collisions = 0;
1082
+ uint32 max_collisions = 0;
1083
+ double avg_collisions;
1084
+
1085
+ for (i = 0; i < tb->size; i++)
1086
+ {
1087
+ uint32 hash;
1088
+ uint32 optimal;
1089
+ uint32 dist;
1090
+ SH_ELEMENT_TYPE *elem;
1091
+
1092
+ elem = &tb->data[i];
1093
+
1094
+ if (elem->status != SH_STATUS_IN_USE)
1095
+ continue;
1096
+
1097
+ hash = SH_ENTRY_HASH(tb, elem);
1098
+ optimal = SH_INITIAL_BUCKET(tb, hash);
1099
+ dist = SH_DISTANCE_FROM_OPTIMAL(tb, optimal, i);
1100
+
1101
+ if (dist > max_chain_length)
1102
+ max_chain_length = dist;
1103
+ total_chain_length += dist;
1104
+
1105
+ collisions[optimal]++;
1106
+ }
1107
+
1108
+ for (i = 0; i < tb->size; i++)
1109
+ {
1110
+ uint32 curcoll = collisions[i];
1111
+
1112
+ if (curcoll == 0)
1113
+ continue;
1114
+
1115
+ /* single contained element is not a collision */
1116
+ curcoll--;
1117
+ total_collisions += curcoll;
1118
+ if (curcoll > max_collisions)
1119
+ max_collisions = curcoll;
1120
+ }
1121
+
1122
+ /* large enough to be worth freeing, even if just used for debugging */
1123
+ pfree(collisions);
1124
+
1125
+ if (tb->members > 0)
1126
+ {
1127
+ fillfactor = tb->members / ((double) tb->size);
1128
+ avg_chain_length = ((double) total_chain_length) / tb->members;
1129
+ avg_collisions = ((double) total_collisions) / tb->members;
1130
+ }
1131
+ else
1132
+ {
1133
+ fillfactor = 0;
1134
+ avg_chain_length = 0;
1135
+ avg_collisions = 0;
1136
+ }
1137
+
1138
+ sh_log("size: " UINT64_FORMAT ", members: %u, filled: %f, total chain: %u, max chain: %u, avg chain: %f, total_collisions: %u, max_collisions: %u, avg_collisions: %f",
1139
+ tb->size, tb->members, fillfactor, total_chain_length, max_chain_length, avg_chain_length,
1140
+ total_collisions, max_collisions, avg_collisions);
1141
+ }
1142
+
1143
+ #endif /* SH_DEFINE */
1144
+
1145
+
1146
+ /* undefine external parameters, so next hash table can be defined */
1147
+ #undef SH_PREFIX
1148
+ #undef SH_KEY_TYPE
1149
+ #undef SH_KEY
1150
+ #undef SH_ELEMENT_TYPE
1151
+ #undef SH_HASH_KEY
1152
+ #undef SH_SCOPE
1153
+ #undef SH_DECLARE
1154
+ #undef SH_DEFINE
1155
+ #undef SH_GET_HASH
1156
+ #undef SH_STORE_HASH
1157
+ #undef SH_USE_NONDEFAULT_ALLOCATOR
1158
+ #undef SH_EQUAL
1159
+
1160
+ /* undefine locally declared macros */
1161
+ #undef SH_MAKE_PREFIX
1162
+ #undef SH_MAKE_NAME
1163
+ #undef SH_MAKE_NAME_
1164
+ #undef SH_FILLFACTOR
1165
+ #undef SH_MAX_FILLFACTOR
1166
+ #undef SH_GROW_MAX_DIB
1167
+ #undef SH_GROW_MAX_MOVE
1168
+ #undef SH_GROW_MIN_FILLFACTOR
1169
+ #undef SH_MAX_SIZE
1170
+
1171
+ /* types */
1172
+ #undef SH_TYPE
1173
+ #undef SH_STATUS
1174
+ #undef SH_STATUS_EMPTY
1175
+ #undef SH_STATUS_IN_USE
1176
+ #undef SH_ITERATOR
1177
+
1178
+ /* external function names */
1179
+ #undef SH_CREATE
1180
+ #undef SH_DESTROY
1181
+ #undef SH_RESET
1182
+ #undef SH_INSERT
1183
+ #undef SH_INSERT_HASH
1184
+ #undef SH_DELETE_ITEM
1185
+ #undef SH_DELETE
1186
+ #undef SH_LOOKUP
1187
+ #undef SH_LOOKUP_HASH
1188
+ #undef SH_GROW
1189
+ #undef SH_START_ITERATE
1190
+ #undef SH_START_ITERATE_AT
1191
+ #undef SH_ITERATE
1192
+ #undef SH_ALLOCATE
1193
+ #undef SH_FREE
1194
+ #undef SH_STAT
1195
+
1196
+ /* internal function names */
1197
+ #undef SH_COMPUTE_SIZE
1198
+ #undef SH_UPDATE_PARAMETERS
1199
+ #undef SH_COMPARE_KEYS
1200
+ #undef SH_INITIAL_BUCKET
1201
+ #undef SH_NEXT
1202
+ #undef SH_PREV
1203
+ #undef SH_DISTANCE_FROM_OPTIMAL
1204
+ #undef SH_ENTRY_HASH
1205
+ #undef SH_INSERT_HASH_INTERNAL
1206
+ #undef SH_LOOKUP_HASH_INTERNAL