pg_query 2.2.0 → 4.2.1

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/access/amapi.h +45 -1
  6. data/ext/pg_query/include/access/attmap.h +1 -1
  7. data/ext/pg_query/include/access/attnum.h +2 -2
  8. data/ext/pg_query/include/access/clog.h +4 -2
  9. data/ext/pg_query/include/access/commit_ts.h +6 -9
  10. data/ext/pg_query/include/access/detoast.h +1 -11
  11. data/ext/pg_query/include/access/genam.h +15 -12
  12. data/ext/pg_query/include/access/gin.h +2 -2
  13. data/ext/pg_query/include/access/htup.h +1 -1
  14. data/ext/pg_query/include/access/htup_details.h +75 -87
  15. data/ext/pg_query/include/access/itup.h +7 -1
  16. data/ext/pg_query/include/access/parallel.h +2 -2
  17. data/ext/pg_query/include/access/printtup.h +1 -1
  18. data/ext/pg_query/include/access/relation.h +1 -1
  19. data/ext/pg_query/include/access/relscan.h +17 -2
  20. data/ext/pg_query/include/access/rmgr.h +30 -3
  21. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  22. data/ext/pg_query/include/access/sdir.h +1 -1
  23. data/ext/pg_query/include/access/skey.h +1 -1
  24. data/ext/pg_query/include/access/stratnum.h +4 -2
  25. data/ext/pg_query/include/access/sysattr.h +1 -1
  26. data/ext/pg_query/include/access/table.h +2 -1
  27. data/ext/pg_query/include/access/tableam.h +272 -20
  28. data/ext/pg_query/include/access/toast_compression.h +73 -0
  29. data/ext/pg_query/include/access/transam.h +123 -13
  30. data/ext/pg_query/include/access/tupconvert.h +1 -1
  31. data/ext/pg_query/include/access/tupdesc.h +1 -1
  32. data/ext/pg_query/include/access/tupmacs.h +3 -3
  33. data/ext/pg_query/include/access/twophase.h +3 -1
  34. data/ext/pg_query/include/access/xact.h +73 -19
  35. data/ext/pg_query/include/access/xlog.h +60 -155
  36. data/ext/pg_query/include/access/xlog_internal.h +40 -13
  37. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  38. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  39. data/ext/pg_query/include/access/xlogreader.h +145 -39
  40. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  41. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  42. data/ext/pg_query/include/c.h +101 -44
  43. data/ext/pg_query/include/catalog/catalog.h +3 -1
  44. data/ext/pg_query/include/catalog/catversion.h +2 -2
  45. data/ext/pg_query/include/catalog/dependency.h +8 -16
  46. data/ext/pg_query/include/catalog/genbki.h +83 -5
  47. data/ext/pg_query/include/catalog/index.h +18 -3
  48. data/ext/pg_query/include/catalog/indexing.h +12 -324
  49. data/ext/pg_query/include/catalog/namespace.h +4 -2
  50. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  51. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  52. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  53. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  54. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  55. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  56. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  57. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  58. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  59. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  60. data/ext/pg_query/include/catalog/pg_class.h +44 -14
  61. data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
  62. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  63. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  64. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  65. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  66. data/ext/pg_query/include/catalog/pg_control.h +3 -5
  67. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  68. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  69. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  70. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  71. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  72. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  73. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  74. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  75. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  76. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  77. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  78. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  79. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  80. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  81. data/ext/pg_query/include/catalog/pg_operator.h +18 -15
  82. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  83. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  84. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  85. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  86. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  88. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  89. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  90. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  91. data/ext/pg_query/include/catalog/pg_publication.h +50 -7
  92. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  93. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  95. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  96. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  97. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  98. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  99. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  100. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  101. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  102. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  103. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  104. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  105. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  106. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  107. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  108. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  109. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  110. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  111. data/ext/pg_query/include/catalog/pg_type.h +55 -24
  112. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  113. data/ext/pg_query/include/catalog/storage.h +5 -3
  114. data/ext/pg_query/include/commands/async.h +3 -4
  115. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  116. data/ext/pg_query/include/commands/defrem.h +11 -24
  117. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  118. data/ext/pg_query/include/commands/explain.h +1 -1
  119. data/ext/pg_query/include/commands/prepare.h +1 -1
  120. data/ext/pg_query/include/commands/tablespace.h +2 -2
  121. data/ext/pg_query/include/commands/trigger.h +18 -16
  122. data/ext/pg_query/include/commands/user.h +2 -2
  123. data/ext/pg_query/include/commands/vacuum.h +88 -41
  124. data/ext/pg_query/include/commands/variable.h +1 -1
  125. data/ext/pg_query/include/common/file_perm.h +4 -4
  126. data/ext/pg_query/include/common/hashfn.h +1 -1
  127. data/ext/pg_query/include/common/ip.h +1 -7
  128. data/ext/pg_query/include/common/keywords.h +2 -6
  129. data/ext/pg_query/include/common/kwlookup.h +1 -1
  130. data/ext/pg_query/include/common/pg_prng.h +60 -0
  131. data/ext/pg_query/include/common/relpath.h +2 -2
  132. data/ext/pg_query/include/common/string.h +24 -1
  133. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  134. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  135. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  136. data/ext/pg_query/include/executor/execdesc.h +1 -1
  137. data/ext/pg_query/include/executor/executor.h +65 -22
  138. data/ext/pg_query/include/executor/functions.h +17 -3
  139. data/ext/pg_query/include/executor/instrument.h +33 -16
  140. data/ext/pg_query/include/executor/spi.h +41 -3
  141. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  142. data/ext/pg_query/include/executor/tuptable.h +1 -1
  143. data/ext/pg_query/include/fmgr.h +13 -7
  144. data/ext/pg_query/include/funcapi.h +16 -4
  145. data/ext/pg_query/include/getaddrinfo.h +1 -1
  146. data/ext/pg_query/include/jit/jit.h +11 -11
  147. data/ext/pg_query/include/kwlist_d.h +517 -494
  148. data/ext/pg_query/include/lib/dshash.h +112 -0
  149. data/ext/pg_query/include/lib/ilist.h +20 -1
  150. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  151. data/ext/pg_query/include/lib/simplehash.h +140 -15
  152. data/ext/pg_query/include/lib/sort_template.h +432 -0
  153. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  154. data/ext/pg_query/include/libpq/auth.h +6 -4
  155. data/ext/pg_query/include/libpq/crypt.h +5 -4
  156. data/ext/pg_query/include/libpq/hba.h +43 -4
  157. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  158. data/ext/pg_query/include/libpq/libpq.h +30 -20
  159. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  160. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  161. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  162. data/ext/pg_query/include/mb/pg_wchar.h +105 -23
  163. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  164. data/ext/pg_query/include/miscadmin.h +47 -41
  165. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  166. data/ext/pg_query/include/nodes/execnodes.h +270 -78
  167. data/ext/pg_query/include/nodes/extensible.h +4 -2
  168. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  169. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  170. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  171. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  172. data/ext/pg_query/include/nodes/nodes.h +30 -11
  173. data/ext/pg_query/include/nodes/params.h +1 -1
  174. data/ext/pg_query/include/nodes/parsenodes.h +322 -90
  175. data/ext/pg_query/include/nodes/pathnodes.h +243 -66
  176. data/ext/pg_query/include/nodes/pg_list.h +75 -69
  177. data/ext/pg_query/include/nodes/plannodes.h +111 -28
  178. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  179. data/ext/pg_query/include/nodes/print.h +1 -1
  180. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  181. data/ext/pg_query/include/nodes/value.h +58 -39
  182. data/ext/pg_query/include/optimizer/cost.h +9 -2
  183. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  184. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  185. data/ext/pg_query/include/optimizer/optimizer.h +25 -17
  186. data/ext/pg_query/include/optimizer/paths.h +6 -6
  187. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  188. data/ext/pg_query/include/parser/analyze.h +19 -5
  189. data/ext/pg_query/include/parser/gram.h +947 -913
  190. data/ext/pg_query/include/parser/gramparse.h +1 -1
  191. data/ext/pg_query/include/parser/kwlist.h +463 -453
  192. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  193. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  194. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  195. data/ext/pg_query/include/parser/parse_func.h +2 -1
  196. data/ext/pg_query/include/parser/parse_node.h +21 -9
  197. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  198. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  199. data/ext/pg_query/include/parser/parse_type.h +1 -1
  200. data/ext/pg_query/include/parser/parser.h +31 -4
  201. data/ext/pg_query/include/parser/parsetree.h +1 -1
  202. data/ext/pg_query/include/parser/scanner.h +1 -1
  203. data/ext/pg_query/include/parser/scansup.h +2 -5
  204. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  205. data/ext/pg_query/include/pg_config.h +83 -41
  206. data/ext/pg_query/include/pg_config_manual.h +74 -21
  207. data/ext/pg_query/include/pg_getopt.h +6 -6
  208. data/ext/pg_query/include/pg_query.h +5 -4
  209. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
  212. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  213. data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
  214. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  215. data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
  216. data/ext/pg_query/include/pg_trace.h +1 -1
  217. data/ext/pg_query/include/pgstat.h +449 -1238
  218. data/ext/pg_query/include/pgtime.h +14 -4
  219. data/ext/pg_query/include/pl_gram.h +126 -128
  220. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  221. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  222. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  223. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  224. data/ext/pg_query/include/plerrcodes.h +9 -1
  225. data/ext/pg_query/include/plpgsql.h +52 -54
  226. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  227. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  228. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  229. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  230. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  231. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  232. data/ext/pg_query/include/port/atomics.h +1 -1
  233. data/ext/pg_query/include/port/pg_bitutils.h +40 -10
  234. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  235. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  236. data/ext/pg_query/include/port.h +71 -46
  237. data/ext/pg_query/include/portability/instr_time.h +1 -1
  238. data/ext/pg_query/include/postgres.h +60 -16
  239. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  240. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  241. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  242. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  243. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  244. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  245. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  246. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  247. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  248. data/ext/pg_query/include/postmaster/startup.h +39 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  250. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  251. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
  252. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  253. data/ext/pg_query/include/regex/regex.h +18 -16
  254. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  255. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  256. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  257. data/ext/pg_query/include/replication/origin.h +7 -7
  258. data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
  259. data/ext/pg_query/include/replication/slot.h +22 -11
  260. data/ext/pg_query/include/replication/syncrep.h +5 -5
  261. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  262. data/ext/pg_query/include/replication/walsender.h +8 -8
  263. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  264. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  265. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  266. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  267. data/ext/pg_query/include/storage/backendid.h +3 -3
  268. data/ext/pg_query/include/storage/block.h +4 -10
  269. data/ext/pg_query/include/storage/buf.h +1 -1
  270. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  271. data/ext/pg_query/include/storage/bufpage.h +6 -8
  272. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  273. data/ext/pg_query/include/storage/dsm.h +4 -1
  274. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  275. data/ext/pg_query/include/storage/fd.h +33 -3
  276. data/ext/pg_query/include/storage/fileset.h +40 -0
  277. data/ext/pg_query/include/storage/ipc.h +4 -1
  278. data/ext/pg_query/include/storage/item.h +1 -1
  279. data/ext/pg_query/include/storage/itemid.h +1 -1
  280. data/ext/pg_query/include/storage/itemptr.h +3 -1
  281. data/ext/pg_query/include/storage/large_object.h +2 -2
  282. data/ext/pg_query/include/storage/latch.h +9 -13
  283. data/ext/pg_query/include/storage/lmgr.h +2 -1
  284. data/ext/pg_query/include/storage/lock.h +11 -8
  285. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  286. data/ext/pg_query/include/storage/lwlock.h +5 -32
  287. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  288. data/ext/pg_query/include/storage/off.h +1 -1
  289. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  290. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  291. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  292. data/ext/pg_query/include/storage/predicate.h +4 -4
  293. data/ext/pg_query/include/storage/proc.h +173 -59
  294. data/ext/pg_query/include/storage/procarray.h +98 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  296. data/ext/pg_query/include/storage/procsignal.h +3 -7
  297. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  298. data/ext/pg_query/include/storage/s_lock.h +60 -21
  299. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  300. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  301. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  302. data/ext/pg_query/include/storage/shmem.h +1 -1
  303. data/ext/pg_query/include/storage/sinval.h +3 -3
  304. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  305. data/ext/pg_query/include/storage/smgr.h +10 -8
  306. data/ext/pg_query/include/storage/spin.h +2 -2
  307. data/ext/pg_query/include/storage/standby.h +13 -6
  308. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  309. data/ext/pg_query/include/storage/sync.h +7 -3
  310. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  312. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  313. data/ext/pg_query/include/tcop/dest.h +1 -1
  314. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  315. data/ext/pg_query/include/tcop/pquery.h +1 -1
  316. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  317. data/ext/pg_query/include/tcop/utility.h +7 -3
  318. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  319. data/ext/pg_query/include/utils/acl.h +24 -3
  320. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  321. data/ext/pg_query/include/utils/array.h +7 -2
  322. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  323. data/ext/pg_query/include/utils/backend_status.h +321 -0
  324. data/ext/pg_query/include/utils/builtins.h +10 -11
  325. data/ext/pg_query/include/utils/bytea.h +3 -2
  326. data/ext/pg_query/include/utils/catcache.h +1 -1
  327. data/ext/pg_query/include/utils/date.h +1 -1
  328. data/ext/pg_query/include/utils/datetime.h +8 -7
  329. data/ext/pg_query/include/utils/datum.h +9 -1
  330. data/ext/pg_query/include/utils/dsa.h +1 -1
  331. data/ext/pg_query/include/utils/dynahash.h +4 -3
  332. data/ext/pg_query/include/utils/elog.h +52 -21
  333. data/ext/pg_query/include/utils/errcodes.h +2 -0
  334. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  335. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  336. data/ext/pg_query/include/utils/float.h +7 -7
  337. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  338. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  339. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  340. data/ext/pg_query/include/utils/guc.h +69 -43
  341. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  342. data/ext/pg_query/include/utils/hsearch.h +15 -11
  343. data/ext/pg_query/include/utils/inval.h +4 -1
  344. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  345. data/ext/pg_query/include/utils/memdebug.h +1 -1
  346. data/ext/pg_query/include/utils/memutils.h +8 -3
  347. data/ext/pg_query/include/utils/numeric.h +19 -5
  348. data/ext/pg_query/include/utils/palloc.h +25 -3
  349. data/ext/pg_query/include/utils/partcache.h +1 -1
  350. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  351. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  352. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  353. data/ext/pg_query/include/utils/pidfile.h +1 -1
  354. data/ext/pg_query/include/utils/plancache.h +6 -5
  355. data/ext/pg_query/include/utils/portal.h +10 -12
  356. data/ext/pg_query/include/utils/ps_status.h +1 -1
  357. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  358. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  359. data/ext/pg_query/include/utils/regproc.h +14 -3
  360. data/ext/pg_query/include/utils/rel.h +71 -19
  361. data/ext/pg_query/include/utils/relcache.h +8 -5
  362. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  363. data/ext/pg_query/include/utils/resowner.h +1 -1
  364. data/ext/pg_query/include/utils/rls.h +2 -2
  365. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  366. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  367. data/ext/pg_query/include/utils/snapmgr.h +34 -14
  368. data/ext/pg_query/include/utils/snapshot.h +14 -1
  369. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  370. data/ext/pg_query/include/utils/syscache.h +6 -1
  371. data/ext/pg_query/include/utils/timeout.h +11 -4
  372. data/ext/pg_query/include/utils/timestamp.h +6 -5
  373. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  374. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  375. data/ext/pg_query/include/utils/typcache.h +24 -17
  376. data/ext/pg_query/include/utils/tzparser.h +1 -1
  377. data/ext/pg_query/include/utils/varlena.h +5 -3
  378. data/ext/pg_query/include/utils/wait_event.h +289 -0
  379. data/ext/pg_query/include/utils/xml.h +4 -4
  380. data/ext/pg_query/pg_query.pb-c.c +4302 -2304
  381. data/ext/pg_query/pg_query_deparse.c +1106 -373
  382. data/ext/pg_query/pg_query_fingerprint.c +30 -10
  383. data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
  384. data/ext/pg_query/pg_query_normalize.c +1 -1
  385. data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
  386. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  387. data/ext/pg_query/pg_query_parse.c +1 -1
  388. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  389. data/ext/pg_query/pg_query_scan.c +2 -1
  390. data/ext/pg_query/pg_query_split.c +3 -2
  391. data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
  392. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  393. data/ext/pg_query/src_backend_commands_define.c +11 -1
  394. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  395. data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
  396. data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
  397. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  398. data/ext/pg_query/src_backend_nodes_list.c +74 -11
  399. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  400. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  401. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  402. data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
  403. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  404. data/ext/pg_query/src_backend_parser_scan.c +172 -209
  405. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  406. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  407. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  408. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  409. data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
  410. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  411. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  412. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  413. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  414. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +71 -5
  415. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  416. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  417. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  418. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  419. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  420. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  421. data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
  422. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  423. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  424. data/ext/pg_query/src_common_encnames.c +1 -1
  425. data/ext/pg_query/src_common_hashfn.c +3 -3
  426. data/ext/pg_query/src_common_keywords.c +15 -2
  427. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  428. data/ext/pg_query/src_common_kwlookup.c +1 -1
  429. data/ext/pg_query/src_common_pg_prng.c +152 -0
  430. data/ext/pg_query/src_common_psprintf.c +1 -1
  431. data/ext/pg_query/src_common_string.c +7 -1
  432. data/ext/pg_query/src_common_stringinfo.c +1 -1
  433. data/ext/pg_query/src_common_wchar.c +701 -109
  434. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
  435. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  436. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
  437. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  438. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  441. data/ext/pg_query/src_port_pg_bitutils.c +41 -31
  442. data/ext/pg_query/src_port_pgsleep.c +1 -1
  443. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  444. data/ext/pg_query/src_port_qsort.c +12 -224
  445. data/ext/pg_query/src_port_snprintf.c +37 -13
  446. data/ext/pg_query/src_port_strerror.c +9 -19
  447. data/ext/pg_query/src_port_strnlen.c +1 -1
  448. data/lib/pg_query/filter_columns.rb +1 -1
  449. data/lib/pg_query/fingerprint.rb +5 -1
  450. data/lib/pg_query/node.rb +2 -2
  451. data/lib/pg_query/param_refs.rb +1 -1
  452. data/lib/pg_query/parse.rb +20 -8
  453. data/lib/pg_query/pg_query_pb.rb +1108 -942
  454. data/lib/pg_query/treewalker.rb +6 -0
  455. data/lib/pg_query/truncate.rb +1 -1
  456. data/lib/pg_query/version.rb +1 -1
  457. metadata +27 -17
  458. data/ext/pg_query/include/access/xloginsert.h +0 -64
  459. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  460. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  461. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  462. data/ext/pg_query/include/parser/parse_target.h +0 -46
  463. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  464. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  465. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  466. data/ext/pg_query/src_port_erand48.c +0 -127
  467. data/ext/pg_query/src_port_random.c +0 -31
