pg_query 5.1.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1 -1
  4. data/Rakefile +4 -4
  5. data/ext/pg_query/ext_symbols_freebsd.sym +1 -0
  6. data/ext/pg_query/ext_symbols_freebsd_with_ruby_abi_version.sym +2 -0
  7. data/ext/pg_query/ext_symbols_openbsd.sym +1 -0
  8. data/ext/pg_query/ext_symbols_openbsd_with_ruby_abi_version.sym +2 -0
  9. data/ext/pg_query/ext_symbols_with_ruby_abi_version.sym +2 -0
  10. data/ext/pg_query/extconf.rb +20 -6
  11. data/ext/pg_query/include/pg_query.h +4 -3
  12. data/ext/pg_query/include/pg_query_enum_defs.c +424 -154
  13. data/ext/pg_query/include/pg_query_fingerprint_conds.c +68 -4
  14. data/ext/pg_query/include/pg_query_fingerprint_defs.c +2952 -1845
  15. data/ext/pg_query/include/pg_query_outfuncs_conds.c +51 -3
  16. data/ext/pg_query/include/pg_query_outfuncs_defs.c +210 -23
  17. data/ext/pg_query/include/pg_query_readfuncs_conds.c +17 -1
  18. data/ext/pg_query/include/pg_query_readfuncs_defs.c +271 -52
  19. data/ext/pg_query/include/postgres/access/amapi.h +14 -3
  20. data/ext/pg_query/include/postgres/access/attmap.h +1 -1
  21. data/ext/pg_query/include/postgres/access/attnum.h +1 -1
  22. data/ext/pg_query/include/postgres/access/brin_internal.h +116 -0
  23. data/ext/pg_query/include/postgres/access/brin_tuple.h +112 -0
  24. data/ext/pg_query/include/postgres/access/clog.h +2 -3
  25. data/ext/pg_query/include/postgres/access/commit_ts.h +2 -3
  26. data/ext/pg_query/include/postgres/access/detoast.h +1 -1
  27. data/ext/pg_query/include/postgres/access/genam.h +17 -4
  28. data/ext/pg_query/include/postgres/access/gin.h +1 -1
  29. data/ext/pg_query/include/postgres/access/htup.h +1 -1
  30. data/ext/pg_query/include/postgres/access/htup_details.h +11 -11
  31. data/ext/pg_query/include/postgres/access/itup.h +3 -3
  32. data/ext/pg_query/include/postgres/access/parallel.h +1 -2
  33. data/ext/pg_query/include/postgres/access/printtup.h +1 -1
  34. data/ext/pg_query/include/postgres/access/relation.h +1 -1
  35. data/ext/pg_query/include/postgres/access/relscan.h +1 -1
  36. data/ext/pg_query/include/postgres/access/rmgrlist.h +1 -1
  37. data/ext/pg_query/include/postgres/access/sdir.h +1 -1
  38. data/ext/pg_query/include/postgres/access/skey.h +1 -1
  39. data/ext/pg_query/include/postgres/access/slru.h +218 -0
  40. data/ext/pg_query/include/postgres/access/stratnum.h +1 -1
  41. data/ext/pg_query/include/postgres/access/sysattr.h +1 -1
  42. data/ext/pg_query/include/postgres/access/table.h +1 -1
  43. data/ext/pg_query/include/postgres/access/tableam.h +35 -25
  44. data/ext/pg_query/include/postgres/access/tidstore.h +50 -0
  45. data/ext/pg_query/include/postgres/access/toast_compression.h +2 -2
  46. data/ext/pg_query/include/postgres/access/transam.h +50 -7
  47. data/ext/pg_query/include/postgres/access/tsmapi.h +1 -1
  48. data/ext/pg_query/include/postgres/access/tupconvert.h +1 -1
  49. data/ext/pg_query/include/postgres/access/tupdesc.h +5 -5
  50. data/ext/pg_query/include/postgres/access/tupmacs.h +1 -1
  51. data/ext/pg_query/include/postgres/access/twophase.h +2 -2
  52. data/ext/pg_query/include/postgres/access/xact.h +5 -5
  53. data/ext/pg_query/include/postgres/access/xlog.h +20 -12
  54. data/ext/pg_query/include/postgres/access/xlog_internal.h +4 -3
  55. data/ext/pg_query/include/postgres/access/xlogbackup.h +3 -1
  56. data/ext/pg_query/include/postgres/access/xlogdefs.h +5 -5
  57. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +2 -2
  58. data/ext/pg_query/include/postgres/access/xlogreader.h +2 -2
  59. data/ext/pg_query/include/postgres/access/xlogrecord.h +3 -3
  60. data/ext/pg_query/include/postgres/access/xlogrecovery.h +4 -4
  61. data/ext/pg_query/include/postgres/archive/archive_module.h +9 -1
  62. data/ext/pg_query/include/postgres/c.h +32 -37
  63. data/ext/pg_query/include/postgres/catalog/catalog.h +3 -1
  64. data/ext/pg_query/include/postgres/catalog/catversion.h +2 -2
  65. data/ext/pg_query/include/postgres/catalog/dependency.h +17 -59
  66. data/ext/pg_query/include/postgres/catalog/genbki.h +12 -6
  67. data/ext/pg_query/include/postgres/catalog/index.h +22 -18
  68. data/ext/pg_query/include/postgres/catalog/indexing.h +1 -1
  69. data/ext/pg_query/include/postgres/catalog/namespace.h +18 -19
  70. data/ext/pg_query/include/postgres/catalog/objectaccess.h +2 -2
  71. data/ext/pg_query/include/postgres/catalog/objectaddress.h +5 -1
  72. data/ext/pg_query/include/postgres/catalog/pg_aggregate.h +4 -2
  73. data/ext/pg_query/include/postgres/catalog/pg_aggregate_d.h +1 -1
  74. data/ext/pg_query/include/postgres/catalog/pg_am.h +6 -3
  75. data/ext/pg_query/include/postgres/catalog/pg_am_d.h +1 -1
  76. data/ext/pg_query/include/postgres/catalog/pg_attribute.h +31 -14
  77. data/ext/pg_query/include/postgres/catalog/pg_attribute_d.h +3 -3
  78. data/ext/pg_query/include/postgres/catalog/pg_authid.h +6 -3
  79. data/ext/pg_query/include/postgres/catalog/pg_authid_d.h +2 -1
  80. data/ext/pg_query/include/postgres/catalog/pg_class.h +10 -5
  81. data/ext/pg_query/include/postgres/catalog/pg_class_d.h +4 -2
  82. data/ext/pg_query/include/postgres/catalog/pg_collation.h +11 -5
  83. data/ext/pg_query/include/postgres/catalog/pg_collation_d.h +5 -2
  84. data/ext/pg_query/include/postgres/catalog/pg_constraint.h +15 -10
  85. data/ext/pg_query/include/postgres/catalog/pg_constraint_d.h +2 -1
  86. data/ext/pg_query/include/postgres/catalog/pg_control.h +5 -3
  87. data/ext/pg_query/include/postgres/catalog/pg_conversion.h +8 -4
  88. data/ext/pg_query/include/postgres/catalog/pg_conversion_d.h +1 -1
  89. data/ext/pg_query/include/postgres/catalog/pg_database.h +9 -4
  90. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +13 -12
  91. data/ext/pg_query/include/postgres/catalog/pg_depend.h +3 -3
  92. data/ext/pg_query/include/postgres/catalog/pg_depend_d.h +1 -1
  93. data/ext/pg_query/include/postgres/catalog/pg_event_trigger.h +6 -3
  94. data/ext/pg_query/include/postgres/catalog/pg_event_trigger_d.h +1 -1
  95. data/ext/pg_query/include/postgres/catalog/pg_index.h +5 -3
  96. data/ext/pg_query/include/postgres/catalog/pg_index_d.h +1 -1
  97. data/ext/pg_query/include/postgres/catalog/pg_language.h +6 -3
  98. data/ext/pg_query/include/postgres/catalog/pg_language_d.h +1 -1
  99. data/ext/pg_query/include/postgres/catalog/pg_namespace.h +6 -3
  100. data/ext/pg_query/include/postgres/catalog/pg_namespace_d.h +1 -1
  101. data/ext/pg_query/include/postgres/catalog/pg_opclass.h +6 -3
  102. data/ext/pg_query/include/postgres/catalog/pg_opclass_d.h +1 -1
  103. data/ext/pg_query/include/postgres/catalog/pg_operator.h +20 -3
  104. data/ext/pg_query/include/postgres/catalog/pg_operator_d.h +1 -1
  105. data/ext/pg_query/include/postgres/catalog/pg_opfamily.h +6 -3
  106. data/ext/pg_query/include/postgres/catalog/pg_opfamily_d.h +1 -1
  107. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table.h +4 -2
  108. data/ext/pg_query/include/postgres/catalog/pg_partitioned_table_d.h +1 -1
  109. data/ext/pg_query/include/postgres/catalog/pg_proc.h +6 -3
  110. data/ext/pg_query/include/postgres/catalog/pg_proc_d.h +1 -1
  111. data/ext/pg_query/include/postgres/catalog/pg_publication.h +6 -3
  112. data/ext/pg_query/include/postgres/catalog/pg_publication_d.h +1 -1
  113. data/ext/pg_query/include/postgres/catalog/pg_replication_origin.h +6 -3
  114. data/ext/pg_query/include/postgres/catalog/pg_replication_origin_d.h +1 -1
  115. data/ext/pg_query/include/postgres/catalog/pg_statistic.h +10 -4
  116. data/ext/pg_query/include/postgres/catalog/pg_statistic_d.h +7 -3
  117. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext.h +10 -7
  118. data/ext/pg_query/include/postgres/catalog/pg_statistic_ext_d.h +3 -3
  119. data/ext/pg_query/include/postgres/catalog/pg_transform.h +6 -3
  120. data/ext/pg_query/include/postgres/catalog/pg_transform_d.h +1 -1
  121. data/ext/pg_query/include/postgres/catalog/pg_trigger.h +4 -4
  122. data/ext/pg_query/include/postgres/catalog/pg_trigger_d.h +1 -1
  123. data/ext/pg_query/include/postgres/catalog/pg_ts_config.h +6 -3
  124. data/ext/pg_query/include/postgres/catalog/pg_ts_config_d.h +1 -1
  125. data/ext/pg_query/include/postgres/catalog/pg_ts_dict.h +6 -3
  126. data/ext/pg_query/include/postgres/catalog/pg_ts_dict_d.h +1 -1
  127. data/ext/pg_query/include/postgres/catalog/pg_ts_parser.h +6 -3
  128. data/ext/pg_query/include/postgres/catalog/pg_ts_parser_d.h +1 -1
  129. data/ext/pg_query/include/postgres/catalog/pg_ts_template.h +6 -3
  130. data/ext/pg_query/include/postgres/catalog/pg_ts_template_d.h +1 -1
  131. data/ext/pg_query/include/postgres/catalog/pg_type.h +6 -3
  132. data/ext/pg_query/include/postgres/catalog/pg_type_d.h +1 -1
  133. data/ext/pg_query/include/postgres/catalog/storage.h +1 -1
  134. data/ext/pg_query/include/postgres/catalog/syscache_ids.h +104 -0
  135. data/ext/pg_query/include/postgres/commands/async.h +2 -6
  136. data/ext/pg_query/include/postgres/commands/dbcommands.h +1 -1
  137. data/ext/pg_query/include/postgres/commands/defrem.h +6 -6
  138. data/ext/pg_query/include/postgres/commands/event_trigger.h +11 -2
  139. data/ext/pg_query/include/postgres/commands/explain.h +19 -3
  140. data/ext/pg_query/include/postgres/commands/prepare.h +1 -1
  141. data/ext/pg_query/include/postgres/commands/tablespace.h +1 -1
  142. data/ext/pg_query/include/postgres/commands/trigger.h +1 -1
  143. data/ext/pg_query/include/postgres/commands/vacuum.h +28 -26
  144. data/ext/pg_query/include/postgres/common/cryptohash.h +2 -2
  145. data/ext/pg_query/include/postgres/common/file_perm.h +1 -1
  146. data/ext/pg_query/include/postgres/common/file_utils.h +65 -0
  147. data/ext/pg_query/include/postgres/common/hashfn.h +16 -1
  148. data/ext/pg_query/include/postgres/common/hashfn_unstable.h +407 -0
  149. data/ext/pg_query/include/postgres/common/int.h +79 -4
  150. data/ext/pg_query/include/postgres/common/keywords.h +1 -1
  151. data/ext/pg_query/include/postgres/common/kwlookup.h +1 -1
  152. data/ext/pg_query/include/postgres/common/pg_prng.h +2 -1
  153. data/ext/pg_query/include/postgres/common/relpath.h +4 -4
  154. data/ext/pg_query/include/postgres/common/scram-common.h +1 -1
  155. data/ext/pg_query/include/postgres/common/sha2.h +1 -1
  156. data/ext/pg_query/include/postgres/common/string.h +1 -1
  157. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +2 -3
  158. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +278 -30
  159. data/ext/pg_query/include/postgres/copyfuncs.switch.c +55 -4
  160. data/ext/pg_query/include/postgres/datatype/timestamp.h +29 -3
  161. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +239 -26
  162. data/ext/pg_query/include/postgres/equalfuncs.switch.c +55 -4
  163. data/ext/pg_query/include/postgres/executor/execdesc.h +2 -2
  164. data/ext/pg_query/include/postgres/executor/executor.h +6 -5
  165. data/ext/pg_query/include/postgres/executor/functions.h +2 -1
  166. data/ext/pg_query/include/postgres/executor/instrument.h +5 -3
  167. data/ext/pg_query/include/postgres/executor/spi.h +2 -8
  168. data/ext/pg_query/include/postgres/executor/tablefunc.h +1 -1
  169. data/ext/pg_query/include/postgres/executor/tuptable.h +31 -2
  170. data/ext/pg_query/include/postgres/fmgr.h +2 -2
  171. data/ext/pg_query/include/postgres/foreign/fdwapi.h +1 -1
  172. data/ext/pg_query/include/postgres/funcapi.h +2 -2
  173. data/ext/pg_query/include/postgres/gram.h +871 -830
  174. data/ext/pg_query/include/postgres/gramparse.h +1 -1
  175. data/ext/pg_query/include/postgres/jit/jit.h +4 -3
  176. data/ext/pg_query/include/postgres/kwlist_d.h +511 -466
  177. data/ext/pg_query/include/postgres/lib/dshash.h +25 -10
  178. data/ext/pg_query/include/postgres/lib/ilist.h +1 -1
  179. data/ext/pg_query/include/postgres/lib/pairingheap.h +1 -1
  180. data/ext/pg_query/include/postgres/lib/simplehash.h +40 -18
  181. data/ext/pg_query/include/postgres/lib/sort_template.h +14 -1
  182. data/ext/pg_query/include/postgres/lib/stringinfo.h +93 -11
  183. data/ext/pg_query/include/postgres/libpq/auth.h +1 -1
  184. data/ext/pg_query/include/postgres/libpq/crypt.h +2 -2
  185. data/ext/pg_query/include/postgres/libpq/hba.h +4 -4
  186. data/ext/pg_query/include/postgres/libpq/libpq-be.h +35 -28
  187. data/ext/pg_query/include/postgres/libpq/libpq.h +6 -7
  188. data/ext/pg_query/include/postgres/libpq/pqcomm.h +26 -20
  189. data/ext/pg_query/include/postgres/libpq/pqformat.h +2 -3
  190. data/ext/pg_query/include/postgres/libpq/pqsignal.h +1 -1
  191. data/ext/pg_query/include/postgres/libpq/protocol.h +89 -0
  192. data/ext/pg_query/include/postgres/libpq/sasl.h +1 -1
  193. data/ext/pg_query/include/postgres/libpq/scram.h +1 -1
  194. data/ext/pg_query/include/postgres/mb/pg_wchar.h +103 -82
  195. data/ext/pg_query/include/postgres/mb/stringinfo_mb.h +1 -1
  196. data/ext/pg_query/include/postgres/miscadmin.h +72 -52
  197. data/ext/pg_query/include/postgres/nodes/bitmapset.h +17 -3
  198. data/ext/pg_query/include/postgres/nodes/execnodes.h +112 -25
  199. data/ext/pg_query/include/postgres/nodes/extensible.h +1 -1
  200. data/ext/pg_query/include/postgres/nodes/lockoptions.h +4 -4
  201. data/ext/pg_query/include/postgres/nodes/makefuncs.h +8 -2
  202. data/ext/pg_query/include/postgres/nodes/memnodes.h +43 -4
  203. data/ext/pg_query/include/postgres/nodes/miscnodes.h +1 -1
  204. data/ext/pg_query/include/postgres/nodes/nodeFuncs.h +1 -1
  205. data/ext/pg_query/include/postgres/nodes/nodes.h +30 -41
  206. data/ext/pg_query/include/postgres/nodes/nodetags.h +464 -444
  207. data/ext/pg_query/include/postgres/nodes/params.h +1 -1
  208. data/ext/pg_query/include/postgres/nodes/parsenodes.h +358 -175
  209. data/ext/pg_query/include/postgres/nodes/pathnodes.h +64 -10
  210. data/ext/pg_query/include/postgres/nodes/pg_list.h +62 -11
  211. data/ext/pg_query/include/postgres/nodes/plannodes.h +11 -10
  212. data/ext/pg_query/include/postgres/nodes/primnodes.h +352 -54
  213. data/ext/pg_query/include/postgres/nodes/print.h +1 -1
  214. data/ext/pg_query/include/postgres/nodes/queryjumble.h +2 -2
  215. data/ext/pg_query/include/postgres/nodes/replnodes.h +23 -2
  216. data/ext/pg_query/include/postgres/nodes/supportnodes.h +1 -1
  217. data/ext/pg_query/include/postgres/nodes/tidbitmap.h +1 -1
  218. data/ext/pg_query/include/postgres/nodes/value.h +1 -1
  219. data/ext/pg_query/include/postgres/optimizer/cost.h +5 -4
  220. data/ext/pg_query/include/postgres/optimizer/geqo.h +1 -1
  221. data/ext/pg_query/include/postgres/optimizer/geqo_gene.h +1 -1
  222. data/ext/pg_query/include/postgres/optimizer/optimizer.h +5 -2
  223. data/ext/pg_query/include/postgres/optimizer/paths.h +13 -8
  224. data/ext/pg_query/include/postgres/optimizer/planmain.h +7 -1
  225. data/ext/pg_query/include/postgres/parser/analyze.h +3 -1
  226. data/ext/pg_query/include/postgres/parser/kwlist.h +22 -2
  227. data/ext/pg_query/include/postgres/parser/parse_agg.h +1 -1
  228. data/ext/pg_query/include/postgres/parser/parse_coerce.h +5 -2
  229. data/ext/pg_query/include/postgres/parser/parse_expr.h +1 -1
  230. data/ext/pg_query/include/postgres/parser/parse_func.h +2 -2
  231. data/ext/pg_query/include/postgres/parser/parse_node.h +3 -2
  232. data/ext/pg_query/include/postgres/parser/parse_oper.h +4 -1
  233. data/ext/pg_query/include/postgres/parser/parse_relation.h +1 -1
  234. data/ext/pg_query/include/postgres/parser/parse_type.h +2 -2
  235. data/ext/pg_query/include/postgres/parser/parser.h +3 -3
  236. data/ext/pg_query/include/postgres/parser/parsetree.h +1 -1
  237. data/ext/pg_query/include/postgres/parser/scanner.h +1 -1
  238. data/ext/pg_query/include/postgres/parser/scansup.h +1 -1
  239. data/ext/pg_query/include/postgres/partitioning/partdefs.h +1 -1
  240. data/ext/pg_query/include/postgres/pg_config.h +53 -45
  241. data/ext/pg_query/include/postgres/pg_config_manual.h +21 -8
  242. data/ext/pg_query/include/postgres/pg_getopt.h +1 -1
  243. data/ext/pg_query/include/postgres/pg_trace.h +1 -1
  244. data/ext/pg_query/include/postgres/pgstat.h +13 -11
  245. data/ext/pg_query/include/postgres/pgtime.h +1 -1
  246. data/ext/pg_query/include/postgres/pl_reserved_kwlist.h +1 -1
  247. data/ext/pg_query/include/postgres/pl_reserved_kwlist_d.h +1 -1
  248. data/ext/pg_query/include/postgres/pl_unreserved_kwlist.h +1 -1
  249. data/ext/pg_query/include/postgres/pl_unreserved_kwlist_d.h +1 -1
  250. data/ext/pg_query/include/postgres/plerrcodes.h +4 -4
  251. data/ext/pg_query/include/postgres/plpgsql.h +15 -13
  252. data/ext/pg_query/include/postgres/port/atomics/arch-arm.h +1 -1
  253. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +1 -1
  254. data/ext/pg_query/include/postgres/port/atomics/arch-ppc.h +3 -1
  255. data/ext/pg_query/include/postgres/port/atomics/arch-x86.h +3 -1
  256. data/ext/pg_query/include/postgres/port/atomics/fallback.h +1 -1
  257. data/ext/pg_query/include/postgres/port/atomics/generic-gcc.h +38 -1
  258. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +19 -1
  259. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +16 -1
  260. data/ext/pg_query/include/postgres/port/atomics/generic.h +38 -2
  261. data/ext/pg_query/include/postgres/port/atomics.h +93 -6
  262. data/ext/pg_query/include/postgres/port/pg_bitutils.h +91 -9
  263. data/ext/pg_query/include/postgres/port/pg_bswap.h +1 -1
  264. data/ext/pg_query/include/postgres/port/pg_crc32c.h +10 -1
  265. data/ext/pg_query/include/postgres/port/pg_iovec.h +117 -0
  266. data/ext/pg_query/include/postgres/port/simd.h +48 -1
  267. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +8 -0
  268. data/ext/pg_query/include/postgres/port/win32_port.h +1 -13
  269. data/ext/pg_query/include/postgres/port.h +39 -4
  270. data/ext/pg_query/include/postgres/portability/instr_time.h +1 -1
  271. data/ext/pg_query/include/postgres/postgres.h +1 -1
  272. data/ext/pg_query/include/postgres/postmaster/autovacuum.h +5 -16
  273. data/ext/pg_query/include/postgres/postmaster/bgworker.h +8 -6
  274. data/ext/pg_query/include/postgres/postmaster/bgworker_internals.h +3 -7
  275. data/ext/pg_query/include/postgres/postmaster/bgwriter.h +3 -3
  276. data/ext/pg_query/include/postgres/postmaster/interrupt.h +1 -1
  277. data/ext/pg_query/include/postgres/postmaster/pgarch.h +2 -2
  278. data/ext/pg_query/include/postgres/postmaster/postmaster.h +25 -5
  279. data/ext/pg_query/include/postgres/postmaster/startup.h +2 -2
  280. data/ext/pg_query/include/postgres/postmaster/syslogger.h +2 -4
  281. data/ext/pg_query/include/postgres/postmaster/walsummarizer.h +35 -0
  282. data/ext/pg_query/include/postgres/postmaster/walwriter.h +2 -2
  283. data/ext/pg_query/include/postgres/regex/regex.h +92 -9
  284. data/ext/pg_query/include/postgres/replication/logicallauncher.h +1 -1
  285. data/ext/pg_query/include/postgres/replication/logicalproto.h +2 -2
  286. data/ext/pg_query/include/postgres/replication/logicalworker.h +2 -1
  287. data/ext/pg_query/include/postgres/replication/origin.h +1 -1
  288. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +27 -46
  289. data/ext/pg_query/include/postgres/replication/slot.h +45 -5
  290. data/ext/pg_query/include/postgres/replication/slotsync.h +38 -0
  291. data/ext/pg_query/include/postgres/replication/syncrep.h +1 -1
  292. data/ext/pg_query/include/postgres/replication/walreceiver.h +37 -11
  293. data/ext/pg_query/include/postgres/replication/walsender.h +5 -3
  294. data/ext/pg_query/include/postgres/rewrite/prs2lock.h +1 -1
  295. data/ext/pg_query/include/postgres/rewrite/rewriteHandler.h +7 -1
  296. data/ext/pg_query/include/postgres/rewrite/rewriteManip.h +2 -2
  297. data/ext/pg_query/include/postgres/rewrite/rewriteSupport.h +1 -1
  298. data/ext/pg_query/include/postgres/storage/block.h +1 -1
  299. data/ext/pg_query/include/postgres/storage/buf.h +1 -1
  300. data/ext/pg_query/include/postgres/storage/bufmgr.h +59 -41
  301. data/ext/pg_query/include/postgres/storage/bufpage.h +1 -1
  302. data/ext/pg_query/include/postgres/storage/condition_variable.h +1 -1
  303. data/ext/pg_query/include/postgres/storage/dsm.h +1 -1
  304. data/ext/pg_query/include/postgres/storage/dsm_impl.h +2 -2
  305. data/ext/pg_query/include/postgres/storage/fd.h +30 -13
  306. data/ext/pg_query/include/postgres/storage/fileset.h +1 -1
  307. data/ext/pg_query/include/postgres/storage/ipc.h +4 -1
  308. data/ext/pg_query/include/postgres/storage/item.h +1 -1
  309. data/ext/pg_query/include/postgres/storage/itemid.h +1 -1
  310. data/ext/pg_query/include/postgres/storage/itemptr.h +1 -1
  311. data/ext/pg_query/include/postgres/storage/large_object.h +1 -1
  312. data/ext/pg_query/include/postgres/storage/latch.h +4 -2
  313. data/ext/pg_query/include/postgres/storage/lmgr.h +8 -2
  314. data/ext/pg_query/include/postgres/storage/lock.h +19 -19
  315. data/ext/pg_query/include/postgres/storage/lockdefs.h +3 -1
  316. data/ext/pg_query/include/postgres/storage/lwlock.h +17 -9
  317. data/ext/pg_query/include/postgres/storage/lwlocknames.h +7 -10
  318. data/ext/pg_query/include/postgres/storage/off.h +1 -1
  319. data/ext/pg_query/include/postgres/storage/pg_sema.h +1 -1
  320. data/ext/pg_query/include/postgres/storage/pg_shmem.h +5 -4
  321. data/ext/pg_query/include/postgres/storage/pmsignal.h +2 -2
  322. data/ext/pg_query/include/postgres/storage/predicate.h +1 -5
  323. data/ext/pg_query/include/postgres/storage/proc.h +48 -26
  324. data/ext/pg_query/include/postgres/storage/procarray.h +5 -1
  325. data/ext/pg_query/include/postgres/storage/proclist_types.h +11 -9
  326. data/ext/pg_query/include/postgres/storage/procnumber.h +43 -0
  327. data/ext/pg_query/include/postgres/storage/procsignal.h +8 -6
  328. data/ext/pg_query/include/postgres/storage/read_stream.h +65 -0
  329. data/ext/pg_query/include/postgres/storage/relfilelocator.h +16 -15
  330. data/ext/pg_query/include/postgres/storage/s_lock.h +7 -27
  331. data/ext/pg_query/include/postgres/storage/sharedfileset.h +1 -1
  332. data/ext/pg_query/include/postgres/storage/shm_mq.h +2 -2
  333. data/ext/pg_query/include/postgres/storage/shm_toc.h +1 -1
  334. data/ext/pg_query/include/postgres/storage/shmem.h +1 -1
  335. data/ext/pg_query/include/postgres/storage/sinval.h +3 -3
  336. data/ext/pg_query/include/postgres/storage/smgr.h +46 -29
  337. data/ext/pg_query/include/postgres/storage/spin.h +1 -1
  338. data/ext/pg_query/include/postgres/storage/standby.h +13 -3
  339. data/ext/pg_query/include/postgres/storage/standbydefs.h +2 -2
  340. data/ext/pg_query/include/postgres/storage/sync.h +4 -4
  341. data/ext/pg_query/include/postgres/tcop/cmdtag.h +1 -2
  342. data/ext/pg_query/include/postgres/tcop/cmdtaglist.h +3 -2
  343. data/ext/pg_query/include/postgres/tcop/deparse_utility.h +2 -2
  344. data/ext/pg_query/include/postgres/tcop/dest.h +3 -2
  345. data/ext/pg_query/include/postgres/tcop/fastpath.h +1 -1
  346. data/ext/pg_query/include/postgres/tcop/pquery.h +1 -1
  347. data/ext/pg_query/include/postgres/tcop/tcopprot.h +9 -5
  348. data/ext/pg_query/include/postgres/tcop/utility.h +2 -2
  349. data/ext/pg_query/include/postgres/tsearch/ts_cache.h +1 -1
  350. data/ext/pg_query/include/postgres/utils/acl.h +19 -7
  351. data/ext/pg_query/include/postgres/utils/aclchk_internal.h +1 -1
  352. data/ext/pg_query/include/postgres/utils/array.h +1 -2
  353. data/ext/pg_query/include/postgres/utils/ascii.h +84 -0
  354. data/ext/pg_query/include/postgres/utils/backend_progress.h +3 -2
  355. data/ext/pg_query/include/postgres/utils/backend_status.h +8 -10
  356. data/ext/pg_query/include/postgres/utils/builtins.h +4 -1
  357. data/ext/pg_query/include/postgres/utils/bytea.h +2 -2
  358. data/ext/pg_query/include/postgres/utils/catcache.h +6 -6
  359. data/ext/pg_query/include/postgres/utils/date.h +1 -1
  360. data/ext/pg_query/include/postgres/utils/datetime.h +4 -1
  361. data/ext/pg_query/include/postgres/utils/datum.h +1 -1
  362. data/ext/pg_query/include/postgres/utils/dsa.h +44 -5
  363. data/ext/pg_query/include/postgres/utils/elog.h +3 -8
  364. data/ext/pg_query/include/postgres/utils/errcodes.h +1 -3
  365. data/ext/pg_query/include/postgres/utils/expandeddatum.h +1 -1
  366. data/ext/pg_query/include/postgres/utils/expandedrecord.h +1 -1
  367. data/ext/pg_query/include/postgres/utils/float.h +1 -1
  368. data/ext/pg_query/include/postgres/utils/fmgroids.h +49 -16
  369. data/ext/pg_query/include/postgres/utils/fmgrprotos.h +47 -14
  370. data/ext/pg_query/include/postgres/utils/fmgrtab.h +1 -1
  371. data/ext/pg_query/include/postgres/utils/guc.h +20 -6
  372. data/ext/pg_query/include/postgres/utils/guc_hooks.h +23 -2
  373. data/ext/pg_query/include/postgres/utils/guc_tables.h +6 -5
  374. data/ext/pg_query/include/postgres/utils/hsearch.h +2 -2
  375. data/ext/pg_query/include/postgres/utils/injection_point.h +44 -0
  376. data/ext/pg_query/include/postgres/utils/inval.h +1 -1
  377. data/ext/pg_query/include/postgres/utils/logtape.h +5 -5
  378. data/ext/pg_query/include/postgres/utils/lsyscache.h +6 -3
  379. data/ext/pg_query/include/postgres/utils/memdebug.h +1 -1
  380. data/ext/pg_query/include/postgres/utils/memutils.h +12 -5
  381. data/ext/pg_query/include/postgres/utils/memutils_internal.h +53 -13
  382. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +25 -9
  383. data/ext/pg_query/include/postgres/utils/numeric.h +6 -1
  384. data/ext/pg_query/include/postgres/utils/palloc.h +1 -15
  385. data/ext/pg_query/include/postgres/utils/partcache.h +1 -1
  386. data/ext/pg_query/include/postgres/utils/pg_locale.h +8 -7
  387. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +30 -17
  388. data/ext/pg_query/include/postgres/utils/plancache.h +5 -3
  389. data/ext/pg_query/include/postgres/utils/portal.h +10 -10
  390. data/ext/pg_query/include/postgres/utils/queryenvironment.h +2 -2
  391. data/ext/pg_query/include/postgres/utils/regproc.h +1 -1
  392. data/ext/pg_query/include/postgres/utils/rel.h +14 -15
  393. data/ext/pg_query/include/postgres/utils/relcache.h +2 -5
  394. data/ext/pg_query/include/postgres/utils/reltrigger.h +1 -1
  395. data/ext/pg_query/include/postgres/utils/resowner.h +90 -9
  396. data/ext/pg_query/include/postgres/utils/ruleutils.h +1 -1
  397. data/ext/pg_query/include/postgres/utils/sharedtuplestore.h +1 -1
  398. data/ext/pg_query/include/postgres/utils/snapmgr.h +1 -52
  399. data/ext/pg_query/include/postgres/utils/snapshot.h +2 -2
  400. data/ext/pg_query/include/postgres/utils/sortsupport.h +1 -1
  401. data/ext/pg_query/include/postgres/utils/syscache.h +7 -98
  402. data/ext/pg_query/include/postgres/utils/timeout.h +3 -2
  403. data/ext/pg_query/include/postgres/utils/timestamp.h +1 -1
  404. data/ext/pg_query/include/postgres/utils/tuplesort.h +36 -9
  405. data/ext/pg_query/include/postgres/utils/tuplestore.h +2 -5
  406. data/ext/pg_query/include/postgres/utils/typcache.h +2 -1
  407. data/ext/pg_query/include/postgres/utils/varlena.h +1 -1
  408. data/ext/pg_query/include/postgres/utils/wait_event.h +28 -214
  409. data/ext/pg_query/include/postgres/utils/wait_event_types.h +218 -0
  410. data/ext/pg_query/include/postgres/utils/xml.h +4 -4
  411. data/ext/pg_query/include/postgres/varatt.h +1 -1
  412. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1546 -792
  413. data/ext/pg_query/include/protobuf/pg_query.pb.h +58365 -46595
  414. data/ext/pg_query/pg_query.pb-c.c +6598 -3739
  415. data/ext/pg_query/pg_query_normalize.c +42 -1
  416. data/ext/pg_query/pg_query_outfuncs_json.c +3 -1
  417. data/ext/pg_query/pg_query_parse_plpgsql.c +12 -13
  418. data/ext/pg_query/pg_query_readfuncs_protobuf.c +2 -2
  419. data/ext/pg_query/pg_query_scan.c +1 -1
  420. data/ext/pg_query/postgres_deparse.c +601 -172
  421. data/ext/pg_query/src_backend_catalog_namespace.c +241 -66
  422. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -3
  423. data/ext/pg_query/src_backend_commands_define.c +2 -3
  424. data/ext/pg_query/src_backend_nodes_bitmapset.c +137 -94
  425. data/ext/pg_query/src_backend_nodes_copyfuncs.c +1 -1
  426. data/ext/pg_query/src_backend_nodes_equalfuncs.c +1 -1
  427. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  428. data/ext/pg_query/src_backend_nodes_list.c +3 -7
  429. data/ext/pg_query/src_backend_nodes_makefuncs.c +59 -20
  430. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +109 -2
  431. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  432. data/ext/pg_query/src_backend_parser_gram.c +34491 -32136
  433. data/ext/pg_query/src_backend_parser_parser.c +8 -8
  434. data/ext/pg_query/src_backend_parser_scan.c +5637 -3028
  435. data/ext/pg_query/src_backend_parser_scansup.c +2 -1
  436. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  437. data/ext/pg_query/src_backend_tcop_postgres.c +34 -10
  438. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +2 -2
  439. data/ext/pg_query/src_backend_utils_adt_datum.c +8 -6
  440. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  441. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  442. data/ext/pg_query/src_backend_utils_adt_numutils.c +4 -5
  443. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +101 -28
  444. data/ext/pg_query/src_backend_utils_error_assert.c +1 -1
  445. data/ext/pg_query/src_backend_utils_error_elog.c +47 -42
  446. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +4 -2
  447. data/ext/pg_query/src_backend_utils_init_globals.c +15 -3
  448. data/ext/pg_query/src_backend_utils_mb_mbutils.c +11 -18
  449. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +16 -6
  450. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +8 -5
  451. data/ext/pg_query/src_backend_utils_mmgr_aset.c +308 -238
  452. data/ext/pg_query/src_backend_utils_mmgr_bump.c +728 -0
  453. data/ext/pg_query/src_backend_utils_mmgr_generation.c +273 -197
  454. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +270 -215
  455. data/ext/pg_query/src_backend_utils_mmgr_slab.c +154 -96
  456. data/ext/pg_query/src_common_encnames.c +43 -44
  457. data/ext/pg_query/src_common_hashfn.c +1 -1
  458. data/ext/pg_query/src_common_keywords.c +1 -1
  459. data/ext/pg_query/src_common_kwlist_d.h +511 -466
  460. data/ext/pg_query/src_common_kwlookup.c +1 -1
  461. data/ext/pg_query/src_common_psprintf.c +3 -3
  462. data/ext/pg_query/src_common_stringinfo.c +18 -1
  463. data/ext/pg_query/src_common_wchar.c +92 -109
  464. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +99 -5
  465. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -1
  466. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +242 -143
  467. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  468. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  469. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +19 -1
  470. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +1 -1
  471. data/ext/pg_query/src_port_pg_bitutils.c +173 -28
  472. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  473. data/ext/pg_query/src_port_snprintf.c +15 -18
  474. data/ext/pg_query/src_port_strerror.c +1 -3
  475. data/ext/pg_query/src_port_strlcpy.c +1 -1
  476. data/lib/pg_query/fingerprint.rb +3 -5
  477. data/lib/pg_query/param_refs.rb +2 -2
  478. data/lib/pg_query/parse.rb +5 -7
  479. data/lib/pg_query/parse_error.rb +1 -0
  480. data/lib/pg_query/pg_query_pb.rb +27 -25
  481. data/lib/pg_query/scan.rb +1 -0
  482. data/lib/pg_query/treewalker.rb +38 -15
  483. data/lib/pg_query/truncate.rb +18 -20
  484. data/lib/pg_query/version.rb +1 -1
  485. metadata +31 -82
  486. data/ext/pg_query/include/postgres/storage/backendid.h +0 -37
  487. data/ext/pg_query/include/postgres/storage/sinvaladt.h +0 -45
  488. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  489. data/ext/pg_query/src_backend_nodes_nodes.c +0 -38
  490. /data/ext/pg_query/{pg_query_ruby.sym → ext_symbols.sym} +0 -0
