pg_query 5.0.0 → 6.0.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 (898) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/README.md +1 -1
  4. data/Rakefile +3 -4
  5. data/ext/pg_query/extconf.rb +14 -4
  6. data/ext/pg_query/include/pg_query.h +4 -3
  7. data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
  8. data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
  9. data/ext/pg_query/include/pg_query_fingerprint_defs.c +2901 -1794
  10. data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
  11. data/ext/pg_query/include/pg_query_outfuncs_defs.c +211 -24
  12. data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
  13. data/ext/pg_query/include/pg_query_readfuncs_defs.c +272 -53
  14. data/ext/pg_query/include/postgres/access/amapi.h +299 -0
  15. data/ext/pg_query/include/postgres/access/attmap.h +54 -0
  16. data/ext/pg_query/include/postgres/access/attnum.h +64 -0
  17. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  18. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  19. data/ext/pg_query/include/postgres/access/clog.h +62 -0
  20. data/ext/pg_query/include/postgres/access/commit_ts.h +73 -0
  21. data/ext/pg_query/include/postgres/access/detoast.h +82 -0
  22. data/ext/pg_query/include/postgres/access/genam.h +237 -0
  23. data/ext/pg_query/include/postgres/access/gin.h +91 -0
  24. data/ext/pg_query/include/postgres/access/htup.h +89 -0
  25. data/ext/pg_query/include/postgres/access/htup_details.h +811 -0
  26. data/ext/pg_query/include/postgres/access/itup.h +170 -0
  27. data/ext/pg_query/include/postgres/access/parallel.h +81 -0
  28. data/ext/pg_query/include/postgres/access/printtup.h +35 -0
  29. data/ext/pg_query/include/postgres/access/relation.h +28 -0
  30. data/ext/pg_query/include/postgres/access/relscan.h +191 -0
  31. data/ext/pg_query/include/postgres/access/rmgrlist.h +49 -0
  32. data/ext/pg_query/include/postgres/access/sdir.h +67 -0
  33. data/ext/pg_query/include/postgres/access/skey.h +151 -0
  34. data/ext/pg_query/include/postgres/access/slru.h +221 -0
  35. data/ext/pg_query/include/postgres/access/stratnum.h +85 -0
  36. data/ext/pg_query/include/postgres/access/sysattr.h +29 -0
  37. data/ext/pg_query/include/postgres/access/table.h +28 -0
  38. data/ext/pg_query/include/postgres/access/tableam.h +2109 -0
  39. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  40. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  41. data/ext/pg_query/include/postgres/access/transam.h +375 -0
  42. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  43. data/ext/pg_query/include/postgres/access/tupconvert.h +54 -0
  44. data/ext/pg_query/include/postgres/access/tupdesc.h +154 -0
  45. data/ext/pg_query/include/postgres/access/tupmacs.h +207 -0
  46. data/ext/pg_query/include/postgres/access/twophase.h +65 -0
  47. data/ext/pg_query/include/postgres/access/xact.h +530 -0
  48. data/ext/pg_query/include/postgres/access/xlog.h +310 -0
  49. data/ext/pg_query/include/postgres/access/xlog_internal.h +405 -0
  50. data/ext/pg_query/include/postgres/access/xlogbackup.h +43 -0
  51. data/ext/pg_query/include/postgres/access/xlogdefs.h +82 -0
  52. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  53. data/ext/pg_query/include/postgres/access/xlogreader.h +444 -0
  54. data/ext/pg_query/include/postgres/access/xlogrecord.h +248 -0
  55. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  56. data/ext/pg_query/include/postgres/archive/archive_module.h +67 -0
  57. data/ext/pg_query/include/postgres/c.h +1374 -0
  58. data/ext/pg_query/include/postgres/catalog/catalog.h +47 -0
  59. data/ext/pg_query/include/postgres/catalog/catversion.h +62 -0
  60. data/ext/pg_query/include/postgres/catalog/dependency.h +228 -0
  61. data/ext/pg_query/include/postgres/catalog/genbki.h +149 -0
  62. data/ext/pg_query/include/postgres/catalog/index.h +218 -0
  63. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  64. data/ext/pg_query/include/postgres/catalog/namespace.h +189 -0
  65. data/ext/pg_query/include/postgres/catalog/objectaccess.h +267 -0
  66. data/ext/pg_query/include/postgres/catalog/objectaddress.h +89 -0
  67. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +182 -0
  68. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +78 -0
  69. data/ext/pg_query/include/postgres/catalog/pg_am.h +66 -0
  70. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +47 -0
  71. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +240 -0
  72. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +62 -0
  73. data/ext/pg_query/include/postgres/catalog/pg_authid.h +66 -0
  74. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +60 -0
  75. data/ext/pg_query/include/postgres/catalog/pg_class.h +235 -0
  76. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +134 -0
  77. data/ext/pg_query/include/postgres/catalog/pg_collation.h +106 -0
  78. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +66 -0
  79. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +278 -0
  80. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +74 -0
  81. data/ext/pg_query/include/postgres/catalog/pg_control.h +260 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +79 -0
  83. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +38 -0
  84. data/ext/pg_query/include/postgres/catalog/pg_database.h +129 -0
  85. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +53 -0
  86. data/ext/pg_query/include/postgres/catalog/pg_depend.h +77 -0
  87. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +36 -0
  88. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +60 -0
  89. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +36 -0
  90. data/ext/pg_query/include/postgres/catalog/pg_index.h +92 -0
  91. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +59 -0
  92. data/ext/pg_query/include/postgres/catalog/pg_language.h +75 -0
  93. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +41 -0
  94. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +67 -0
  95. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +36 -0
  96. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +91 -0
  97. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +51 -0
  98. data/ext/pg_query/include/postgres/catalog/pg_operator.h +124 -0
  99. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +142 -0
  100. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +67 -0
  101. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +51 -0
  102. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +76 -0
  103. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +36 -0
  104. data/ext/pg_query/include/postgres/catalog/pg_proc.h +223 -0
  105. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +101 -0
  106. data/ext/pg_query/include/postgres/catalog/pg_publication.h +161 -0
  107. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +38 -0
  108. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +65 -0
  109. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +33 -0
  110. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +288 -0
  111. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +199 -0
  112. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +91 -0
  113. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +45 -0
  114. data/ext/pg_query/include/postgres/catalog/pg_transform.h +51 -0
  115. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +34 -0
  116. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +153 -0
  117. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +109 -0
  118. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +56 -0
  119. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +34 -0
  120. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +62 -0
  121. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +35 -0
  122. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +63 -0
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +37 -0
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +54 -0
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +34 -0
  126. data/ext/pg_query/include/postgres/catalog/pg_type.h +407 -0
  127. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +324 -0
  128. data/ext/pg_query/include/postgres/catalog/storage.h +50 -0
  129. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  130. data/ext/pg_query/include/postgres/commands/async.h +49 -0
  131. data/ext/pg_query/include/postgres/commands/dbcommands.h +37 -0
  132. data/ext/pg_query/include/postgres/commands/defrem.h +161 -0
  133. data/ext/pg_query/include/postgres/commands/event_trigger.h +91 -0
  134. data/ext/pg_query/include/postgres/commands/explain.h +145 -0
  135. data/ext/pg_query/include/postgres/commands/prepare.h +61 -0
  136. data/ext/pg_query/include/postgres/commands/tablespace.h +69 -0
  137. data/ext/pg_query/include/postgres/commands/trigger.h +288 -0
  138. data/ext/pg_query/include/postgres/commands/vacuum.h +388 -0
  139. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  140. data/ext/pg_query/include/postgres/common/file_perm.h +56 -0
  141. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  142. data/ext/pg_query/include/postgres/common/hashfn.h +119 -0
  143. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +453 -0
  144. data/ext/pg_query/include/postgres/common/int.h +512 -0
  145. data/ext/pg_query/include/postgres/common/keywords.h +29 -0
  146. data/ext/pg_query/include/postgres/common/kwlookup.h +44 -0
  147. data/ext/pg_query/include/postgres/common/pg_prng.h +62 -0
  148. data/ext/pg_query/include/postgres/common/relpath.h +97 -0
  149. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  150. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  151. data/ext/pg_query/include/postgres/common/string.h +44 -0
  152. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +124 -0
  153. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5261 -0
  154. data/ext/pg_query/include/postgres/copyfuncs.switch.c +989 -0
  155. data/ext/pg_query/include/postgres/datatype/timestamp.h +269 -0
  156. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3310 -0
  157. data/ext/pg_query/include/postgres/equalfuncs.switch.c +836 -0
  158. data/ext/pg_query/include/postgres/executor/execdesc.h +70 -0
  159. data/ext/pg_query/include/postgres/executor/executor.h +681 -0
  160. data/ext/pg_query/include/postgres/executor/functions.h +56 -0
  161. data/ext/pg_query/include/postgres/executor/instrument.h +120 -0
  162. data/ext/pg_query/include/postgres/executor/spi.h +207 -0
  163. data/ext/pg_query/include/postgres/executor/tablefunc.h +67 -0
  164. data/ext/pg_query/include/postgres/executor/tuptable.h +523 -0
  165. data/ext/pg_query/include/postgres/fmgr.h +800 -0
  166. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  167. data/ext/pg_query/include/postgres/funcapi.h +360 -0
  168. data/ext/pg_query/include/postgres/gram.h +1168 -0
  169. data/ext/pg_query/include/postgres/gramparse.h +75 -0
  170. data/ext/pg_query/include/postgres/jit/jit.h +106 -0
  171. data/ext/pg_query/include/postgres/kwlist_d.h +1164 -0
  172. data/ext/pg_query/include/postgres/lib/dshash.h +130 -0
  173. data/ext/pg_query/include/postgres/lib/ilist.h +1159 -0
  174. data/ext/pg_query/include/postgres/lib/pairingheap.h +102 -0
  175. data/ext/pg_query/include/postgres/lib/simplehash.h +1206 -0
  176. data/ext/pg_query/include/postgres/lib/sort_template.h +445 -0
  177. data/ext/pg_query/include/postgres/lib/stringinfo.h +243 -0
  178. data/ext/pg_query/include/postgres/libpq/auth.h +37 -0
  179. data/ext/pg_query/include/postgres/libpq/crypt.h +47 -0
  180. data/ext/pg_query/include/postgres/libpq/hba.h +186 -0
  181. data/ext/pg_query/include/postgres/libpq/libpq-be.h +358 -0
  182. data/ext/pg_query/include/postgres/libpq/libpq.h +143 -0
  183. data/ext/pg_query/include/postgres/libpq/pqcomm.h +169 -0
  184. data/ext/pg_query/include/postgres/libpq/pqformat.h +209 -0
  185. data/ext/pg_query/include/postgres/libpq/pqsignal.h +54 -0
  186. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  187. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  188. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  189. data/ext/pg_query/include/postgres/mb/pg_wchar.h +792 -0
  190. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +24 -0
  191. data/ext/pg_query/include/postgres/miscadmin.h +519 -0
  192. data/ext/pg_query/include/postgres/nodes/bitmapset.h +140 -0
  193. data/ext/pg_query/include/postgres/nodes/execnodes.h +2852 -0
  194. data/ext/pg_query/include/postgres/nodes/extensible.h +164 -0
  195. data/ext/pg_query/include/postgres/nodes/lockoptions.h +61 -0
  196. data/ext/pg_query/include/postgres/nodes/makefuncs.h +127 -0
  197. data/ext/pg_query/include/postgres/nodes/memnodes.h +152 -0
  198. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  199. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +222 -0
  200. data/ext/pg_query/include/postgres/nodes/nodes.h +435 -0
  201. data/ext/pg_query/include/postgres/nodes/nodetags.h +491 -0
  202. data/ext/pg_query/include/postgres/nodes/params.h +170 -0
  203. data/ext/pg_query/include/postgres/nodes/parsenodes.h +4233 -0
  204. data/ext/pg_query/include/postgres/nodes/pathnodes.h +3435 -0
  205. data/ext/pg_query/include/postgres/nodes/pg_list.h +686 -0
  206. data/ext/pg_query/include/postgres/nodes/plannodes.h +1593 -0
  207. data/ext/pg_query/include/postgres/nodes/primnodes.h +2335 -0
  208. data/ext/pg_query/include/postgres/nodes/print.h +34 -0
  209. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  210. data/ext/pg_query/include/postgres/nodes/replnodes.h +132 -0
  211. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  212. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +75 -0
  213. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  214. data/ext/pg_query/include/postgres/optimizer/cost.h +216 -0
  215. data/ext/pg_query/include/postgres/optimizer/geqo.h +90 -0
  216. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +45 -0
  217. data/ext/pg_query/include/postgres/optimizer/optimizer.h +205 -0
  218. data/ext/pg_query/include/postgres/optimizer/paths.h +271 -0
  219. data/ext/pg_query/include/postgres/optimizer/planmain.h +123 -0
  220. data/ext/pg_query/include/postgres/parser/analyze.h +66 -0
  221. data/ext/pg_query/include/postgres/parser/kwlist.h +518 -0
  222. data/ext/pg_query/include/postgres/parser/parse_agg.h +65 -0
  223. data/ext/pg_query/include/postgres/parser/parse_coerce.h +102 -0
  224. data/ext/pg_query/include/postgres/parser/parse_expr.h +25 -0
  225. data/ext/pg_query/include/postgres/parser/parse_func.h +74 -0
  226. data/ext/pg_query/include/postgres/parser/parse_node.h +358 -0
  227. data/ext/pg_query/include/postgres/parser/parse_oper.h +68 -0
  228. data/ext/pg_query/include/postgres/parser/parse_relation.h +129 -0
  229. data/ext/pg_query/include/postgres/parser/parse_type.h +61 -0
  230. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  231. data/ext/pg_query/include/postgres/parser/parsetree.h +61 -0
  232. data/ext/pg_query/include/postgres/parser/scanner.h +152 -0
  233. data/ext/pg_query/include/postgres/parser/scansup.h +27 -0
  234. data/ext/pg_query/include/postgres/partitioning/partdefs.h +26 -0
  235. data/ext/pg_query/include/postgres/pg_config.h +977 -0
  236. data/ext/pg_query/include/postgres/pg_config_manual.h +385 -0
  237. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  238. data/ext/pg_query/include/postgres/pg_getopt.h +56 -0
  239. data/ext/pg_query/include/postgres/pg_trace.h +17 -0
  240. data/ext/pg_query/include/postgres/pgstat.h +780 -0
  241. data/ext/pg_query/include/postgres/pgtime.h +94 -0
  242. data/ext/pg_query/include/postgres/pl_gram.h +385 -0
  243. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +52 -0
  244. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +114 -0
  245. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +112 -0
  246. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +246 -0
  247. data/ext/pg_query/include/postgres/plerrcodes.h +998 -0
  248. data/ext/pg_query/include/postgres/plpgsql.h +1342 -0
  249. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +32 -0
  250. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  251. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +256 -0
  252. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +254 -0
  253. data/ext/pg_query/include/postgres/port/atomics/fallback.h +170 -0
  254. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +323 -0
  255. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +119 -0
  256. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +121 -0
  257. data/ext/pg_query/include/postgres/port/atomics/generic.h +437 -0
  258. data/ext/pg_query/include/postgres/port/atomics.h +606 -0
  259. data/ext/pg_query/include/postgres/port/pg_bitutils.h +421 -0
  260. data/ext/pg_query/include/postgres/port/pg_bswap.h +161 -0
  261. data/ext/pg_query/include/postgres/port/pg_crc32c.h +110 -0
  262. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  263. data/ext/pg_query/include/postgres/port/simd.h +422 -0
  264. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  265. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  266. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  267. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  268. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  269. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  270. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  271. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  272. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  273. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +34 -0
  274. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  275. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  276. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  277. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  278. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  279. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  280. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  281. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  282. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  283. data/ext/pg_query/include/postgres/port/win32_port.h +584 -0
  284. data/ext/pg_query/include/postgres/port.h +524 -0
  285. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  286. data/ext/pg_query/include/postgres/postgres.h +579 -0
  287. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +69 -0
  288. data/ext/pg_query/include/postgres/postmaster/bgworker.h +164 -0
  289. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +60 -0
  290. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +45 -0
  291. data/ext/pg_query/include/postgres/postmaster/interrupt.h +32 -0
  292. data/ext/pg_query/include/postgres/postmaster/pgarch.h +36 -0
  293. data/ext/pg_query/include/postgres/postmaster/postmaster.h +101 -0
  294. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  295. data/ext/pg_query/include/postgres/postmaster/syslogger.h +101 -0
  296. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  297. data/ext/pg_query/include/postgres/postmaster/walwriter.h +23 -0
  298. data/ext/pg_query/include/postgres/regex/regex.h +272 -0
  299. data/ext/pg_query/include/postgres/replication/logicallauncher.h +34 -0
  300. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  301. data/ext/pg_query/include/postgres/replication/logicalworker.h +33 -0
  302. data/ext/pg_query/include/postgres/replication/origin.h +73 -0
  303. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +743 -0
  304. data/ext/pg_query/include/postgres/replication/slot.h +285 -0
  305. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  306. data/ext/pg_query/include/postgres/replication/syncrep.h +109 -0
  307. data/ext/pg_query/include/postgres/replication/walreceiver.h +504 -0
  308. data/ext/pg_query/include/postgres/replication/walsender.h +76 -0
  309. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +46 -0
  310. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +41 -0
  311. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +96 -0
  312. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +26 -0
  313. data/ext/pg_query/include/postgres/storage/block.h +108 -0
  314. data/ext/pg_query/include/postgres/storage/buf.h +46 -0
  315. data/ext/pg_query/include/postgres/storage/bufmgr.h +411 -0
  316. data/ext/pg_query/include/postgres/storage/bufpage.h +510 -0
  317. data/ext/pg_query/include/postgres/storage/condition_variable.h +73 -0
  318. data/ext/pg_query/include/postgres/storage/dsm.h +61 -0
  319. data/ext/pg_query/include/postgres/storage/dsm_impl.h +79 -0
  320. data/ext/pg_query/include/postgres/storage/fd.h +219 -0
  321. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  322. data/ext/pg_query/include/postgres/storage/ipc.h +87 -0
  323. data/ext/pg_query/include/postgres/storage/item.h +19 -0
  324. data/ext/pg_query/include/postgres/storage/itemid.h +184 -0
  325. data/ext/pg_query/include/postgres/storage/itemptr.h +245 -0
  326. data/ext/pg_query/include/postgres/storage/large_object.h +100 -0
  327. data/ext/pg_query/include/postgres/storage/latch.h +196 -0
  328. data/ext/pg_query/include/postgres/storage/lmgr.h +126 -0
  329. data/ext/pg_query/include/postgres/storage/lock.h +624 -0
  330. data/ext/pg_query/include/postgres/storage/lockdefs.h +59 -0
  331. data/ext/pg_query/include/postgres/storage/lwlock.h +228 -0
  332. data/ext/pg_query/include/postgres/storage/lwlocknames.h +47 -0
  333. data/ext/pg_query/include/postgres/storage/off.h +57 -0
  334. data/ext/pg_query/include/postgres/storage/pg_sema.h +61 -0
  335. data/ext/pg_query/include/postgres/storage/pg_shmem.h +93 -0
  336. data/ext/pg_query/include/postgres/storage/pmsignal.h +105 -0
  337. data/ext/pg_query/include/postgres/storage/predicate.h +83 -0
  338. data/ext/pg_query/include/postgres/storage/proc.h +491 -0
  339. data/ext/pg_query/include/postgres/storage/procarray.h +103 -0
  340. data/ext/pg_query/include/postgres/storage/proclist_types.h +53 -0
  341. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  342. data/ext/pg_query/include/postgres/storage/procsignal.h +75 -0
  343. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  344. data/ext/pg_query/include/postgres/storage/relfilelocator.h +100 -0
  345. data/ext/pg_query/include/postgres/storage/s_lock.h +847 -0
  346. data/ext/pg_query/include/postgres/storage/sharedfileset.h +37 -0
  347. data/ext/pg_query/include/postgres/storage/shm_mq.h +86 -0
  348. data/ext/pg_query/include/postgres/storage/shm_toc.h +58 -0
  349. data/ext/pg_query/include/postgres/storage/shmem.h +59 -0
  350. data/ext/pg_query/include/postgres/storage/sinval.h +153 -0
  351. data/ext/pg_query/include/postgres/storage/smgr.h +127 -0
  352. data/ext/pg_query/include/postgres/storage/spin.h +77 -0
  353. data/ext/pg_query/include/postgres/storage/standby.h +109 -0
  354. data/ext/pg_query/include/postgres/storage/standbydefs.h +74 -0
  355. data/ext/pg_query/include/postgres/storage/sync.h +66 -0
  356. data/ext/pg_query/include/postgres/tcop/cmdtag.h +62 -0
  357. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +219 -0
  358. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +108 -0
  359. data/ext/pg_query/include/postgres/tcop/dest.h +148 -0
  360. data/ext/pg_query/include/postgres/tcop/fastpath.h +20 -0
  361. data/ext/pg_query/include/postgres/tcop/pquery.h +51 -0
  362. data/ext/pg_query/include/postgres/tcop/tcopprot.h +98 -0
  363. data/ext/pg_query/include/postgres/tcop/utility.h +112 -0
  364. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +96 -0
  365. data/ext/pg_query/include/postgres/utils/acl.h +290 -0
  366. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +45 -0
  367. data/ext/pg_query/include/postgres/utils/array.h +481 -0
  368. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  369. data/ext/pg_query/include/postgres/utils/backend_progress.h +46 -0
  370. data/ext/pg_query/include/postgres/utils/backend_status.h +340 -0
  371. data/ext/pg_query/include/postgres/utils/builtins.h +139 -0
  372. data/ext/pg_query/include/postgres/utils/bytea.h +28 -0
  373. data/ext/pg_query/include/postgres/utils/catcache.h +230 -0
  374. data/ext/pg_query/include/postgres/utils/date.h +118 -0
  375. data/ext/pg_query/include/postgres/utils/datetime.h +367 -0
  376. data/ext/pg_query/include/postgres/utils/datum.h +76 -0
  377. data/ext/pg_query/include/postgres/utils/dsa.h +166 -0
  378. data/ext/pg_query/include/postgres/utils/elog.h +540 -0
  379. data/ext/pg_query/include/postgres/utils/errcodes.h +352 -0
  380. data/ext/pg_query/include/postgres/utils/expandeddatum.h +170 -0
  381. data/ext/pg_query/include/postgres/utils/expandedrecord.h +241 -0
  382. data/ext/pg_query/include/postgres/utils/float.h +357 -0
  383. data/ext/pg_query/include/postgres/utils/fmgroids.h +3347 -0
  384. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +2904 -0
  385. data/ext/pg_query/include/postgres/utils/fmgrtab.h +49 -0
  386. data/ext/pg_query/include/postgres/utils/guc.h +456 -0
  387. data/ext/pg_query/include/postgres/utils/guc_hooks.h +184 -0
  388. data/ext/pg_query/include/postgres/utils/guc_tables.h +323 -0
  389. data/ext/pg_query/include/postgres/utils/hsearch.h +153 -0
  390. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  391. data/ext/pg_query/include/postgres/utils/inval.h +68 -0
  392. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  393. data/ext/pg_query/include/postgres/utils/lsyscache.h +215 -0
  394. data/ext/pg_query/include/postgres/utils/memdebug.h +82 -0
  395. data/ext/pg_query/include/postgres/utils/memutils.h +193 -0
  396. data/ext/pg_query/include/postgres/utils/memutils_internal.h +176 -0
  397. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +253 -0
  398. data/ext/pg_query/include/postgres/utils/numeric.h +110 -0
  399. data/ext/pg_query/include/postgres/utils/palloc.h +151 -0
  400. data/ext/pg_query/include/postgres/utils/partcache.h +103 -0
  401. data/ext/pg_query/include/postgres/utils/pg_locale.h +136 -0
  402. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +808 -0
  403. data/ext/pg_query/include/postgres/utils/plancache.h +238 -0
  404. data/ext/pg_query/include/postgres/utils/portal.h +252 -0
  405. data/ext/pg_query/include/postgres/utils/queryenvironment.h +74 -0
  406. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  407. data/ext/pg_query/include/postgres/utils/rel.h +711 -0
  408. data/ext/pg_query/include/postgres/utils/relcache.h +155 -0
  409. data/ext/pg_query/include/postgres/utils/reltrigger.h +81 -0
  410. data/ext/pg_query/include/postgres/utils/resowner.h +167 -0
  411. data/ext/pg_query/include/postgres/utils/ruleutils.h +52 -0
  412. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +61 -0
  413. data/ext/pg_query/include/postgres/utils/snapmgr.h +130 -0
  414. data/ext/pg_query/include/postgres/utils/snapshot.h +219 -0
  415. data/ext/pg_query/include/postgres/utils/sortsupport.h +391 -0
  416. data/ext/pg_query/include/postgres/utils/syscache.h +131 -0
  417. data/ext/pg_query/include/postgres/utils/timeout.h +96 -0
  418. data/ext/pg_query/include/postgres/utils/timestamp.h +147 -0
  419. data/ext/pg_query/include/postgres/utils/tuplesort.h +472 -0
  420. data/ext/pg_query/include/postgres/utils/tuplestore.h +88 -0
  421. data/ext/pg_query/include/postgres/utils/typcache.h +210 -0
  422. data/ext/pg_query/include/postgres/utils/varlena.h +53 -0
  423. data/ext/pg_query/include/postgres/utils/wait_event.h +108 -0
  424. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  425. data/ext/pg_query/include/postgres/utils/xml.h +94 -0
  426. data/ext/pg_query/include/postgres/varatt.h +358 -0
  427. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
  428. data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
  429. data/ext/pg_query/pg_query.c +9 -0
  430. data/ext/pg_query/pg_query.pb-c.c +6598 -3739
  431. data/ext/pg_query/pg_query_fingerprint.c +4 -5
  432. data/ext/pg_query/pg_query_normalize.c +42 -1
  433. data/ext/pg_query/pg_query_outfuncs_json.c +9 -1
  434. data/ext/pg_query/pg_query_outfuncs_protobuf.c +1 -0
  435. data/ext/pg_query/pg_query_parse.c +1 -1
  436. data/ext/pg_query/pg_query_parse_plpgsql.c +18 -17
  437. data/ext/pg_query/pg_query_readfuncs_protobuf.c +3 -2
  438. data/ext/pg_query/pg_query_ruby.c +5 -0
  439. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -1
  440. data/ext/pg_query/pg_query_scan.c +1 -1
  441. data/ext/pg_query/pg_query_split.c +1 -1
  442. data/ext/pg_query/postgres_deparse.c +409 -21
  443. data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
  444. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  445. data/ext/pg_query/src_backend_commands_define.c +2 -3
  446. data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
  447. data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
  448. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
  449. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  450. data/ext/pg_query/src_backend_nodes_list.c +3 -7
  451. data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
  452. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
  453. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  454. data/ext/pg_query/src_backend_parser_gram.c +34490 -32135
  455. data/ext/pg_query/src_backend_parser_parser.c +8 -8
  456. data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
  457. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  458. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  459. data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
  460. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  461. data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
  462. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  463. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  464. data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
  465. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
  466. data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
  467. data/ext/pg_query/src_backend_utils_error_elog.c +60 -190
  468. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
  469. data/ext/pg_query/src_backend_utils_init_globals.c +16 -4
  470. data/ext/pg_query/src_backend_utils_mb_mbutils.c +19 -81
  471. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -8
  472. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
  473. data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
  474. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  475. data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
  476. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
  477. data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
  478. data/ext/pg_query/src_common_encnames.c +43 -44
  479. data/ext/pg_query/src_common_hashfn.c +1 -1
  480. data/ext/pg_query/src_common_keywords.c +1 -1
  481. data/ext/pg_query/src_common_kwlist_d.h +511 -466
  482. data/ext/pg_query/src_common_kwlookup.c +1 -1
  483. data/ext/pg_query/src_common_psprintf.c +3 -3
  484. data/ext/pg_query/src_common_stringinfo.c +18 -1
  485. data/ext/pg_query/src_common_wchar.c +45 -108
  486. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  487. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
  488. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
  489. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  490. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  491. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  492. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
  493. data/ext/pg_query/src_port_pg_bitutils.c +251 -32
  494. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  495. data/ext/pg_query/src_port_snprintf.c +4 -4
  496. data/ext/pg_query/src_port_strerror.c +1 -3
  497. data/ext/pg_query/src_port_strlcpy.c +79 -0
  498. data/lib/pg_query/fingerprint.rb +2 -3
  499. data/lib/pg_query/node.rb +16 -11
  500. data/lib/pg_query/param_refs.rb +1 -1
  501. data/lib/pg_query/parse.rb +1 -1
  502. data/lib/pg_query/pg_query_pb.rb +26 -3
  503. data/lib/pg_query/treewalker.rb +52 -12
  504. data/lib/pg_query/truncate.rb +1 -1
  505. data/lib/pg_query/version.rb +1 -1
  506. metadata +444 -400
  507. data/ext/pg_query/guc-file.c +0 -0
  508. data/ext/pg_query/include/access/amapi.h +0 -292
  509. data/ext/pg_query/include/access/attmap.h +0 -54
  510. data/ext/pg_query/include/access/attnum.h +0 -64
  511. data/ext/pg_query/include/access/clog.h +0 -63
  512. data/ext/pg_query/include/access/commit_ts.h +0 -74
  513. data/ext/pg_query/include/access/detoast.h +0 -82
  514. data/ext/pg_query/include/access/genam.h +0 -233
  515. data/ext/pg_query/include/access/gin.h +0 -91
  516. data/ext/pg_query/include/access/htup.h +0 -89
  517. data/ext/pg_query/include/access/htup_details.h +0 -811
  518. data/ext/pg_query/include/access/itup.h +0 -170
  519. data/ext/pg_query/include/access/parallel.h +0 -82
  520. data/ext/pg_query/include/access/printtup.h +0 -35
  521. data/ext/pg_query/include/access/relation.h +0 -28
  522. data/ext/pg_query/include/access/relscan.h +0 -191
  523. data/ext/pg_query/include/access/rmgrlist.h +0 -49
  524. data/ext/pg_query/include/access/sdir.h +0 -67
  525. data/ext/pg_query/include/access/skey.h +0 -151
  526. data/ext/pg_query/include/access/stratnum.h +0 -85
  527. data/ext/pg_query/include/access/sysattr.h +0 -29
  528. data/ext/pg_query/include/access/table.h +0 -28
  529. data/ext/pg_query/include/access/tableam.h +0 -2100
  530. data/ext/pg_query/include/access/toast_compression.h +0 -73
  531. data/ext/pg_query/include/access/transam.h +0 -375
  532. data/ext/pg_query/include/access/tsmapi.h +0 -82
  533. data/ext/pg_query/include/access/tupconvert.h +0 -54
  534. data/ext/pg_query/include/access/tupdesc.h +0 -154
  535. data/ext/pg_query/include/access/tupmacs.h +0 -207
  536. data/ext/pg_query/include/access/twophase.h +0 -65
  537. data/ext/pg_query/include/access/xact.h +0 -530
  538. data/ext/pg_query/include/access/xlog.h +0 -302
  539. data/ext/pg_query/include/access/xlog_internal.h +0 -404
  540. data/ext/pg_query/include/access/xlogbackup.h +0 -41
  541. data/ext/pg_query/include/access/xlogdefs.h +0 -82
  542. data/ext/pg_query/include/access/xlogprefetcher.h +0 -55
  543. data/ext/pg_query/include/access/xlogreader.h +0 -444
  544. data/ext/pg_query/include/access/xlogrecord.h +0 -248
  545. data/ext/pg_query/include/access/xlogrecovery.h +0 -158
  546. data/ext/pg_query/include/archive/archive_module.h +0 -59
  547. data/ext/pg_query/include/c.h +0 -1379
  548. data/ext/pg_query/include/catalog/catalog.h +0 -45
  549. data/ext/pg_query/include/catalog/catversion.h +0 -62
  550. data/ext/pg_query/include/catalog/dependency.h +0 -270
  551. data/ext/pg_query/include/catalog/genbki.h +0 -143
  552. data/ext/pg_query/include/catalog/index.h +0 -214
  553. data/ext/pg_query/include/catalog/indexing.h +0 -54
  554. data/ext/pg_query/include/catalog/namespace.h +0 -190
  555. data/ext/pg_query/include/catalog/objectaccess.h +0 -267
  556. data/ext/pg_query/include/catalog/objectaddress.h +0 -89
  557. data/ext/pg_query/include/catalog/pg_aggregate.h +0 -180
  558. data/ext/pg_query/include/catalog/pg_aggregate_d.h +0 -78
  559. data/ext/pg_query/include/catalog/pg_am.h +0 -63
  560. data/ext/pg_query/include/catalog/pg_am_d.h +0 -47
  561. data/ext/pg_query/include/catalog/pg_attribute.h +0 -223
  562. data/ext/pg_query/include/catalog/pg_attribute_d.h +0 -62
  563. data/ext/pg_query/include/catalog/pg_authid.h +0 -63
  564. data/ext/pg_query/include/catalog/pg_authid_d.h +0 -59
  565. data/ext/pg_query/include/catalog/pg_class.h +0 -230
  566. data/ext/pg_query/include/catalog/pg_class_d.h +0 -132
  567. data/ext/pg_query/include/catalog/pg_collation.h +0 -100
  568. data/ext/pg_query/include/catalog/pg_collation_d.h +0 -63
  569. data/ext/pg_query/include/catalog/pg_constraint.h +0 -273
  570. data/ext/pg_query/include/catalog/pg_constraint_d.h +0 -73
  571. data/ext/pg_query/include/catalog/pg_control.h +0 -258
  572. data/ext/pg_query/include/catalog/pg_conversion.h +0 -75
  573. data/ext/pg_query/include/catalog/pg_conversion_d.h +0 -38
  574. data/ext/pg_query/include/catalog/pg_database.h +0 -124
  575. data/ext/pg_query/include/catalog/pg_database_d.h +0 -52
  576. data/ext/pg_query/include/catalog/pg_depend.h +0 -77
  577. data/ext/pg_query/include/catalog/pg_depend_d.h +0 -36
  578. data/ext/pg_query/include/catalog/pg_event_trigger.h +0 -57
  579. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +0 -36
  580. data/ext/pg_query/include/catalog/pg_index.h +0 -90
  581. data/ext/pg_query/include/catalog/pg_index_d.h +0 -59
  582. data/ext/pg_query/include/catalog/pg_language.h +0 -72
  583. data/ext/pg_query/include/catalog/pg_language_d.h +0 -41
  584. data/ext/pg_query/include/catalog/pg_namespace.h +0 -64
  585. data/ext/pg_query/include/catalog/pg_namespace_d.h +0 -36
  586. data/ext/pg_query/include/catalog/pg_opclass.h +0 -88
  587. data/ext/pg_query/include/catalog/pg_opclass_d.h +0 -51
  588. data/ext/pg_query/include/catalog/pg_operator.h +0 -107
  589. data/ext/pg_query/include/catalog/pg_operator_d.h +0 -142
  590. data/ext/pg_query/include/catalog/pg_opfamily.h +0 -64
  591. data/ext/pg_query/include/catalog/pg_opfamily_d.h +0 -51
  592. data/ext/pg_query/include/catalog/pg_partitioned_table.h +0 -74
  593. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +0 -36
  594. data/ext/pg_query/include/catalog/pg_proc.h +0 -220
  595. data/ext/pg_query/include/catalog/pg_proc_d.h +0 -101
  596. data/ext/pg_query/include/catalog/pg_publication.h +0 -158
  597. data/ext/pg_query/include/catalog/pg_publication_d.h +0 -38
  598. data/ext/pg_query/include/catalog/pg_replication_origin.h +0 -62
  599. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +0 -33
  600. data/ext/pg_query/include/catalog/pg_statistic.h +0 -282
  601. data/ext/pg_query/include/catalog/pg_statistic_d.h +0 -195
  602. data/ext/pg_query/include/catalog/pg_statistic_ext.h +0 -88
  603. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +0 -45
  604. data/ext/pg_query/include/catalog/pg_transform.h +0 -48
  605. data/ext/pg_query/include/catalog/pg_transform_d.h +0 -34
  606. data/ext/pg_query/include/catalog/pg_trigger.h +0 -153
  607. data/ext/pg_query/include/catalog/pg_trigger_d.h +0 -109
  608. data/ext/pg_query/include/catalog/pg_ts_config.h +0 -53
  609. data/ext/pg_query/include/catalog/pg_ts_config_d.h +0 -34
  610. data/ext/pg_query/include/catalog/pg_ts_dict.h +0 -59
  611. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +0 -35
  612. data/ext/pg_query/include/catalog/pg_ts_parser.h +0 -60
  613. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +0 -37
  614. data/ext/pg_query/include/catalog/pg_ts_template.h +0 -51
  615. data/ext/pg_query/include/catalog/pg_ts_template_d.h +0 -34
  616. data/ext/pg_query/include/catalog/pg_type.h +0 -404
  617. data/ext/pg_query/include/catalog/pg_type_d.h +0 -324
  618. data/ext/pg_query/include/catalog/storage.h +0 -50
  619. data/ext/pg_query/include/commands/async.h +0 -53
  620. data/ext/pg_query/include/commands/dbcommands.h +0 -37
  621. data/ext/pg_query/include/commands/defrem.h +0 -161
  622. data/ext/pg_query/include/commands/event_trigger.h +0 -88
  623. data/ext/pg_query/include/commands/explain.h +0 -129
  624. data/ext/pg_query/include/commands/prepare.h +0 -61
  625. data/ext/pg_query/include/commands/tablespace.h +0 -69
  626. data/ext/pg_query/include/commands/trigger.h +0 -288
  627. data/ext/pg_query/include/commands/vacuum.h +0 -386
  628. data/ext/pg_query/include/common/cryptohash.h +0 -39
  629. data/ext/pg_query/include/common/file_perm.h +0 -56
  630. data/ext/pg_query/include/common/hashfn.h +0 -104
  631. data/ext/pg_query/include/common/int.h +0 -437
  632. data/ext/pg_query/include/common/ip.h +0 -33
  633. data/ext/pg_query/include/common/keywords.h +0 -29
  634. data/ext/pg_query/include/common/kwlookup.h +0 -44
  635. data/ext/pg_query/include/common/pg_prng.h +0 -61
  636. data/ext/pg_query/include/common/relpath.h +0 -97
  637. data/ext/pg_query/include/common/scram-common.h +0 -70
  638. data/ext/pg_query/include/common/sha2.h +0 -32
  639. data/ext/pg_query/include/common/string.h +0 -44
  640. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +0 -125
  641. data/ext/pg_query/include/copyfuncs.funcs.c +0 -5013
  642. data/ext/pg_query/include/copyfuncs.switch.c +0 -938
  643. data/ext/pg_query/include/datatype/timestamp.h +0 -243
  644. data/ext/pg_query/include/equalfuncs.funcs.c +0 -3097
  645. data/ext/pg_query/include/equalfuncs.switch.c +0 -785
  646. data/ext/pg_query/include/executor/execdesc.h +0 -70
  647. data/ext/pg_query/include/executor/executor.h +0 -680
  648. data/ext/pg_query/include/executor/functions.h +0 -55
  649. data/ext/pg_query/include/executor/instrument.h +0 -118
  650. data/ext/pg_query/include/executor/spi.h +0 -213
  651. data/ext/pg_query/include/executor/tablefunc.h +0 -67
  652. data/ext/pg_query/include/executor/tuptable.h +0 -494
  653. data/ext/pg_query/include/fmgr.h +0 -800
  654. data/ext/pg_query/include/foreign/fdwapi.h +0 -294
  655. data/ext/pg_query/include/funcapi.h +0 -360
  656. data/ext/pg_query/include/gram.h +0 -1127
  657. data/ext/pg_query/include/gramparse.h +0 -75
  658. data/ext/pg_query/include/jit/jit.h +0 -105
  659. data/ext/pg_query/include/kwlist_d.h +0 -1119
  660. data/ext/pg_query/include/lib/dshash.h +0 -115
  661. data/ext/pg_query/include/lib/ilist.h +0 -1159
  662. data/ext/pg_query/include/lib/pairingheap.h +0 -102
  663. data/ext/pg_query/include/lib/simplehash.h +0 -1184
  664. data/ext/pg_query/include/lib/sort_template.h +0 -432
  665. data/ext/pg_query/include/lib/stringinfo.h +0 -161
  666. data/ext/pg_query/include/libpq/auth.h +0 -37
  667. data/ext/pg_query/include/libpq/crypt.h +0 -47
  668. data/ext/pg_query/include/libpq/hba.h +0 -186
  669. data/ext/pg_query/include/libpq/libpq-be.h +0 -354
  670. data/ext/pg_query/include/libpq/libpq.h +0 -144
  671. data/ext/pg_query/include/libpq/pqcomm.h +0 -163
  672. data/ext/pg_query/include/libpq/pqformat.h +0 -210
  673. data/ext/pg_query/include/libpq/pqsignal.h +0 -54
  674. data/ext/pg_query/include/libpq/sasl.h +0 -136
  675. data/ext/pg_query/include/libpq/scram.h +0 -37
  676. data/ext/pg_query/include/mb/pg_wchar.h +0 -772
  677. data/ext/pg_query/include/mb/stringinfo_mb.h +0 -24
  678. data/ext/pg_query/include/miscadmin.h +0 -507
  679. data/ext/pg_query/include/nodes/bitmapset.h +0 -126
  680. data/ext/pg_query/include/nodes/execnodes.h +0 -2768
  681. data/ext/pg_query/include/nodes/extensible.h +0 -164
  682. data/ext/pg_query/include/nodes/lockoptions.h +0 -61
  683. data/ext/pg_query/include/nodes/makefuncs.h +0 -121
  684. data/ext/pg_query/include/nodes/memnodes.h +0 -113
  685. data/ext/pg_query/include/nodes/miscnodes.h +0 -56
  686. data/ext/pg_query/include/nodes/nodeFuncs.h +0 -222
  687. data/ext/pg_query/include/nodes/nodes.h +0 -446
  688. data/ext/pg_query/include/nodes/nodetags.h +0 -471
  689. data/ext/pg_query/include/nodes/params.h +0 -170
  690. data/ext/pg_query/include/nodes/parsenodes.h +0 -4050
  691. data/ext/pg_query/include/nodes/pathnodes.h +0 -3384
  692. data/ext/pg_query/include/nodes/pg_list.h +0 -635
  693. data/ext/pg_query/include/nodes/plannodes.h +0 -1592
  694. data/ext/pg_query/include/nodes/primnodes.h +0 -2041
  695. data/ext/pg_query/include/nodes/print.h +0 -34
  696. data/ext/pg_query/include/nodes/queryjumble.h +0 -86
  697. data/ext/pg_query/include/nodes/replnodes.h +0 -111
  698. data/ext/pg_query/include/nodes/supportnodes.h +0 -346
  699. data/ext/pg_query/include/nodes/tidbitmap.h +0 -75
  700. data/ext/pg_query/include/nodes/value.h +0 -90
  701. data/ext/pg_query/include/optimizer/cost.h +0 -215
  702. data/ext/pg_query/include/optimizer/geqo.h +0 -90
  703. data/ext/pg_query/include/optimizer/geqo_gene.h +0 -45
  704. data/ext/pg_query/include/optimizer/optimizer.h +0 -202
  705. data/ext/pg_query/include/optimizer/paths.h +0 -266
  706. data/ext/pg_query/include/optimizer/planmain.h +0 -117
  707. data/ext/pg_query/include/parser/analyze.h +0 -64
  708. data/ext/pg_query/include/parser/kwlist.h +0 -498
  709. data/ext/pg_query/include/parser/parse_agg.h +0 -65
  710. data/ext/pg_query/include/parser/parse_coerce.h +0 -102
  711. data/ext/pg_query/include/parser/parse_expr.h +0 -25
  712. data/ext/pg_query/include/parser/parse_func.h +0 -74
  713. data/ext/pg_query/include/parser/parse_node.h +0 -357
  714. data/ext/pg_query/include/parser/parse_oper.h +0 -65
  715. data/ext/pg_query/include/parser/parse_relation.h +0 -129
  716. data/ext/pg_query/include/parser/parse_type.h +0 -61
  717. data/ext/pg_query/include/parser/parser.h +0 -68
  718. data/ext/pg_query/include/parser/parsetree.h +0 -61
  719. data/ext/pg_query/include/parser/scanner.h +0 -152
  720. data/ext/pg_query/include/parser/scansup.h +0 -27
  721. data/ext/pg_query/include/partitioning/partdefs.h +0 -26
  722. data/ext/pg_query/include/pg_config.h +0 -843
  723. data/ext/pg_query/include/pg_config_manual.h +0 -372
  724. data/ext/pg_query/include/pg_config_os.h +0 -8
  725. data/ext/pg_query/include/pg_getopt.h +0 -56
  726. data/ext/pg_query/include/pg_trace.h +0 -17
  727. data/ext/pg_query/include/pgstat.h +0 -778
  728. data/ext/pg_query/include/pgtime.h +0 -94
  729. data/ext/pg_query/include/pl_gram.h +0 -385
  730. data/ext/pg_query/include/pl_reserved_kwlist.h +0 -52
  731. data/ext/pg_query/include/pl_reserved_kwlist_d.h +0 -114
  732. data/ext/pg_query/include/pl_unreserved_kwlist.h +0 -112
  733. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +0 -246
  734. data/ext/pg_query/include/plerrcodes.h +0 -998
  735. data/ext/pg_query/include/plpgsql.h +0 -1340
  736. data/ext/pg_query/include/port/atomics/arch-arm.h +0 -32
  737. data/ext/pg_query/include/port/atomics/arch-ppc.h +0 -254
  738. data/ext/pg_query/include/port/atomics/arch-x86.h +0 -252
  739. data/ext/pg_query/include/port/atomics/fallback.h +0 -170
  740. data/ext/pg_query/include/port/atomics/generic-gcc.h +0 -286
  741. data/ext/pg_query/include/port/atomics/generic.h +0 -401
  742. data/ext/pg_query/include/port/atomics.h +0 -519
  743. data/ext/pg_query/include/port/pg_bitutils.h +0 -339
  744. data/ext/pg_query/include/port/pg_bswap.h +0 -161
  745. data/ext/pg_query/include/port/pg_crc32c.h +0 -101
  746. data/ext/pg_query/include/port/simd.h +0 -375
  747. data/ext/pg_query/include/port.h +0 -520
  748. data/ext/pg_query/include/portability/instr_time.h +0 -197
  749. data/ext/pg_query/include/postgres.h +0 -579
  750. data/ext/pg_query/include/postmaster/autovacuum.h +0 -80
  751. data/ext/pg_query/include/postmaster/auxprocess.h +0 -20
  752. data/ext/pg_query/include/postmaster/bgworker.h +0 -162
  753. data/ext/pg_query/include/postmaster/bgworker_internals.h +0 -64
  754. data/ext/pg_query/include/postmaster/bgwriter.h +0 -45
  755. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  756. data/ext/pg_query/include/postmaster/interrupt.h +0 -32
  757. data/ext/pg_query/include/postmaster/pgarch.h +0 -36
  758. data/ext/pg_query/include/postmaster/postmaster.h +0 -81
  759. data/ext/pg_query/include/postmaster/startup.h +0 -41
  760. data/ext/pg_query/include/postmaster/syslogger.h +0 -103
  761. data/ext/pg_query/include/postmaster/walwriter.h +0 -23
  762. data/ext/pg_query/include/regex/regex.h +0 -189
  763. data/ext/pg_query/include/replication/logicallauncher.h +0 -34
  764. data/ext/pg_query/include/replication/logicalproto.h +0 -274
  765. data/ext/pg_query/include/replication/logicalworker.h +0 -32
  766. data/ext/pg_query/include/replication/origin.h +0 -73
  767. data/ext/pg_query/include/replication/reorderbuffer.h +0 -753
  768. data/ext/pg_query/include/replication/slot.h +0 -249
  769. data/ext/pg_query/include/replication/syncrep.h +0 -109
  770. data/ext/pg_query/include/replication/walreceiver.h +0 -478
  771. data/ext/pg_query/include/replication/walsender.h +0 -74
  772. data/ext/pg_query/include/rewrite/prs2lock.h +0 -46
  773. data/ext/pg_query/include/rewrite/rewriteHandler.h +0 -35
  774. data/ext/pg_query/include/rewrite/rewriteManip.h +0 -96
  775. data/ext/pg_query/include/rewrite/rewriteSupport.h +0 -26
  776. data/ext/pg_query/include/src_backend_nodes_copyfuncs.funcs.c +0 -5321
  777. data/ext/pg_query/include/src_backend_nodes_equalfuncs.funcs.c +0 -3354
  778. data/ext/pg_query/include/storage/backendid.h +0 -37
  779. data/ext/pg_query/include/storage/block.h +0 -108
  780. data/ext/pg_query/include/storage/buf.h +0 -46
  781. data/ext/pg_query/include/storage/bufmgr.h +0 -393
  782. data/ext/pg_query/include/storage/bufpage.h +0 -510
  783. data/ext/pg_query/include/storage/condition_variable.h +0 -73
  784. data/ext/pg_query/include/storage/dsm.h +0 -61
  785. data/ext/pg_query/include/storage/dsm_impl.h +0 -79
  786. data/ext/pg_query/include/storage/fd.h +0 -202
  787. data/ext/pg_query/include/storage/fileset.h +0 -40
  788. data/ext/pg_query/include/storage/ipc.h +0 -84
  789. data/ext/pg_query/include/storage/item.h +0 -19
  790. data/ext/pg_query/include/storage/itemid.h +0 -184
  791. data/ext/pg_query/include/storage/itemptr.h +0 -245
  792. data/ext/pg_query/include/storage/large_object.h +0 -100
  793. data/ext/pg_query/include/storage/latch.h +0 -194
  794. data/ext/pg_query/include/storage/lmgr.h +0 -120
  795. data/ext/pg_query/include/storage/lock.h +0 -624
  796. data/ext/pg_query/include/storage/lockdefs.h +0 -59
  797. data/ext/pg_query/include/storage/lwlock.h +0 -220
  798. data/ext/pg_query/include/storage/lwlocknames.h +0 -50
  799. data/ext/pg_query/include/storage/off.h +0 -57
  800. data/ext/pg_query/include/storage/pg_sema.h +0 -61
  801. data/ext/pg_query/include/storage/pg_shmem.h +0 -92
  802. data/ext/pg_query/include/storage/pmsignal.h +0 -105
  803. data/ext/pg_query/include/storage/predicate.h +0 -87
  804. data/ext/pg_query/include/storage/proc.h +0 -466
  805. data/ext/pg_query/include/storage/procarray.h +0 -99
  806. data/ext/pg_query/include/storage/proclist_types.h +0 -51
  807. data/ext/pg_query/include/storage/procsignal.h +0 -73
  808. data/ext/pg_query/include/storage/relfilelocator.h +0 -99
  809. data/ext/pg_query/include/storage/s_lock.h +0 -867
  810. data/ext/pg_query/include/storage/sharedfileset.h +0 -37
  811. data/ext/pg_query/include/storage/shm_mq.h +0 -86
  812. data/ext/pg_query/include/storage/shm_toc.h +0 -58
  813. data/ext/pg_query/include/storage/shmem.h +0 -59
  814. data/ext/pg_query/include/storage/sinval.h +0 -153
  815. data/ext/pg_query/include/storage/sinvaladt.h +0 -45
  816. data/ext/pg_query/include/storage/smgr.h +0 -113
  817. data/ext/pg_query/include/storage/spin.h +0 -77
  818. data/ext/pg_query/include/storage/standby.h +0 -99
  819. data/ext/pg_query/include/storage/standbydefs.h +0 -74
  820. data/ext/pg_query/include/storage/sync.h +0 -66
  821. data/ext/pg_query/include/tcop/cmdtag.h +0 -63
  822. data/ext/pg_query/include/tcop/cmdtaglist.h +0 -218
  823. data/ext/pg_query/include/tcop/deparse_utility.h +0 -108
  824. data/ext/pg_query/include/tcop/dest.h +0 -147
  825. data/ext/pg_query/include/tcop/fastpath.h +0 -20
  826. data/ext/pg_query/include/tcop/pquery.h +0 -51
  827. data/ext/pg_query/include/tcop/tcopprot.h +0 -94
  828. data/ext/pg_query/include/tcop/utility.h +0 -112
  829. data/ext/pg_query/include/tsearch/ts_cache.h +0 -96
  830. data/ext/pg_query/include/utils/acl.h +0 -278
  831. data/ext/pg_query/include/utils/aclchk_internal.h +0 -45
  832. data/ext/pg_query/include/utils/array.h +0 -482
  833. data/ext/pg_query/include/utils/backend_progress.h +0 -45
  834. data/ext/pg_query/include/utils/backend_status.h +0 -342
  835. data/ext/pg_query/include/utils/builtins.h +0 -136
  836. data/ext/pg_query/include/utils/bytea.h +0 -28
  837. data/ext/pg_query/include/utils/catcache.h +0 -231
  838. data/ext/pg_query/include/utils/date.h +0 -118
  839. data/ext/pg_query/include/utils/datetime.h +0 -364
  840. data/ext/pg_query/include/utils/datum.h +0 -76
  841. data/ext/pg_query/include/utils/dsa.h +0 -127
  842. data/ext/pg_query/include/utils/elog.h +0 -545
  843. data/ext/pg_query/include/utils/errcodes.h +0 -354
  844. data/ext/pg_query/include/utils/expandeddatum.h +0 -170
  845. data/ext/pg_query/include/utils/expandedrecord.h +0 -241
  846. data/ext/pg_query/include/utils/float.h +0 -357
  847. data/ext/pg_query/include/utils/fmgroids.h +0 -3314
  848. data/ext/pg_query/include/utils/fmgrprotos.h +0 -2871
  849. data/ext/pg_query/include/utils/fmgrtab.h +0 -49
  850. data/ext/pg_query/include/utils/guc.h +0 -442
  851. data/ext/pg_query/include/utils/guc_hooks.h +0 -163
  852. data/ext/pg_query/include/utils/guc_tables.h +0 -322
  853. data/ext/pg_query/include/utils/hsearch.h +0 -153
  854. data/ext/pg_query/include/utils/inval.h +0 -68
  855. data/ext/pg_query/include/utils/logtape.h +0 -77
  856. data/ext/pg_query/include/utils/lsyscache.h +0 -212
  857. data/ext/pg_query/include/utils/memdebug.h +0 -82
  858. data/ext/pg_query/include/utils/memutils.h +0 -186
  859. data/ext/pg_query/include/utils/memutils_internal.h +0 -136
  860. data/ext/pg_query/include/utils/memutils_memorychunk.h +0 -237
  861. data/ext/pg_query/include/utils/numeric.h +0 -105
  862. data/ext/pg_query/include/utils/palloc.h +0 -165
  863. data/ext/pg_query/include/utils/partcache.h +0 -103
  864. data/ext/pg_query/include/utils/pg_locale.h +0 -135
  865. data/ext/pg_query/include/utils/pgstat_internal.h +0 -814
  866. data/ext/pg_query/include/utils/pidfile.h +0 -56
  867. data/ext/pg_query/include/utils/plancache.h +0 -236
  868. data/ext/pg_query/include/utils/portal.h +0 -252
  869. data/ext/pg_query/include/utils/queryenvironment.h +0 -74
  870. data/ext/pg_query/include/utils/regproc.h +0 -39
  871. data/ext/pg_query/include/utils/rel.h +0 -712
  872. data/ext/pg_query/include/utils/relcache.h +0 -158
  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/ruleutils.h +0 -52
  876. data/ext/pg_query/include/utils/sharedtuplestore.h +0 -61
  877. data/ext/pg_query/include/utils/snapmgr.h +0 -181
  878. data/ext/pg_query/include/utils/snapshot.h +0 -219
  879. data/ext/pg_query/include/utils/sortsupport.h +0 -391
  880. data/ext/pg_query/include/utils/syscache.h +0 -227
  881. data/ext/pg_query/include/utils/timeout.h +0 -95
  882. data/ext/pg_query/include/utils/timestamp.h +0 -147
  883. data/ext/pg_query/include/utils/tuplesort.h +0 -445
  884. data/ext/pg_query/include/utils/tuplestore.h +0 -91
  885. data/ext/pg_query/include/utils/typcache.h +0 -209
  886. data/ext/pg_query/include/utils/varlena.h +0 -53
  887. data/ext/pg_query/include/utils/wait_event.h +0 -294
  888. data/ext/pg_query/include/utils/xml.h +0 -94
  889. data/ext/pg_query/include/varatt.h +0 -358
  890. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2220
  891. data/ext/pg_query/src_port_strnlen.c +0 -39
  892. /data/ext/pg_query/include/{access → postgres/access}/rmgr.h +0 -0
  893. /data/ext/pg_query/include/{commands → postgres/commands}/user.h +0 -0
  894. /data/ext/pg_query/include/{common → postgres/common}/unicode_nonspacing_table.h +0 -0
  895. /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
  896. /data/ext/pg_query/include/{postgres_ext.h → postgres/postgres_ext.h} +0 -0
  897. /data/ext/pg_query/include/{utils → postgres/utils}/probes.h +0 -0
  898. /data/ext/pg_query/include/{utils → postgres/utils}/ps_status.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