@@ -0,0 +1,112 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * dshash.h
4
+ * Concurrent hash tables backed by dynamic shared memory areas.
5
+ *
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * IDENTIFICATION
10
+ * src/include/lib/dshash.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+ #ifndef DSHASH_H
15
+ #define DSHASH_H
16
+
17
+ #include "utils/dsa.h"
18
+
19
+ /* The opaque type representing a hash table. */
20
+ struct dshash_table;
21
+ typedef struct dshash_table dshash_table;
22
+
23
+ /* A handle for a dshash_table which can be shared with other processes. */
24
+ typedef dsa_pointer dshash_table_handle;
25
+
26
+ /* The type for hash values. */
27
+ typedef uint32 dshash_hash;
28
+
29
+ /* A function type for comparing keys. */
30
+ typedef int (*dshash_compare_function) (const void *a, const void *b,
31
+ size_t size, void *arg);
32
+
33
+ /* A function type for computing hash values for keys. */
34
+ typedef dshash_hash (*dshash_hash_function) (const void *v, size_t size,
35
+ void *arg);
36
+
37
+ /*
38
+ * The set of parameters needed to create or attach to a hash table. The
39
+ * members tranche_id and tranche_name do not need to be initialized when
40
+ * attaching to an existing hash table.
41
+ *
42
+ * Compare and hash functions must be supplied even when attaching, because we
43
+ * can't safely share function pointers between backends in general. Either
44
+ * the arg variants or the non-arg variants should be supplied; the other
45
+ * function pointers should be NULL. If the arg variants are supplied then the
46
+ * user data pointer supplied to the create and attach functions will be
47
+ * passed to the hash and compare functions.
48
+ */
49
+ typedef struct dshash_parameters
50
+ {
51
+ size_t key_size; /* Size of the key (initial bytes of entry) */
52
+ size_t entry_size; /* Total size of entry */
53
+ dshash_compare_function compare_function; /* Compare function */
54
+ dshash_hash_function hash_function; /* Hash function */
55
+ int tranche_id; /* The tranche ID to use for locks */
56
+ } dshash_parameters;
57
+
58
+ /* Forward declaration of private types for use only by dshash.c. */
59
+ struct dshash_table_item;
60
+ typedef struct dshash_table_item dshash_table_item;
61
+
62
+ /*
63
+ * Sequential scan state. The detail is exposed to let users know the storage
64
+ * size but it should be considered as an opaque type by callers.
65
+ */
66
+ typedef struct dshash_seq_status
67
+ {
68
+ dshash_table *hash_table; /* dshash table working on */
69
+ int curbucket; /* bucket number we are at */
70
+ int nbuckets; /* total number of buckets in the dshash */
71
+ dshash_table_item *curitem; /* item we are currently at */
72
+ dsa_pointer pnextitem; /* dsa-pointer to the next item */
73
+ int curpartition; /* partition number we are at */
74
+ bool exclusive; /* locking mode */
75
+ } dshash_seq_status;
76
+
77
+ /* Creating, sharing and destroying from hash tables. */
78
+ extern dshash_table *dshash_create(dsa_area *area,
79
+ const dshash_parameters *params,
80
+ void *arg);
81
+ extern dshash_table *dshash_attach(dsa_area *area,
82
+ const dshash_parameters *params,
83
+ dshash_table_handle handle,
84
+ void *arg);
85
+ extern void dshash_detach(dshash_table *hash_table);
86
+ extern dshash_table_handle dshash_get_hash_table_handle(dshash_table *hash_table);
87
+ extern void dshash_destroy(dshash_table *hash_table);
88
+
89
+ /* Finding, creating, deleting entries. */
90
+ extern void *dshash_find(dshash_table *hash_table,
91
+ const void *key, bool exclusive);
92
+ extern void *dshash_find_or_insert(dshash_table *hash_table,
93
+ const void *key, bool *found);
94
+ extern bool dshash_delete_key(dshash_table *hash_table, const void *key);
95
+ extern void dshash_delete_entry(dshash_table *hash_table, void *entry);
96
+ extern void dshash_release_lock(dshash_table *hash_table, void *entry);
97
+
98
+ /* seq scan support */
99
+ extern void dshash_seq_init(dshash_seq_status *status, dshash_table *hash_table,
100
+ bool exclusive);
101
+ extern void *dshash_seq_next(dshash_seq_status *status);
102
+ extern void dshash_seq_term(dshash_seq_status *status);
103
+ extern void dshash_delete_current(dshash_seq_status *status);
104
+
105
+ /* Convenience hash and compare functions wrapping memcmp and tag_hash. */
106
+ extern int dshash_memcmp(const void *a, const void *b, size_t size, void *arg);
107
+ extern dshash_hash dshash_memhash(const void *v, size_t size, void *arg);
108
+
109
+ /* Debugging support. */
110
+ extern void dshash_dump(dshash_table *hash_table);
111
+
112
+ #endif /* DSHASH_H */
@@ -96,7 +96,7 @@
96
96
  * }