@@ -3,7 +3,7 @@
3
3
  * generic-gcc.h
4
4
  * Atomic operations, implemented using gcc (or compatible) intrinsics.
5
5
  *
6
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * NOTES:
@@ -176,6 +176,23 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
176
176
  }
177
177
  #endif
178
178
 
179
+ /*
180
+ * __sync_lock_test_and_set() only supports setting the value to 1 on some
181
+ * platforms, so we only provide an __atomic implementation for
182
+ * pg_atomic_exchange.
183
+ *
184
+ * We assume the availability of 32-bit __atomic_compare_exchange_n() implies
185
+ * the availability of 32-bit __atomic_exchange_n().
186
+ */
187
+ #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS)
188
+ #define PG_HAVE_ATOMIC_EXCHANGE_U32
189
+ static inline uint32
190
+ pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
191
+ {
192
+ return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST);
193
+ }
194
+ #endif
195
+
179
196
  /* if we have 32-bit __sync_val_compare_and_swap, assume we have these too: */
180
197
 
181
198
  #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)
@@ -223,6 +240,7 @@ static inline bool
223
240
  pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
224
241
  uint64 *expected, uint64 newval)
225
242
  {
243
+ AssertPointerAlignment(expected, 8);
226
244
  return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,
227
245
  __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
228
246
  }
