pg_query 2.1.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 (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. 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).
@@ -55,6 +86,11 @@
55
86
  * presence is relevant to determine whether a lookup needs to continue
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.
89
+ *
90
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
91
+ * Portions Copyright (c) 1994, Regents of the University of California
92
+ *
93
+ * src/include/lib/simplehash.h
58
94
  */
59
95
 
60
96
  #include "port/pg_bitutils.h"
@@ -79,6 +115,7 @@
79
115
  #define SH_RESET SH_MAKE_NAME(reset)
80
116
  #define SH_INSERT SH_MAKE_NAME(insert)
81
117
  #define SH_INSERT_HASH SH_MAKE_NAME(insert_hash)
118
+ #define SH_DELETE_ITEM SH_MAKE_NAME(delete_item)
82
119
  #define SH_DELETE SH_MAKE_NAME(delete)
83
120
  #define SH_LOOKUP SH_MAKE_NAME(lookup)
84
121
  #define SH_LOOKUP_HASH SH_MAKE_NAME(lookup_hash)
@@ -149,24 +186,62 @@ typedef struct SH_ITERATOR
149
186
 
150
187
  /* externally visible function prototypes */
151
188
  #ifdef SH_RAW_ALLOCATOR
189
+ /* <prefix>_hash <prefix>_create(uint32 nelements, void *private_data) */
152
190
  SH_SCOPE SH_TYPE *SH_CREATE(uint32 nelements, void *private_data);
153
191
  #else
192
+ /*
193
+ * <prefix>_hash <prefix>_create(MemoryContext ctx, uint32 nelements,
194
+ * void *private_data)
195
+ */
154
196
  SH_SCOPE SH_TYPE *SH_CREATE(MemoryContext ctx, uint32 nelements,
155
197
  void *private_data);
156
198
  #endif
199
+
200
+ /* void <prefix>_destroy(<prefix>_hash *tb) */
157
201
  SH_SCOPE void SH_DESTROY(SH_TYPE * tb);
202
+
203
+ /* void <prefix>_reset(<prefix>_hash *tb) */
158
204
  SH_SCOPE void SH_RESET(SH_TYPE * tb);
159
- SH_SCOPE void SH_GROW(SH_TYPE * tb, uint32 newsize);
205
+
206
+ /* void <prefix>_grow(<prefix>_hash *tb, uint64 newsize) */
207
+ SH_SCOPE void SH_GROW(SH_TYPE * tb, uint64 newsize);
208
+
209
+ /* <element> *<prefix>_insert(<prefix>_hash *tb, <key> key, bool *found) */
160
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
+ */
161
216
  SH_SCOPE SH_ELEMENT_TYPE *SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
162
217
  uint32 hash, bool *found);
218
+
219
+ /* <element> *<prefix>_lookup(<prefix>_hash *tb, <key> key) */
163
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) */
164
223
  SH_SCOPE SH_ELEMENT_TYPE *SH_LOOKUP_HASH(SH_TYPE * tb, SH_KEY_TYPE key,
165
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) */
166
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) */
167
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
+ */
168
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) */
169
242
  SH_SCOPE SH_ELEMENT_TYPE *SH_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter);
243
+
244
+ /* void <prefix>_stat(<prefix>_hash *tb */
170
245
  SH_SCOPE void SH_STAT(SH_TYPE * tb);
171
246
 
172
247
  #endif /* SH_DECLARE */
@@ -218,7 +293,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
218
293
  #define SIMPLEHASH_H
219
294
 
220
295
  #ifdef FRONTEND
221
- #define sh_error(...) pg_log_error(__VA_ARGS__)
296
+ #define sh_error(...) pg_fatal(__VA_ARGS__)
222
297
  #define sh_log(...) pg_log_info(__VA_ARGS__)
223
298
  #else
224
299
  #define sh_error(...) elog(ERROR, __VA_ARGS__)
@@ -232,7 +307,7 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb);
232
307
  * the hashtable.
233
308
  */
234
309
  static inline void
235
- SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint32 newsize)
310
+ SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint64 newsize)
236
311
  {
237
312
  uint64 size;
238
313
 
@@ -247,16 +322,12 @@ SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint32 newsize)
247
322
  * Verify that allocation of ->data is possible on this platform, without
248
323
  * overflowing Size.
249
324
  */
250
- if ((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2)
325
+ if (unlikely((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2))
251
326
  sh_error("hash table too large");
252
327
 
253
328
  /* now set size */
254
329
  tb->size = size;
255
-
256
- if (tb->size == SH_MAX_SIZE)
257
- tb->sizemask = 0;
258
- else
259
- tb->sizemask = tb->size - 1;
330
+ tb->sizemask = (uint32) (size - 1);
260
331
 
261
332
  /*
262
333
  * Compute the next threshold at which we need to grow the hash table
@@ -365,9 +436,9 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
365
436
  uint64 size;
366
437
 
367
438
  #ifdef SH_RAW_ALLOCATOR
368
- tb = SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
439
+ tb = (SH_TYPE *) SH_RAW_ALLOCATOR(sizeof(SH_TYPE));
369
440
  #else
370
- tb = MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
441
+ tb = (SH_TYPE *) MemoryContextAllocZero(ctx, sizeof(SH_TYPE));
371
442
  tb->ctx = ctx;
372
443
  #endif
373
444
  tb->private_data = private_data;
@@ -377,7 +448,7 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data)
377
448
 
378
449
  SH_COMPUTE_PARAMETERS(tb, size);
379
450
 
380
- 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);
381
452
 
382
453
  return tb;
383
454
  }
@@ -406,7 +477,7 @@ SH_RESET(SH_TYPE * tb)
406
477
  * performance-wise, when known at some point.
407
478
  */
408
479
  SH_SCOPE void
409
- SH_GROW(SH_TYPE * tb, uint32 newsize)
480
+ SH_GROW(SH_TYPE * tb, uint64 newsize)
410
481
  {
411
482
  uint64 oldsize = tb->size;
412
483
  SH_ELEMENT_TYPE *olddata = tb->data;
@@ -422,7 +493,7 @@ SH_GROW(SH_TYPE * tb, uint32 newsize)
422
493
  /* compute parameters for new table */
423
494
  SH_COMPUTE_PARAMETERS(tb, newsize);
424
495
 
425
- 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);
426
497
 
427
498
  newdata = tb->data;
428
499
 
@@ -536,10 +607,8 @@ restart:
536
607
  */
537
608
  if (unlikely(tb->members >= tb->grow_threshold))
538
609
  {
539
- if (tb->size == SH_MAX_SIZE)
540
- {
610
+ if (unlikely(tb->size == SH_MAX_SIZE))
541
611
  sh_error("hash table size exceeded");
542
- }
543
612
 
544
613
  /*
545
614
  * When optimizing, it can be very useful to print these out.
@@ -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