97
97
  *
98
98
  *
99
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
99
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
100
100
  * Portions Copyright (c) 1994, Regents of the University of California
101
101
  *
102
102
  * IDENTIFICATION
@@ -394,6 +394,25 @@ dlist_move_head(dlist_head *head, dlist_node *node)
394
394
  dlist_check(head);
395
395
  }
396
396
 
397
+ /*
398
+ * Move element from its current position in the list to the tail position in
399
+ * the same list.
400
+ *
401
+ * Undefined behaviour if 'node' is not already part of the list.
402
+ */
403
+ static inline void
404
+ dlist_move_tail(dlist_head *head, dlist_node *node)
405
+ {
406
+ /* fast path if it's already at the tail */
407
+ if (head->head.prev == node)
408
+ return;
409
+
410
+ dlist_delete(node);
411
+ dlist_push_tail(head, node);
412
+
413
+ dlist_check(head);
414
+ }
415
+
397
416
  /*
398
417
  * Check whether 'node' has a following node.
399
418
  * Caution: unreliable if 'node' is not in the list.
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * A Pairing Heap implementation
5
5
  *
6
- * Portions Copyright (c) 2012-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 2012-2022, PostgreSQL Global Development Group
7
7
  *
8
8
  * src/include/lib/pairingheap.h
9
9
  */