@@ -236,6 +254,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
236
254
  {
237
255
  bool ret;
238
256
  uint64 current;
257
+
258
+ AssertPointerAlignment(expected, 8);
239
259
  current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);
240
260
  ret = current == *expected;
241
261
  *expected = current;
@@ -243,6 +263,23 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
243
263
  }
244
264
  #endif
245
265
 
266
+ /*
267
+ * __sync_lock_test_and_set() only supports setting the value to 1 on some
268
+ * platforms, so we only provide an __atomic implementation for
269
+ * pg_atomic_exchange.
270
+ *
271
+ * We assume the availability of 64-bit __atomic_compare_exchange_n() implies
272
+ * the availability of 64-bit __atomic_exchange_n().
273
+ */
274
+ #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS)
275
+ #define PG_HAVE_ATOMIC_EXCHANGE_U64
276
+ static inline uint64
277
+ pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
278
+ {
279
+ return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST);
280
+ }
281
+ #endif
282
+
246
283
  /* if we have 64-bit __sync_val_compare_and_swap, assume we have these too: */
247
284
 
248
285
  #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)
@@ -3,7 +3,7 @@
3
3
  * generic-msvc.h
4
4
  * Atomic operations support when using MSVC
5
5
  *
6
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * NOTES:
@@ -58,6 +58,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
58
58
  return ret;
