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