@@ -1,10 +1,27 @@
1
1
  /*
2
2
  * simplehash.h
3
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.
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.
8
25
  *
9
26
  * Usage notes:
10
27
  *
@@ -24,7 +41,7 @@
24
41
  * - SH_SCOPE - in which scope (e.g. extern, static inline) do function
25
42
  * declarations reside
26
43
  * - SH_RAW_ALLOCATOR - if defined, memory contexts are not used; instead,
27
- * use this to allocate bytes
44
+ * use this to allocate bytes. The allocator must zero the returned space.
28
45
  * - SH_USE_NONDEFAULT_ALLOCATOR - if defined no element allocator functions
29
46
  * are defined, so you can supply your own
30
47
  * The following parameters are only relevant when SH_DEFINE is defined:
@@ -34,6 +51,20 @@
34
51
  * - SH_STORE_HASH - if defined the hash is stored in the elements
35
52
  * - SH_GET_HASH(tb, a) - return the field to store the hash in
36
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
+ *
37
68
  * For examples of usage look at tidbitmap.c (file local definition) and
38
69
  * execnodes.h/execGrouping.c (exposed declaration, file local
39
70
  * implementation).
@@ -56,7 +87,7 @@
56
87
  * looking or is done - buckets following a deleted element are shifted
57
88
  * backwards, unless they're empty or already at their optimal position.
58
89
  *
59
- * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
90
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
60
91
  * Portions Copyright (c) 1994, Regents of the University of California
61
92
  *
62
93
  * src/include/lib/simplehash.h
@@ -84,6 +115,7 @@
84
115
  #define SH_RESET SH_MAKE_NAME(reset)
85
116
  #define SH_INSERT SH_MAKE_NAME(insert)
86
117
  #define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
118
+ #define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
87
119
  #define SH_DELETE SH_MAKE_NAME(delete)
88
120
  #define SH_LOOKUP SH_MAKE_NAME(lookup)
89
121
  #define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
@@ -154,24 +186,62 @@ typedef struct SH_ITERATOR
154
186
 
155
187
  /* externally visible function prototypes */