59
59
  }
60
60
 
61
+ #define PG_HAVE_ATOMIC_EXCHANGE_U32
62
+ static inline uint32
63
+ pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
64
+ {
65
+ return InterlockedExchange(&ptr->value, newval);
66
+ }
67
+
61
68
  #define PG_HAVE_ATOMIC_FETCH_ADD_U32
62
69
  static inline uint32
63
70
  pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
@@ -88,6 +95,16 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
88
95
 
89
96
  /* Only implemented on 64bit builds */
90
97
  #ifdef _WIN64
98
+
99
+ #pragma intrinsic(_InterlockedExchange64)
100
+
101
+ #define PG_HAVE_ATOMIC_EXCHANGE_U64
102
+ static inline uint64
103
+ pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
104
+ {
105
+ return _InterlockedExchange64(&ptr->value, newval);
106
+ }
107
+
91
108
  #pragma intrinsic(_InterlockedExchangeAdd64)
92
109
 
93
110
  #define PG_HAVE_ATOMIC_FETCH_ADD_U64
@@ -96,6 +113,7 @@ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
96
113
  {
97
114
  return _InterlockedExchangeAdd64(&ptr->value, add_);
98
115
  }
116
+
99
117
  #endif /* _WIN64 */
100
118
 
101
119
  #endif /* HAVE_ATOMICS */
