pg_query 4.2.1 → 6.1.0

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