156
188
  #ifdef SH_RAW_ALLOCATOR
189
+ /* <prefix>_hash <prefix>_create(uint32 nelements, void *private_data) */
157
190
  SH_SCOPE SH_TYPE *SH_CREATE(uint32 nelements, void *private_data);
158
191
  #else
192
+ /*
193
+ * <prefix>_hash <prefix>_create(MemoryContext ctx, uint32 nelements,
194
+ * void *private_data)
195
+ */
159
196
  SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
160
197
  void *private_data);
161
198
  #endif
199
+
200
+ /* void <prefix>_destroy(<prefix>_hash *tb) */
162
201
  SH_SCOPE void SH_DESTROY(SH_TYPE * tb);
202
+
203
+ /* void <prefix>_reset(<prefix>_hash *tb) */
163
204
  SH_SCOPE void SH_RESET(SH_TYPE * tb);
205
+
206
+ /* void <prefix>_grow(<prefix>_hash *tb, uint64 newsize) */
164
207
  SH_SCOPE void SH_GROW(SH_TYPE * tb, uint64 newsize);
208
+
209
+ /* <element> *<prefix>_insert(<prefix>_hash *tb, <key> key, bool *found) */
165
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
+ */
166
216
  SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
167
217
  uint32 hash, bool *found);
218
+
219
+ /* <element> *<prefix>_lookup(<prefix>_hash *tb, <key> key) */
168
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) */
169
223
  SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