@@ -3,7 +3,7 @@
3
3
  * generic-sunpro.h
4
4
  * Atomic operations for solaris' CC
5
5
  *
6
- * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group
7
7
  *
8
8
  * NOTES:
9
9
  *
@@ -87,6 +87,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
87
87
  return ret;
88
88
  }
89
89
 
90
+ #define PG_HAVE_ATOMIC_EXCHANGE_U32
91
+ static inline uint32
92
+ pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval)
93
+ {
94
+ return atomic_swap_32(&ptr->value, newval);
95
+ }
96
+
90
97
  #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
91
98
  static inline bool
92
99
  pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
@@ -95,12 +102,20 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
95
102
  bool ret;
96
103
  uint64 current;
97
104
 
105
+ AssertPointerAlignment(expected, 8);
98
106
  current = atomic_cas_64(&ptr->value, *expected, newval);
99
107
  ret = current == *expected;
100
108
  *expected = current;
101
109
  return ret;
102
110
  }
103
111
 
112
+ #define PG_HAVE_ATOMIC_EXCHANGE_U64
113
+ static inline uint64
114
+ pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval)
115
+ {
116
+ return atomic_swap_64(&ptr->value, newval);
117
+ }
118
+
104
119
  #endif /* HAVE_ATOMIC_H */
105
120
 
106
121
  #endif /* defined(HAVE_ATOMICS) */
@@ -4,7 +4,7 @@
4
4
  * Implement higher level operations based on some lower level atomic
5
5
  * operations.
6
6
  *
7
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/port/atomics/generic.h
@@ -83,7 +83,7 @@ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)
83
83
  static inline bool
84
84
  pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
85
85
  {
86
- return pg_atomic_exchange_u32_impl(ptr, &value, 1) == 0;
86
+ return pg_atomic_exchange_u32_impl(ptr, 1) == 0;
87
87
  }
88
88
 
89
89
  #define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
@@ -243,6 +243,24 @@ pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)
243
243
  }
244
244
  #endif
245
245
 
246
+ #if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
247
+ #define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32
248
+ static inline uint32
249
+ pg_atomic_read_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr)
250
+ {
251
+ return pg_atomic_fetch_add_u32_impl(ptr, 0);
252
+ }
253
+ #endif
254
+
255
+ #if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
256
+ #define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32
257
+ static inline void
258
+ pg_atomic_write_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
259
+ {
260
+ (void) pg_atomic_exchange_u32_impl(ptr, val);
261
+ }
262
+ #endif
263
+
246
264
  #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
247
265
  #define PG_HAVE_ATOMIC_EXCHANGE_U64
248
266
  static inline uint64
@@ -399,3 +417,21 @@ pg_atomic_sub_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)
399
417
  return pg_atomic_fetch_sub_u64_impl(ptr, sub_) - sub_;
400
418
  }
401
419
  #endif
420
+
421
+ #if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
422
+ #define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64
423
+ static inline uint64
424
+ pg_atomic_read_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr)
425
+ {
426
+ return pg_atomic_fetch_add_u64_impl(ptr, 0);
427
+ }
428
+ #endif
429
+
430
+ #if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64)
431
+ #define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64
432
+ static inline void
433
+ pg_atomic_write_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
434
+ {
435
+ (void) pg_atomic_exchange_u64_impl(ptr, val);
436
+ }
437
+ #endif
@@ -28,7 +28,7 @@
28
28
  * For an introduction to using memory barriers within the PostgreSQL backend,
29
29
  * see src/backend/storage/lmgr/README.barrier
30
30
  *
31
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
31
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
32
32
  * Portions Copyright (c) 1994, Regents of the University of California
33
33
  *
34
34
  * src/include/port/atomics.h
@@ -84,11 +84,9 @@
84
84
  * using compiler intrinsics are a good idea.
85
85
  */
86
86
  /*
87
- * gcc or compatible, including clang and icc. Exclude xlc. The ppc64le "IBM
88
- * XL C/C++ for Linux, V13.1.2" emulates gcc, but __sync_lock_test_and_set()
89
- * of one-byte types elicits SIGSEGV. That bug was gone by V13.1.5 (2016-12).
87
+ * gcc or compatible, including clang and icc.
90
88
  */
91
- #if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !(defined(__IBMC__) || defined(__IBMCPP__))
89
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER)
92
90
  #include "port/atomics/generic-gcc.h"
93
91
  #elif defined(_MSC_VER)
94
92
  #include "port/atomics/generic-msvc.h"
@@ -239,6 +237,26 @@ pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)
239
237
  return pg_atomic_read_u32_impl(ptr);
240
238
  }
241
239
 