170
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) */
171
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) */
172
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
+ */
173
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) */
174
242
  SH_SCOPE SH_ELEMENT_TYPE *SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
243
+
244
+ /* void <prefix>_stat(<prefix>_hash *tb */
175
245
  SH_SCOPE void SH_STAT(SH_TYPE * tb);
176
246
 
177
247
  #endif /* SH_DECLARE */
@@ -223,8 +293,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
223
293
  #define SIMPLEHASH_H
224
294
 
225
295
  #ifdef FRONTEND
226
- #define sh_error(...) \
227
- do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0)
296
+ #define sh_error(...) pg_fatal(__VA_ARGS__)
228
297
  #define sh_log(...) pg_log_info(__VA_ARGS__)
229
298
  #else
230
299
  #define sh_error(...) elog(ERROR, __VA_ARGS__)
@@ -367,9 +436,9 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
367
436
  uint64 size;
368
437
 
369
438
  #ifdef SH_RAW_ALLOCATOR
370
- tb = SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
439
+ tb = (SH_TYPE *) SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
371
440
  #else
372
- tb = MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
441
+ tb = (SH_TYPE *) MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
373
442
  tb->ctx = ctx;
374
443
  #endif
375
444
  tb->private_data = private_data;
@@ -379,7 +448,7 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
379
448
 