240
+ /*
241
+ * pg_atomic_read_membarrier_u32 - read with barrier semantics.
242
+ *
243
+ * This read is guaranteed to return the current value, provided that the value
244
+ * is only ever updated via operations with barrier semantics, such as
245
+ * pg_atomic_compare_exchange_u32() and pg_atomic_write_membarrier_u32().
246
+ * While this may be less performant than pg_atomic_read_u32(), it may be
247
+ * easier to reason about correctness with this function in less performance-
248
+ * sensitive code.
249
+ *
250
+ * Full barrier semantics.
251
+ */
252
+ static inline uint32
253
+ pg_atomic_read_membarrier_u32(volatile pg_atomic_uint32 *ptr)
254
+ {
255
+ AssertPointerAlignment(ptr, 4);
256
+
257
+ return pg_atomic_read_membarrier_u32_impl(ptr);
258
+ }
259
+
242
260
  /*
243
261
  * pg_atomic_write_u32 - write to atomic variable.
244
262
  *
@@ -276,6 +294,26 @@ pg_atomic_unlocked_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
276
294
  pg_atomic_unlocked_write_u32_impl(ptr, val);
277
295
  }
278
296
 
297
+ /*
298
+ * pg_atomic_write_membarrier_u32 - write with barrier semantics.
299
+ *
300
+ * The write is guaranteed to succeed as a whole, i.e., it's not possible to
301
+ * observe a partial write for any reader. Note that this correctly interacts
302
+ * with both pg_atomic_compare_exchange_u32() and
303
+ * pg_atomic_read_membarrier_u32(). While this may be less performant than
304
+ * pg_atomic_write_u32(), it may be easier to reason about correctness with
305
+ * this function in less performance-sensitive code.
306
+ *
307
+ * Full barrier semantics.
308
+ */
309
+ static inline void
310
+ pg_atomic_write_membarrier_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
311
+ {
312
+ AssertPointerAlignment(ptr, 4);
313
+
314
+ pg_atomic_write_membarrier_u32_impl(ptr, val);
315
+ }
316
+
279
317
  /*
280
318
  * pg_atomic_exchange_u32 - exchange newval with current value
281
319
  *
@@ -429,6 +467,15 @@ pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
429
467
  return pg_atomic_read_u64_impl(ptr);
430
468
  }
431
469
 
470
+ static inline uint64
471
+ pg_atomic_read_membarrier_u64(volatile pg_atomic_uint64 *ptr)
472
+ {
473
+ #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
474
+ AssertPointerAlignment(ptr, 8);
475
+ #endif
476
+ return pg_atomic_read_membarrier_u64_impl(ptr);
477
+ }
478
+
432
479
  static inline void
433
480
  pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
434
481
  {
@@ -438,6 +485,15 @@ pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
438
485
  pg_atomic_write_u64_impl(ptr, val);
439
486
  }
440
487
 
488
+ static inline void
489
+ pg_atomic_write_membarrier_u64(volatile pg_atomic_uint64 *ptr, uint64 val)
490
+ {
491
+ #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
492
+ AssertPointerAlignment(ptr, 8);
493
+ #endif
494
+ pg_atomic_write_membarrier_u64_impl(ptr, val);
495
+ }
496
+
441
497
  static inline uint64
442
498
  pg_atomic_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 newval)
443
499
  {
@@ -453,7 +509,6 @@ pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,
453
509
  {
454
510
  #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
455
511
  AssertPointerAlignment(ptr, 8);
456
- AssertPointerAlignment(expected, 8);
457
512
  #endif
458
513
  return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);
459
514
  }
@@ -514,6 +569,38 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
514
569
  return pg_atomic_sub_fetch_u64_impl(ptr, sub_);
515
570
  }
516
571
 
572
+ /*
573
+ * Monotonically advance the given variable using only atomic operations until
574
+ * it's at least the target value. Returns the latest value observed, which
575
+ * may or may not be the target value.
576
+ *
577
+ * Full barrier semantics (even when value is unchanged).
578
+ */
579
+ static inline uint64
580
+ pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target)
581
+ {
582
+ uint64 currval;
583
+
584
+ #ifndef PG_HAVE_ATOMIC_U64_SIMULATION
585
+ AssertPointerAlignment(ptr, 8);
586
+ #endif
587
+
588
+ currval = pg_atomic_read_u64_impl(ptr);
589
+ if (currval >= target)
590
+ {
591
+ pg_memory_barrier();
592
+ return currval;
593
+ }
594
+
595
+ while (currval < target)
596
+ {
597
+ if (pg_atomic_compare_exchange_u64(ptr, &currval, target))
598
+ return target;
599
+ }
600
+
601
+ return currval;
602
+ }
603
+
517
604
  #undef INSIDE_ATOMICS_H
518
605
 
519
606
  #endif /* ATOMICS_H */
@@ -4,7 +4,7 @@
4
4
  * Miscellaneous functions for bit-wise operations.
5
5
  *
6
6
  *
7
- * Copyright (c) 2019-2023, PostgreSQL Global Development Group
7
+ * Copyright (c) 2019-2024, PostgreSQL Global Development Group
8
8
  *
9
9
  * src/include/port/pg_bitutils.h
10
10
  *
@@ -48,8 +48,9 @@ pg_leftmost_one_pos32(uint32 word)
48
48
  unsigned long result;
49
49
  bool non_zero;
50
50
 
51
+ Assert(word != 0);
52
+
51
53
  non_zero = _BitScanReverse(&result, word);
52
- Assert(non_zero);
53
54
  return (int) result;
54
55
  #else
55
56
  int shift = 32 - 8;
@@ -85,8 +86,9 @@ pg_leftmost_one_pos64(uint64 word)
85
86
  unsigned long result;
86
87
  bool non_zero;
87
88
 
89
+ Assert(word != 0);
90
+
88
91
  non_zero = _BitScanReverse64(&result, word);
89
- Assert(non_zero);
90
92
  return (int) result;
91
93
  #else
92
94
  int shift = 64 - 8;
@@ -116,8 +118,9 @@ pg_rightmost_one_pos32(uint32 word)
116
118
  unsigned long result;
117
119
  bool non_zero;
118
120
 
121
+ Assert(word != 0);
122
+
119
123
  non_zero = _BitScanForward(&result, word);
120
- Assert(non_zero);
121
124
  return (int) result;
122
125
  #else
123
126
  int result = 0;
@@ -156,8 +159,9 @@ pg_rightmost_one_pos64(uint64 word)
156
159
  unsigned long result;
157
160
  bool non_zero;
158
161
 
162
+ Assert(word != 0);
163
+
159
164
  non_zero = _BitScanForward64(&result, word);
160
- Assert(non_zero);
161
165
  return (int) result;
162
166
  #else
163
167
  int result = 0;
@@ -296,18 +300,96 @@ pg_ceil_log2_64(uint64 num)
296
300
 
297
301
  #ifdef TRY_POPCNT_FAST
298
302
  /* Attempt to use the POPCNT instruction, but perform a runtime check first */
299
- extern int (*pg_popcount32) (uint32 word);
300
- extern int (*pg_popcount64) (uint64 word);
303
+ extern PGDLLIMPORT int (*pg_popcount32) (uint32 word);
304
+ extern PGDLLIMPORT int (*pg_popcount64) (uint64 word);
305
+ extern PGDLLIMPORT uint64 (*pg_popcount_optimized) (const char *buf, int bytes);
306
+ extern PGDLLIMPORT uint64 (*pg_popcount_masked_optimized) (const char *buf, int bytes, bits8 mask);
307
+
308
+ /*
309
+ * We can also try to use the AVX-512 popcount instruction on some systems.
310
+ * The implementation of that is located in its own file because it may
311
+ * require special compiler flags that we don't want to apply to any other
312
+ * files.
313
+ */
314
+ #ifdef USE_AVX512_POPCNT_WITH_RUNTIME_CHECK
315
+ extern bool pg_popcount_avx512_available(void);
316
+ extern uint64 pg_popcount_avx512(const char *buf, int bytes);
317
+ extern uint64 pg_popcount_masked_avx512(const char *buf, int bytes, bits8 mask);
318
+ #endif
301
319
 
302
320
  #else
303
321
  /* Use a portable implementation -- no need for a function pointer. */
304
322
  extern int pg_popcount32(uint32 word);
305
323
  extern int pg_popcount64(uint64 word);
324
+ extern uint64 pg_popcount_optimized(const char *buf, int bytes);
325
+ extern uint64 pg_popcount_masked_optimized(const char *buf, int bytes, bits8 mask);
306
326
 
307
327
  #endif /* TRY_POPCNT_FAST */
308
328
 
309
- /* Count the number of one-bits in a byte array */
310
- extern uint64 pg_popcount(const char *buf, int bytes);
329
+ /*
330
+ * Returns the number of 1-bits in buf.
331
+ *
332
+ * If there aren't many bytes to process, the function call overhead of the
333
+ * optimized versions isn't worth taking, so we inline a loop that consults
334
+ * pg_number_of_ones in that case. If there are many bytes to process, we
335
+ * accept the function call overhead because the optimized versions are likely
336
+ * to be faster.
337
+ */
338
+ static inline uint64
339
+ pg_popcount(const char *buf, int bytes)
340
+ {
341
+ /*
342
+ * We set the threshold to the point at which we'll first use special
343
+ * instructions in the optimized version.
344
+ */
345
+ #if SIZEOF_VOID_P >= 8
346
+ int threshold = 8;
347
+ #else
348
+ int threshold = 4;
349
+ #endif
350
+
351
+ if (bytes < threshold)
352
+ {
353
+ uint64 popcnt = 0;
354
+
355
+ while (bytes--)
356
+ popcnt += pg_number_of_ones[(unsigned char) *buf++];
357
+ return popcnt;
358
+ }
359
+
360
+ return pg_popcount_optimized(buf, bytes);
361
+ }
362
+
363
+ /*
364
+ * Returns the number of 1-bits in buf after applying the mask to each byte.
365
+ *
366
+ * Similar to pg_popcount(), we only take on the function pointer overhead when
367
+ * it's likely to be faster.
368
+ */
369
+ static inline uint64
370
+ pg_popcount_masked(const char *buf, int bytes, bits8 mask)
371
+ {
372
+ /*
373
+ * We set the threshold to the point at which we'll first use special
374
+ * instructions in the optimized version.
375
+ */
376
+ #if SIZEOF_VOID_P >= 8
377
+ int threshold = 8;
378
+ #else
379
+ int threshold = 4;
380
+ #endif
381
+
382
+ if (bytes < threshold)
383
+ {
384
+ uint64 popcnt = 0;
385
+
386
+ while (bytes--)
387
+ popcnt += pg_number_of_ones[(unsigned char) *buf++ & mask];
388
+ return popcnt;
389
+ }
390
+
391
+ return pg_popcount_masked_optimized(buf, bytes, mask);
392
+ }
311
393
 
312
394
  /*
313
395
  * Rotate the bits of "word" to the right/left by n bits.
@@ -11,7 +11,7 @@
11
11
  * return the same. Use caution when using these wrapper macros with signed
12
12
  * integers.
13
13
  *
14
- * Copyright (c) 2015-2023, PostgreSQL Global Development Group
14
+ * Copyright (c) 2015-2024, PostgreSQL Global Development Group
15
15
  *
16
16
  * src/include/port/pg_bswap.h
17
17
  *
@@ -23,7 +23,7 @@
23
23
  * EQ_CRC32C(c1, c2)
24
24
  * Check for equality of two CRCs.
25
25
  *
26
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
26
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
27
27
  * Portions Copyright (c) 1994, Regents of the University of California
28
28
  *
29
29
  * src/include/port/pg_crc32c.h
@@ -58,6 +58,15 @@ extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t le
58
58
 
59
59
  extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
60
60
 
61
+ #elif defined(USE_LOONGARCH_CRC32C)
62
+ /* Use LoongArch CRCC instructions. */
63
+
64
+ #define COMP_CRC32C(crc, data, len) \
65
+ ((crc) = pg_comp_crc32c_loongarch((crc), (data), (len)))
66
+ #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
67
+
68
+ extern pg_crc32c pg_comp_crc32c_loongarch(pg_crc32c crc, const void *data, size_t len);
69
+
61
70
  #elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK) || defined(USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK)
62
71
 
63
72
  /*
@@ -0,0 +1,117 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * pg_iovec.h
4
+ * Header for vectored I/O functions, to use in place of <sys/uio.h>.
5
+ *
6
+ * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/port/pg_iovec.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef PG_IOVEC_H
14
+ #define PG_IOVEC_H
15
+
16
+ #ifndef WIN32
17
+
18
+ #include <limits.h>
19
+ #include <sys/uio.h>
20
+ #include <unistd.h>
21
+
22
+ #else
23
+
24
+ /* POSIX requires at least 16 as a maximum iovcnt. */
25
+ #define IOV_MAX 16
26
+
27
+ /* Define our own POSIX-compatible iovec struct. */
28
+ struct iovec
29
+ {
30
+ void *iov_base;
31
+ size_t iov_len;
32
+ };
33
+
34
+ #endif
35
+
36
+ /* Define a reasonable maximum that is safe to use on the stack. */
37
+ #define PG_IOV_MAX Min(IOV_MAX, 32)
38
+
39
+ /*
40
+ * Like preadv(), but with a prefix to remind us of a side-effect: on Windows
41
+ * this changes the current file position.
42
+ */
43
+ static inline ssize_t
44
+ pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset)
45
+ {
46
+ #if HAVE_DECL_PREADV
47
+ /*
48
+ * Avoid a small amount of argument copying overhead in the kernel if
49
+ * there is only one iovec.
50
+ */
51
+ if (iovcnt == 1)
52
+ return pread(fd, iov[0].iov_base, iov[0].iov_len, offset);
53
+ else
54
+ return preadv(fd, iov, iovcnt, offset);
55
+ #else
56
+ ssize_t sum = 0;
57
+ ssize_t part;
58
+
59
+ for (int i = 0; i < iovcnt; ++i)
60
+ {
61
+ part = pg_pread(fd, iov[i].iov_base, iov[i].iov_len, offset);
62
+ if (part < 0)
63
+ {
64
+ if (i == 0)
65
+ return -1;
66
+ else
67
+ return sum;
68
+ }
69
+ sum += part;
70
+ offset += part;
71
+ if ((size_t) part < iov[i].iov_len)
72
+ return sum;
73
+ }
74
+ return sum;
75
+ #endif
76
+ }
77
+
78
+ /*
79
+ * Like pwritev(), but with a prefix to remind us of a side-effect: on Windows
80
+ * this changes the current file position.
81
+ */
82
+ static inline ssize_t
83
+ pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
84
+ {
85
+ #if HAVE_DECL_PWRITEV
86
+ /*
87
+ * Avoid a small amount of argument copying overhead in the kernel if
88
+ * there is only one iovec.
89
+ */
90
+ if (iovcnt == 1)
91
+ return pwrite(fd, iov[0].iov_base, iov[0].iov_len, offset);
92
+ else
93
+ return pwritev(fd, iov, iovcnt, offset);
94
+ #else
95
+ ssize_t sum = 0;
96
+ ssize_t part;
97
+
98
+ for (int i = 0; i < iovcnt; ++i)
99
+ {
100
+ part = pg_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset);
101
+ if (part < 0)
102
+ {
103
+ if (i == 0)
104
+ return -1;
105
+ else
106
+ return sum;
107
+ }
108
+ sum += part;
109
+ offset += part;
110
+ if ((size_t) part < iov[i].iov_len)
111
+ return sum;
112
+ }
113
+ return sum;
114
+ #endif
115
+ }
116
+
117
+ #endif /* PG_IOVEC_H */