380
449
  SH_COMPUTE_PARAMETERS(tb, size);
381
450
 
382
- tb->data = SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
451
+ tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
383
452
 
384
453
  return tb;
385
454
  }
@@ -424,7 +493,7 @@ SH_GROW(SH_TYPE * tb, uint64 newsize)
424
493
  /* compute parameters for new table */
425
494
  SH_COMPUTE_PARAMETERS(tb, newsize);
426
495
 
427
- tb->data = SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
496
+ tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size);
428
497
 
429
498
  newdata = tb->data;
430
499
 
@@ -763,7 +832,7 @@ SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash)
763
832
  }
764
833
 
765
834
  /*
766
- * Delete entry from hash table. Returns whether to-be-deleted key was
835
+ * Delete entry from hash table by key. Returns whether to-be-deleted key was
767
836
  * present.
768
837
  */
769
838
  SH_SCOPE bool
@@ -834,6 +903,61 @@ SH_DELETE(SH_TYPE * tb, SH_KEY_TYPE key)
834
903
  }
835
904
  }
836
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
+
837
961
  /*
838
962
  * Initialize iterator.
839
963
  */
@@ -935,7 +1059,7 @@ SH_STAT(SH_TYPE * tb)
935
1059
  double fillfactor;
936
1060
  uint32 i;
937
1061
 
938
- uint32 *collisions = palloc0(tb->size * sizeof(uint32));
1062
+ uint32 *collisions = (uint32 *) palloc0(tb->size * sizeof(uint32));
939
1063
  uint32 total_collisions = 0;
940
1064
  uint32 max_collisions = 0;
941
1065
  double avg_collisions;
@@ -990,7 +1114,7 @@ SH_STAT(SH_TYPE * tb)
990
1114
  avg_collisions = 0;
991
1115
  }
992
1116
 
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",
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",
994
1118
  tb->size, tb->members, fillfactor, total_chain_length, max_chain_length, avg_chain_length,
995
1119
  total_collisions, max_collisions, avg_collisions);
996
1120
  }
@@ -1036,6 +1160,7 @@ SH_STAT(SH_TYPE * tb)
1036
1160
  #undef SH_RESET
1037
1161
  #undef SH_INSERT
1038
1162
  #undef SH_INSERT_HASH
1163
+ #undef SH_DELETE_ITEM
1039
1164
  #undef SH_DELETE
1040
1165
  #undef SH_LOOKUP
1041
1166
  #undef SH_LOOKUP_HASH