pg_query 2.2.1 → 4.2.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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +2 -2
  4. data/ext/pg_query/include/access/amapi.h +45 -1
  5. data/ext/pg_query/include/access/attmap.h +1 -1
  6. data/ext/pg_query/include/access/attnum.h +2 -2
  7. data/ext/pg_query/include/access/clog.h +4 -2
  8. data/ext/pg_query/include/access/commit_ts.h +6 -9
  9. data/ext/pg_query/include/access/detoast.h +1 -11
  10. data/ext/pg_query/include/access/genam.h +15 -12
  11. data/ext/pg_query/include/access/gin.h +2 -2
  12. data/ext/pg_query/include/access/htup.h +1 -1
  13. data/ext/pg_query/include/access/htup_details.h +75 -87
  14. data/ext/pg_query/include/access/itup.h +7 -1
  15. data/ext/pg_query/include/access/parallel.h +2 -2
  16. data/ext/pg_query/include/access/printtup.h +1 -1
  17. data/ext/pg_query/include/access/relation.h +1 -1
  18. data/ext/pg_query/include/access/relscan.h +17 -2
  19. data/ext/pg_query/include/access/rmgr.h +30 -3
  20. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  21. data/ext/pg_query/include/access/sdir.h +1 -1
  22. data/ext/pg_query/include/access/skey.h +1 -1
  23. data/ext/pg_query/include/access/stratnum.h +4 -2
  24. data/ext/pg_query/include/access/sysattr.h +1 -1
  25. data/ext/pg_query/include/access/table.h +2 -1
  26. data/ext/pg_query/include/access/tableam.h +272 -20
  27. data/ext/pg_query/include/access/toast_compression.h +73 -0
  28. data/ext/pg_query/include/access/transam.h +123 -13
  29. data/ext/pg_query/include/access/tupconvert.h +1 -1
  30. data/ext/pg_query/include/access/tupdesc.h +1 -1
  31. data/ext/pg_query/include/access/tupmacs.h +3 -3
  32. data/ext/pg_query/include/access/twophase.h +3 -1
  33. data/ext/pg_query/include/access/xact.h +73 -19
  34. data/ext/pg_query/include/access/xlog.h +60 -155
  35. data/ext/pg_query/include/access/xlog_internal.h +40 -13
  36. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  37. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  38. data/ext/pg_query/include/access/xlogreader.h +145 -39
  39. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  40. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  41. data/ext/pg_query/include/c.h +101 -44
  42. data/ext/pg_query/include/catalog/catalog.h +3 -1
  43. data/ext/pg_query/include/catalog/catversion.h +2 -2
  44. data/ext/pg_query/include/catalog/dependency.h +8 -16
  45. data/ext/pg_query/include/catalog/genbki.h +83 -5
  46. data/ext/pg_query/include/catalog/index.h +18 -3
  47. data/ext/pg_query/include/catalog/indexing.h +12 -324
  48. data/ext/pg_query/include/catalog/namespace.h +4 -2
  49. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  50. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  51. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  52. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  53. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  54. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  55. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  56. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  57. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  58. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  59. data/ext/pg_query/include/catalog/pg_class.h +44 -14
  60. data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
  61. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  62. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  63. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  64. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  65. data/ext/pg_query/include/catalog/pg_control.h +3 -5
  66. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  67. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  68. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  69. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  70. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  71. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  73. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  74. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  75. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  76. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  77. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  79. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_operator.h +18 -15
  81. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  82. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  83. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  84. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  88. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  90. data/ext/pg_query/include/catalog/pg_publication.h +50 -7
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  94. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  98. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  100. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_type.h +55 -24
  111. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  112. data/ext/pg_query/include/catalog/storage.h +5 -3
  113. data/ext/pg_query/include/commands/async.h +3 -4
  114. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  115. data/ext/pg_query/include/commands/defrem.h +11 -24
  116. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  117. data/ext/pg_query/include/commands/explain.h +1 -1
  118. data/ext/pg_query/include/commands/prepare.h +1 -1
  119. data/ext/pg_query/include/commands/tablespace.h +2 -2
  120. data/ext/pg_query/include/commands/trigger.h +18 -16
  121. data/ext/pg_query/include/commands/user.h +2 -2
  122. data/ext/pg_query/include/commands/vacuum.h +88 -41
  123. data/ext/pg_query/include/commands/variable.h +1 -1
  124. data/ext/pg_query/include/common/file_perm.h +4 -4
  125. data/ext/pg_query/include/common/hashfn.h +1 -1
  126. data/ext/pg_query/include/common/ip.h +1 -7
  127. data/ext/pg_query/include/common/keywords.h +2 -6
  128. data/ext/pg_query/include/common/kwlookup.h +1 -1
  129. data/ext/pg_query/include/common/pg_prng.h +60 -0
  130. data/ext/pg_query/include/common/relpath.h +2 -2
  131. data/ext/pg_query/include/common/string.h +24 -1
  132. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  133. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  134. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  135. data/ext/pg_query/include/executor/execdesc.h +1 -1
  136. data/ext/pg_query/include/executor/executor.h +65 -22
  137. data/ext/pg_query/include/executor/functions.h +17 -3
  138. data/ext/pg_query/include/executor/instrument.h +33 -16
  139. data/ext/pg_query/include/executor/spi.h +41 -3
  140. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  141. data/ext/pg_query/include/executor/tuptable.h +1 -1
  142. data/ext/pg_query/include/fmgr.h +13 -7
  143. data/ext/pg_query/include/funcapi.h +16 -4
  144. data/ext/pg_query/include/getaddrinfo.h +1 -1
  145. data/ext/pg_query/include/jit/jit.h +11 -11
  146. data/ext/pg_query/include/kwlist_d.h +517 -494
  147. data/ext/pg_query/include/lib/dshash.h +112 -0
  148. data/ext/pg_query/include/lib/ilist.h +20 -1
  149. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  150. data/ext/pg_query/include/lib/simplehash.h +140 -15
  151. data/ext/pg_query/include/lib/sort_template.h +432 -0
  152. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  153. data/ext/pg_query/include/libpq/auth.h +6 -4
  154. data/ext/pg_query/include/libpq/crypt.h +5 -4
  155. data/ext/pg_query/include/libpq/hba.h +43 -4
  156. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  157. data/ext/pg_query/include/libpq/libpq.h +30 -20
  158. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  159. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  160. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  161. data/ext/pg_query/include/mb/pg_wchar.h +105 -23
  162. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  163. data/ext/pg_query/include/miscadmin.h +47 -41
  164. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  165. data/ext/pg_query/include/nodes/execnodes.h +270 -78
  166. data/ext/pg_query/include/nodes/extensible.h +4 -2
  167. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  168. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  169. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  170. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  171. data/ext/pg_query/include/nodes/nodes.h +30 -11
  172. data/ext/pg_query/include/nodes/params.h +1 -1
  173. data/ext/pg_query/include/nodes/parsenodes.h +322 -90
  174. data/ext/pg_query/include/nodes/pathnodes.h +243 -66
  175. data/ext/pg_query/include/nodes/pg_list.h +75 -69
  176. data/ext/pg_query/include/nodes/plannodes.h +111 -28
  177. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  178. data/ext/pg_query/include/nodes/print.h +1 -1
  179. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  180. data/ext/pg_query/include/nodes/value.h +58 -39
  181. data/ext/pg_query/include/optimizer/cost.h +9 -2
  182. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  183. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  184. data/ext/pg_query/include/optimizer/optimizer.h +25 -17
  185. data/ext/pg_query/include/optimizer/paths.h +6 -6
  186. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  187. data/ext/pg_query/include/parser/analyze.h +19 -5
  188. data/ext/pg_query/include/parser/gram.h +947 -913
  189. data/ext/pg_query/include/parser/gramparse.h +1 -1
  190. data/ext/pg_query/include/parser/kwlist.h +463 -453
  191. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  192. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  193. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  194. data/ext/pg_query/include/parser/parse_func.h +2 -1
  195. data/ext/pg_query/include/parser/parse_node.h +21 -9
  196. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  197. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  198. data/ext/pg_query/include/parser/parse_type.h +1 -1
  199. data/ext/pg_query/include/parser/parser.h +31 -4
  200. data/ext/pg_query/include/parser/parsetree.h +1 -1
  201. data/ext/pg_query/include/parser/scanner.h +1 -1
  202. data/ext/pg_query/include/parser/scansup.h +2 -5
  203. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  204. data/ext/pg_query/include/pg_config.h +83 -41
  205. data/ext/pg_query/include/pg_config_manual.h +74 -21
  206. data/ext/pg_query/include/pg_getopt.h +6 -6
  207. data/ext/pg_query/include/pg_query.h +5 -4
  208. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  209. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  210. data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
  211. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  212. data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
  213. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  214. data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
  215. data/ext/pg_query/include/pg_trace.h +1 -1
  216. data/ext/pg_query/include/pgstat.h +449 -1238
  217. data/ext/pg_query/include/pgtime.h +14 -4
  218. data/ext/pg_query/include/pl_gram.h +126 -128
  219. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  220. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  221. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  222. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  223. data/ext/pg_query/include/plerrcodes.h +9 -1
  224. data/ext/pg_query/include/plpgsql.h +52 -54
  225. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  226. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  227. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  228. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  229. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  230. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  231. data/ext/pg_query/include/port/atomics.h +1 -1
  232. data/ext/pg_query/include/port/pg_bitutils.h +40 -10
  233. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  234. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  235. data/ext/pg_query/include/port.h +71 -46
  236. data/ext/pg_query/include/portability/instr_time.h +1 -1
  237. data/ext/pg_query/include/postgres.h +60 -16
  238. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  239. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  240. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  241. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  242. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  243. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  244. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  245. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  246. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  247. data/ext/pg_query/include/postmaster/startup.h +39 -0
  248. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  249. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  250. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
  251. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  252. data/ext/pg_query/include/regex/regex.h +18 -16
  253. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  254. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  255. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  256. data/ext/pg_query/include/replication/origin.h +7 -7
  257. data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
  258. data/ext/pg_query/include/replication/slot.h +22 -11
  259. data/ext/pg_query/include/replication/syncrep.h +5 -5
  260. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  261. data/ext/pg_query/include/replication/walsender.h +8 -8
  262. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  263. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  264. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  266. data/ext/pg_query/include/storage/backendid.h +3 -3
  267. data/ext/pg_query/include/storage/block.h +4 -10
  268. data/ext/pg_query/include/storage/buf.h +1 -1
  269. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  270. data/ext/pg_query/include/storage/bufpage.h +6 -8
  271. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  272. data/ext/pg_query/include/storage/dsm.h +4 -1
  273. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  274. data/ext/pg_query/include/storage/fd.h +33 -3
  275. data/ext/pg_query/include/storage/fileset.h +40 -0
  276. data/ext/pg_query/include/storage/ipc.h +4 -1
  277. data/ext/pg_query/include/storage/item.h +1 -1
  278. data/ext/pg_query/include/storage/itemid.h +1 -1
  279. data/ext/pg_query/include/storage/itemptr.h +3 -1
  280. data/ext/pg_query/include/storage/large_object.h +2 -2
  281. data/ext/pg_query/include/storage/latch.h +9 -13
  282. data/ext/pg_query/include/storage/lmgr.h +2 -1
  283. data/ext/pg_query/include/storage/lock.h +11 -8
  284. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  285. data/ext/pg_query/include/storage/lwlock.h +5 -32
  286. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  287. data/ext/pg_query/include/storage/off.h +1 -1
  288. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  289. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  290. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  291. data/ext/pg_query/include/storage/predicate.h +4 -4
  292. data/ext/pg_query/include/storage/proc.h +173 -59
  293. data/ext/pg_query/include/storage/procarray.h +98 -0
  294. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  295. data/ext/pg_query/include/storage/procsignal.h +3 -7
  296. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  297. data/ext/pg_query/include/storage/s_lock.h +60 -21
  298. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  299. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  300. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  301. data/ext/pg_query/include/storage/shmem.h +1 -1
  302. data/ext/pg_query/include/storage/sinval.h +3 -3
  303. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  304. data/ext/pg_query/include/storage/smgr.h +10 -8
  305. data/ext/pg_query/include/storage/spin.h +2 -2
  306. data/ext/pg_query/include/storage/standby.h +13 -6
  307. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  308. data/ext/pg_query/include/storage/sync.h +7 -3
  309. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  310. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  311. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  312. data/ext/pg_query/include/tcop/dest.h +1 -1
  313. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  314. data/ext/pg_query/include/tcop/pquery.h +1 -1
  315. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  316. data/ext/pg_query/include/tcop/utility.h +7 -3
  317. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  318. data/ext/pg_query/include/utils/acl.h +24 -3
  319. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  320. data/ext/pg_query/include/utils/array.h +7 -2
  321. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  322. data/ext/pg_query/include/utils/backend_status.h +321 -0
  323. data/ext/pg_query/include/utils/builtins.h +10 -11
  324. data/ext/pg_query/include/utils/bytea.h +3 -2
  325. data/ext/pg_query/include/utils/catcache.h +1 -1
  326. data/ext/pg_query/include/utils/date.h +1 -1
  327. data/ext/pg_query/include/utils/datetime.h +8 -7
  328. data/ext/pg_query/include/utils/datum.h +9 -1
  329. data/ext/pg_query/include/utils/dsa.h +1 -1
  330. data/ext/pg_query/include/utils/dynahash.h +4 -3
  331. data/ext/pg_query/include/utils/elog.h +52 -21
  332. data/ext/pg_query/include/utils/errcodes.h +2 -0
  333. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  334. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  335. data/ext/pg_query/include/utils/float.h +7 -7
  336. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  337. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  338. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  339. data/ext/pg_query/include/utils/guc.h +69 -43
  340. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  341. data/ext/pg_query/include/utils/hsearch.h +15 -11
  342. data/ext/pg_query/include/utils/inval.h +4 -1
  343. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  344. data/ext/pg_query/include/utils/memdebug.h +1 -1
  345. data/ext/pg_query/include/utils/memutils.h +8 -3
  346. data/ext/pg_query/include/utils/numeric.h +19 -5
  347. data/ext/pg_query/include/utils/palloc.h +25 -3
  348. data/ext/pg_query/include/utils/partcache.h +1 -1
  349. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  350. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  351. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  352. data/ext/pg_query/include/utils/pidfile.h +1 -1
  353. data/ext/pg_query/include/utils/plancache.h +6 -5
  354. data/ext/pg_query/include/utils/portal.h +10 -12
  355. data/ext/pg_query/include/utils/ps_status.h +1 -1
  356. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  357. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  358. data/ext/pg_query/include/utils/regproc.h +14 -3
  359. data/ext/pg_query/include/utils/rel.h +71 -19
  360. data/ext/pg_query/include/utils/relcache.h +8 -5
  361. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  362. data/ext/pg_query/include/utils/resowner.h +1 -1
  363. data/ext/pg_query/include/utils/rls.h +2 -2
  364. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  365. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  366. data/ext/pg_query/include/utils/snapmgr.h +34 -14
  367. data/ext/pg_query/include/utils/snapshot.h +14 -1
  368. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  369. data/ext/pg_query/include/utils/syscache.h +6 -1
  370. data/ext/pg_query/include/utils/timeout.h +11 -4
  371. data/ext/pg_query/include/utils/timestamp.h +6 -5
  372. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  373. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  374. data/ext/pg_query/include/utils/typcache.h +24 -17
  375. data/ext/pg_query/include/utils/tzparser.h +1 -1
  376. data/ext/pg_query/include/utils/varlena.h +5 -3
  377. data/ext/pg_query/include/utils/wait_event.h +289 -0
  378. data/ext/pg_query/include/utils/xml.h +4 -4
  379. data/ext/pg_query/pg_query.pb-c.c +4302 -2304
  380. data/ext/pg_query/pg_query_deparse.c +986 -301
  381. data/ext/pg_query/pg_query_fingerprint.c +30 -10
  382. data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
  383. data/ext/pg_query/pg_query_normalize.c +1 -1
  384. data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
  385. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  386. data/ext/pg_query/pg_query_parse.c +1 -1
  387. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  388. data/ext/pg_query/pg_query_scan.c +2 -1
  389. data/ext/pg_query/pg_query_split.c +3 -2
  390. data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
  391. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  392. data/ext/pg_query/src_backend_commands_define.c +11 -1
  393. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  394. data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
  395. data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
  396. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  397. data/ext/pg_query/src_backend_nodes_list.c +74 -11
  398. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  399. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  400. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  401. data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
  402. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  403. data/ext/pg_query/src_backend_parser_scan.c +172 -209
  404. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  405. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  406. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  407. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  408. data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
  409. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  410. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  411. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  412. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  413. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +71 -5
  414. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  415. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  416. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  417. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  418. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  419. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  420. data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
  421. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  422. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  423. data/ext/pg_query/src_common_encnames.c +1 -1
  424. data/ext/pg_query/src_common_hashfn.c +3 -3
  425. data/ext/pg_query/src_common_keywords.c +15 -2
  426. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  427. data/ext/pg_query/src_common_kwlookup.c +1 -1
  428. data/ext/pg_query/src_common_pg_prng.c +152 -0
  429. data/ext/pg_query/src_common_psprintf.c +1 -1
  430. data/ext/pg_query/src_common_string.c +7 -1
  431. data/ext/pg_query/src_common_stringinfo.c +1 -1
  432. data/ext/pg_query/src_common_wchar.c +701 -109
  433. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
  434. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  435. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
  436. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  437. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  438. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  440. data/ext/pg_query/src_port_pg_bitutils.c +41 -31
  441. data/ext/pg_query/src_port_pgsleep.c +1 -1
  442. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  443. data/ext/pg_query/src_port_qsort.c +12 -224
  444. data/ext/pg_query/src_port_snprintf.c +37 -13
  445. data/ext/pg_query/src_port_strerror.c +9 -19
  446. data/ext/pg_query/src_port_strnlen.c +1 -1
  447. data/lib/pg_query/filter_columns.rb +1 -1
  448. data/lib/pg_query/fingerprint.rb +5 -1
  449. data/lib/pg_query/node.rb +2 -2
  450. data/lib/pg_query/param_refs.rb +1 -1
  451. data/lib/pg_query/parse.rb +8 -7
  452. data/lib/pg_query/pg_query_pb.rb +1108 -942
  453. data/lib/pg_query/truncate.rb +1 -1
  454. data/lib/pg_query/version.rb +1 -1
  455. metadata +23 -13
  456. data/ext/pg_query/include/access/xloginsert.h +0 -64
  457. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  458. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  459. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  460. data/ext/pg_query/include/parser/parse_target.h +0 -46
  461. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  462. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  463. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  464. data/ext/pg_query/src_port_erand48.c +0 -127
  465. data/ext/pg_query/src_port_random.c +0 -31
@@ -4,7 +4,7 @@
4
4
  * per-process shared memory data structures
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/storage/proc.h
@@ -35,38 +35,44 @@
35
35
  */
36
36
  #define PGPROC_MAX_CACHED_SUBXIDS 64 /* XXX guessed-at value */
37
37
 
38
+ typedef struct XidCacheStatus
39
+ {
40
+ /* number of cached subxids, never more than PGPROC_MAX_CACHED_SUBXIDS */
41
+ uint8 count;
42
+ /* has PGPROC->subxids overflowed */
43
+ bool overflowed;
44
+ } XidCacheStatus;
45
+
38
46
  struct XidCache
39
47
  {
40
48
  TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];
41
49
  };
42
50
 
43
51
  /*
44
- * Flags for PGXACT->vacuumFlags
45
- *
46
- * Note: If you modify these flags, you need to modify PROCARRAY_XXX flags
47
- * in src/include/storage/procarray.h.
48
- *
49
- * PROC_RESERVED may later be assigned for use in vacuumFlags, but its value is
50
- * used for PROCARRAY_SLOTS_XMIN in procarray.h, so GetOldestXmin won't be able
51
- * to match and ignore processes with this flag set.
52
+ * Flags for PGPROC->statusFlags and PROC_HDR->statusFlags[]
52
53
  */
53
54
  #define PROC_IS_AUTOVACUUM 0x01 /* is it an autovac worker? */
54
55
  #define PROC_IN_VACUUM 0x02 /* currently running lazy vacuum */
55
- #define PROC_IN_ANALYZE 0x04 /* currently running analyze */
56
+ #define PROC_IN_SAFE_IC 0x04 /* currently running CREATE INDEX
57
+ * CONCURRENTLY or REINDEX
58
+ * CONCURRENTLY on non-expressional,
59
+ * non-partial index */
56
60
  #define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */
57
61
  #define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical
58
62
  * decoding outside xact */
59
- #define PROC_RESERVED 0x20 /* reserved for procarray */
63
+ #define PROC_AFFECTS_ALL_HORIZONS 0x20 /* this proc's xmin must be
64
+ * included in vacuum horizons
65
+ * in all databases */
60
66
 
61
67
  /* flags reset at EOXact */
62
68
  #define PROC_VACUUM_STATE_MASK \
63
- (PROC_IN_VACUUM | PROC_IN_ANALYZE | PROC_VACUUM_FOR_WRAPAROUND)
69
+ (PROC_IN_VACUUM | PROC_IN_SAFE_IC | PROC_VACUUM_FOR_WRAPAROUND)
64
70
 
65
71
  /*
66
72
  * Xmin-related flags. Make sure any flags that affect how the process' Xmin
67
73
  * value is interpreted by VACUUM are included here.
68
74
  */
69
- #define PROC_XMIN_FLAGS (PROC_IN_VACUUM)
75
+ #define PROC_XMIN_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC)
70
76
 
71
77
  /*
72
78
  * We allow a small number of "weak" relation locks (AccessShareLock,
@@ -83,12 +89,47 @@ struct XidCache
83
89
  #define INVALID_PGPROCNO PG_INT32_MAX
84
90
 
85
91
  /*
86
- * Flags used only for type of internal functions
87
- * GetVirtualXIDsDelayingChkptGuts and HaveVirtualXIDsDelayingChkptGuts.
92
+ * Flags for PGPROC.delayChkpt
93
+ *
94
+ * These flags can be used to delay the start or completion of a checkpoint
95
+ * for short periods. A flag is in effect if the corresponding bit is set in
96
+ * the PGPROC of any backend.
97
+ *
98
+ * For our purposes here, a checkpoint has three phases: (1) determine the
99
+ * location to which the redo pointer will be moved, (2) write all the
100
+ * data durably to disk, and (3) WAL-log the checkpoint.
101
+ *
102
+ * Setting DELAY_CHKPT_START prevents the system from moving from phase 1
103
+ * to phase 2. This is useful when we are performing a WAL-logged modification
104
+ * of data that will be flushed to disk in phase 2. By setting this flag
105
+ * before writing WAL and clearing it after we've both written WAL and
106
+ * performed the corresponding modification, we ensure that if the WAL record
107
+ * is inserted prior to the new redo point, the corresponding data changes will
108
+ * also be flushed to disk before the checkpoint can complete. (In the
109
+ * extremely common case where the data being modified is in shared buffers
110
+ * and we acquire an exclusive content lock on the relevant buffers before
111
+ * writing WAL, this mechanism is not needed, because phase 2 will block
112
+ * until we release the content lock and then flush the modified data to
113
+ * disk.)
114
+ *
115
+ * Setting DELAY_CHKPT_COMPLETE prevents the system from moving from phase 2
116
+ * to phase 3. This is useful if we are performing a WAL-logged operation that
117
+ * might invalidate buffers, such as relation truncation. In this case, we need
118
+ * to ensure that any buffers which were invalidated and thus not flushed by
119
+ * the checkpoint are actaully destroyed on disk. Replay can cope with a file
120
+ * or block that doesn't exist, but not with a block that has the wrong
121
+ * contents.
88
122
  */
89
123
  #define DELAY_CHKPT_START (1<<0)
90
124
  #define DELAY_CHKPT_COMPLETE (1<<1)
91
125
 
126
+ typedef enum
127
+ {
128
+ PROC_WAIT_STATUS_OK,
129
+ PROC_WAIT_STATUS_WAITING,
130
+ PROC_WAIT_STATUS_ERROR,
131
+ } ProcWaitStatus;
132
+
92
133
  /*
93
134
  * Each backend has a PGPROC struct in shared memory. There is also a list of
94
135
  * currently-unused PGPROC structs that will be reallocated to new backends.
@@ -104,6 +145,22 @@ struct XidCache
104
145
  * distinguished from a real one at need by the fact that it has pid == 0.
105
146
  * The semaphore and lock-activity fields in a prepared-xact PGPROC are unused,
106
147
  * but its myProcLocks[] lists are valid.
148
+ *
149
+ * We allow many fields of this struct to be accessed without locks, such as
150
+ * delayChkpt and isBackgroundWorker. However, keep in mind that writing
151
+ * mirrored ones (see below) requires holding ProcArrayLock or XidGenLock in
152
+ * at least shared mode, so that pgxactoff does not change concurrently.
153
+ *
154
+ * Mirrored fields:
155
+ *
156
+ * Some fields in PGPROC (see "mirrored in ..." comment) are mirrored into an
157
+ * element of more densely packed ProcGlobal arrays. These arrays are indexed
158
+ * by PGPROC->pgxactoff. Both copies need to be maintained coherently.
159
+ *
160
+ * NB: The pgxactoff indexed value can *never* be accessed without holding
161
+ * locks.
162
+ *
163
+ * See PROC_HDR for details.
107
164
  */
108
165
  struct PGPROC
109
166
  {
@@ -112,14 +169,28 @@ struct PGPROC
112
169
  PGPROC **procgloballist; /* procglobal list that owns this PGPROC */
113
170
 
114
171
  PGSemaphore sem; /* ONE semaphore to sleep on */
115
- int waitStatus; /* STATUS_WAITING, STATUS_OK or STATUS_ERROR */
172
+ ProcWaitStatus waitStatus;
116
173
 
117
174
  Latch procLatch; /* generic latch for process */
118
175
 
176
+
177
+ TransactionId xid; /* id of top-level transaction currently being
178
+ * executed by this proc, if running and XID
179
+ * is assigned; else InvalidTransactionId.
180
+ * mirrored in ProcGlobal->xids[pgxactoff] */
181
+
182
+ TransactionId xmin; /* minimal running XID as it was when we were
183
+ * starting our xact, excluding LAZY VACUUM:
184
+ * vacuum must not remove tuples deleted by
185
+ * xid >= xmin ! */
186
+
119
187
  LocalTransactionId lxid; /* local id of top-level transaction currently
120
188
  * being executed by this proc, if running;
121
189
  * else InvalidLocalTransactionId */
122
190
  int pid; /* Backend's process ID; 0 if prepared xact */
191
+
192
+ int pgxactoff; /* offset into various ProcGlobal->arrays with
193
+ * data mirrored from this PGPROC */
123
194
  int pgprocno;
124
195
 
125
196
  /* These fields are zero while a backend is still starting up: */
@@ -154,9 +225,14 @@ struct PGPROC
154
225
  LOCKMODE waitLockMode; /* type of lock we're waiting for */
155
226
  LOCKMASK heldLocks; /* bitmask for lock types already held on this
156
227
  * lock object by this backend */
228
+ pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition
229
+ * started */
157
230
 
158
- bool delayChkpt; /* true if this proc delays checkpoint start */
159
- bool delayChkptEnd; /* true if this proc delays checkpoint end */
231
+ int delayChkptFlags; /* for DELAY_CHKPT_* flags */
232
+
233
+ uint8 statusFlags; /* this backend's status flags, see PROC_*
234
+ * above. mirrored in
235
+ * ProcGlobal->statusFlags[pgxactoff] */
160
236
 
161
237
  /*
162
238
  * Info to allow us to wait for synchronous replication, if needed.
@@ -175,6 +251,8 @@ struct PGPROC
175
251
  */
176
252
  SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];
177
253
 
254
+ XidCacheStatus subxidStatus; /* mirrored with
255
+ * ProcGlobal->subxidStates[i] */
178
256
  struct XidCache subxids; /* cache for subtransaction XIDs */
179
257
 
180
258
  /* Support for group XID clearing. */
@@ -223,42 +301,81 @@ struct PGPROC
223
301
 
224
302
 
225
303
  extern PGDLLIMPORT PGPROC *MyProc;
226
- extern PGDLLIMPORT struct PGXACT *MyPgXact;
227
-
228
- /*
229
- * Prior to PostgreSQL 9.2, the fields below were stored as part of the
230
- * PGPROC. However, benchmarking revealed that packing these particular
231
- * members into a separate array as tightly as possible sped up GetSnapshotData
232
- * considerably on systems with many CPU cores, by reducing the number of
233
- * cache lines needing to be fetched. Thus, think very carefully before adding
234
- * anything else here.
235
- */
236
- typedef struct PGXACT
237
- {
238
- TransactionId xid; /* id of top-level transaction currently being
239
- * executed by this proc, if running and XID
240
- * is assigned; else InvalidTransactionId */
241
-
242
- TransactionId xmin; /* minimal running XID as it was when we were
243
- * starting our xact, excluding LAZY VACUUM:
244
- * vacuum must not remove tuples deleted by
245
- * xid >= xmin ! */
246
-
247
- uint8 vacuumFlags; /* vacuum-related flags, see above */
248
- bool overflowed;
249
-
250
- uint8 nxids;
251
- } PGXACT;
252
304
 
253
305
  /*
254
306
  * There is one ProcGlobal struct for the whole database cluster.
307
+ *
308
+ * Adding/Removing an entry into the procarray requires holding *both*
309
+ * ProcArrayLock and XidGenLock in exclusive mode (in that order). Both are
310
+ * needed because the dense arrays (see below) are accessed from
311
+ * GetNewTransactionId() and GetSnapshotData(), and we don't want to add
312
+ * further contention by both using the same lock. Adding/Removing a procarray
313
+ * entry is much less frequent.
314
+ *
315
+ * Some fields in PGPROC are mirrored into more densely packed arrays (e.g.
316
+ * xids), with one entry for each backend. These arrays only contain entries
317
+ * for PGPROCs that have been added to the shared array with ProcArrayAdd()
318
+ * (in contrast to PGPROC array which has unused PGPROCs interspersed).
319
+ *
320
+ * The dense arrays are indexed by PGPROC->pgxactoff. Any concurrent
321
+ * ProcArrayAdd() / ProcArrayRemove() can lead to pgxactoff of a procarray
322
+ * member to change. Therefore it is only safe to use PGPROC->pgxactoff to
323
+ * access the dense array while holding either ProcArrayLock or XidGenLock.
324
+ *
325
+ * As long as a PGPROC is in the procarray, the mirrored values need to be
326
+ * maintained in both places in a coherent manner.
327
+ *
328
+ * The denser separate arrays are beneficial for three main reasons: First, to
329
+ * allow for as tight loops accessing the data as possible. Second, to prevent
330
+ * updates of frequently changing data (e.g. xmin) from invalidating
331
+ * cachelines also containing less frequently changing data (e.g. xid,
332
+ * statusFlags). Third to condense frequently accessed data into as few
333
+ * cachelines as possible.
334
+ *
335
+ * There are two main reasons to have the data mirrored between these dense
336
+ * arrays and PGPROC. First, as explained above, a PGPROC's array entries can
337
+ * only be accessed with either ProcArrayLock or XidGenLock held, whereas the
338
+ * PGPROC entries do not require that (obviously there may still be locking
339
+ * requirements around the individual field, separate from the concerns
340
+ * here). That is particularly important for a backend to efficiently checks
341
+ * it own values, which it often can safely do without locking. Second, the
342
+ * PGPROC fields allow to avoid unnecessary accesses and modification to the
343
+ * dense arrays. A backend's own PGPROC is more likely to be in a local cache,
344
+ * whereas the cachelines for the dense array will be modified by other
345
+ * backends (often removing it from the cache for other cores/sockets). At
346
+ * commit/abort time a check of the PGPROC value can avoid accessing/dirtying
347
+ * the corresponding array value.
348
+ *
349
+ * Basically it makes sense to access the PGPROC variable when checking a
350
+ * single backend's data, especially when already looking at the PGPROC for
351
+ * other reasons already. It makes sense to look at the "dense" arrays if we
352
+ * need to look at many / most entries, because we then benefit from the
353
+ * reduced indirection and better cross-process cache-ability.
354
+ *
355
+ * When entering a PGPROC for 2PC transactions with ProcArrayAdd(), the data
356
+ * in the dense arrays is initialized from the PGPROC while it already holds
357
+ * ProcArrayLock.
255
358
  */
256
359
  typedef struct PROC_HDR
257
360
  {
258
361
  /* Array of PGPROC structures (not including dummies for prepared txns) */
259
362
  PGPROC *allProcs;
260
- /* Array of PGXACT structures (not including dummies for prepared txns) */
261
- PGXACT *allPgXact;
363
+
364
+ /* Array mirroring PGPROC.xid for each PGPROC currently in the procarray */
365
+ TransactionId *xids;
366
+
367
+ /*
368
+ * Array mirroring PGPROC.subxidStatus for each PGPROC currently in the
369
+ * procarray.
370
+ */
371
+ XidCacheStatus *subxidStates;
372
+
373
+ /*
374
+ * Array mirroring PGPROC.statusFlags for each PGPROC currently in the
375
+ * procarray.
376
+ */
377
+ uint8 *statusFlags;
378
+
262
379
  /* Length of allProcs array */
263
380
  uint32 allProcCount;
264
381
  /* Head of list of free PGPROC structures */
@@ -279,16 +396,13 @@ typedef struct PROC_HDR
279
396
  Latch *checkpointerLatch;
280
397
  /* Current shared estimate of appropriate spins_per_delay value */
281
398
  int spins_per_delay;
282
- /* The proc of the Startup process, since not in ProcArray */
283
- PGPROC *startupProc;
284
- int startupProcPid;
285
399
  /* Buffer id of the buffer that Startup process waits for pin on, or -1 */
286
400
  int startupBufferPinWaitBufId;
287
401
  } PROC_HDR;
288
402
 
289
403
  extern PGDLLIMPORT PROC_HDR *ProcGlobal;
290
404
 
291
- extern PGPROC *PreparedXactProcs;
405
+ extern PGDLLIMPORT PGPROC *PreparedXactProcs;
292
406
 
293
407
  /* Accessor for PGPROC given a pgprocno. */
294
408
  #define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)])
@@ -297,18 +411,19 @@ extern PGPROC *PreparedXactProcs;
297
411
  * We set aside some extra PGPROC structures for auxiliary processes,
298
412
  * ie things that aren't full-fledged backends but need shmem access.
299
413
  *
300
- * Background writer, checkpointer and WAL writer run during normal operation.
301
- * Startup process and WAL receiver also consume 2 slots, but WAL writer is
302
- * launched only after startup has exited, so we only need 4 slots.
414
+ * Background writer, checkpointer, WAL writer and archiver run during normal
415
+ * operation. Startup process and WAL receiver also consume 2 slots, but WAL
416
+ * writer is launched only after startup has exited, so we only need 5 slots.
303
417
  */
304
- #define NUM_AUXILIARY_PROCS 4
418
+ #define NUM_AUXILIARY_PROCS 5
305
419
 
306
420
  /* configurable options */
307
421
  extern PGDLLIMPORT int DeadlockTimeout;
308
422
  extern PGDLLIMPORT int StatementTimeout;
309
423
  extern PGDLLIMPORT int LockTimeout;
310
424
  extern PGDLLIMPORT int IdleInTransactionSessionTimeout;
311
- extern bool log_lock_waits;
425
+ extern PGDLLIMPORT int IdleSessionTimeout;
426
+ extern PGDLLIMPORT bool log_lock_waits;
312
427
 
313
428
 
314
429
  /*
@@ -321,7 +436,6 @@ extern void InitProcess(void);
321
436
  extern void InitProcessPhase2(void);
322
437
  extern void InitAuxiliaryProcess(void);
323
438
 
324
- extern void PublishStartupProcessInformation(void);
325
439
  extern void SetStartupBufferPinWaitBufId(int bufid);
326
440
  extern int GetStartupBufferPinWaitBufId(void);
327
441
 
@@ -329,15 +443,15 @@ extern bool HaveNFreeProcs(int n);
329
443
  extern void ProcReleaseLocks(bool isCommit);
330
444
 
331
445
  extern void ProcQueueInit(PROC_QUEUE *queue);
332
- extern int ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
333
- extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);
446
+ extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
447
+ extern PGPROC *ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus);
334
448
  extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
335
449
  extern void CheckDeadLockAlert(void);
336
450
  extern bool IsWaitingForLock(void);
337
451
  extern void LockErrorCleanup(void);
338
452
 
339
453
  extern void ProcWaitForSignal(uint32 wait_event_info);
340
- extern void ProcSendSignal(int pid);
454
+ extern void ProcSendSignal(int pgprocno);
341
455
 
342
456
  extern PGPROC *AuxiliaryPidGetProc(int pid);
343
457
 
@@ -0,0 +1,98 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * procarray.h
4
+ * POSTGRES process array definitions.
5
+ *
6
+ *
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 1994, Regents of the University of California
9
+ *
10
+ * src/include/storage/procarray.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+ #ifndef PROCARRAY_H
15
+ #define PROCARRAY_H
16
+
17
+ #include "storage/lock.h"
18
+ #include "storage/standby.h"
19
+ #include "utils/relcache.h"
20
+ #include "utils/snapshot.h"
21
+
22
+
23
+ extern Size ProcArrayShmemSize(void);
24
+ extern void CreateSharedProcArray(void);
25
+ extern void ProcArrayAdd(PGPROC *proc);
26
+ extern void ProcArrayRemove(PGPROC *proc, TransactionId latestXid);
27
+
28
+ extern void ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid);
29
+ extern void ProcArrayClearTransaction(PGPROC *proc);
30
+
31
+ extern void ProcArrayInitRecovery(TransactionId initializedUptoXID);
32
+ extern void ProcArrayApplyRecoveryInfo(RunningTransactions running);
33
+ extern void ProcArrayApplyXidAssignment(TransactionId topxid,
34
+ int nsubxids, TransactionId *subxids);
35
+
36
+ extern void RecordKnownAssignedTransactionIds(TransactionId xid);
37
+ extern void ExpireTreeKnownAssignedTransactionIds(TransactionId xid,
38
+ int nsubxids, TransactionId *subxids,
39
+ TransactionId max_xid);
40
+ extern void ExpireAllKnownAssignedTransactionIds(void);
41
+ extern void ExpireOldKnownAssignedTransactionIds(TransactionId xid);
42
+
43
+ extern int GetMaxSnapshotXidCount(void);
44
+ extern int GetMaxSnapshotSubxidCount(void);
45
+
46
+ extern Snapshot GetSnapshotData(Snapshot snapshot);
47
+
48
+ extern bool ProcArrayInstallImportedXmin(TransactionId xmin,
49
+ VirtualTransactionId *sourcevxid);
50
+ extern bool ProcArrayInstallRestoredXmin(TransactionId xmin, PGPROC *proc);
51
+
52
+ extern RunningTransactions GetRunningTransactionData(void);
53
+
54
+ extern bool TransactionIdIsInProgress(TransactionId xid);
55
+ extern bool TransactionIdIsActive(TransactionId xid);
56
+ extern TransactionId GetOldestNonRemovableTransactionId(Relation rel);
57
+ extern TransactionId GetOldestTransactionIdConsideredRunning(void);
58
+ extern TransactionId GetOldestActiveTransactionId(void);
59
+ extern TransactionId GetOldestSafeDecodingTransactionId(bool catalogOnly);
60
+ extern void GetReplicationHorizons(TransactionId *slot_xmin, TransactionId *catalog_xmin);
61
+
62
+ extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids, int type);
63
+ extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids,
64
+ int nvxids, int type);
65
+
66
+ extern PGPROC *BackendPidGetProc(int pid);
67
+ extern PGPROC *BackendPidGetProcWithLock(int pid);
68
+ extern int BackendXidGetPid(TransactionId xid);
69
+ extern bool IsBackendPid(int pid);
70
+
71
+ extern VirtualTransactionId *GetCurrentVirtualXIDs(TransactionId limitXmin,
72
+ bool excludeXmin0, bool allDbs, int excludeVacuum,
73
+ int *nvxids);
74
+ extern VirtualTransactionId *GetConflictingVirtualXIDs(TransactionId limitXmin, Oid dbOid);
75
+ extern pid_t CancelVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode);
76
+ extern pid_t SignalVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode,
77
+ bool conflictPending);
78
+
79
+ extern bool MinimumActiveBackends(int min);
80
+ extern int CountDBBackends(Oid databaseid);
81
+ extern int CountDBConnections(Oid databaseid);
82
+ extern void CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending);
83
+ extern int CountUserBackends(Oid roleid);
84
+ extern bool CountOtherDBBackends(Oid databaseId,
85
+ int *nbackends, int *nprepared);
86
+ extern void TerminateOtherDBBackends(Oid databaseId);
87
+
88
+ extern void XidCacheRemoveRunningXids(TransactionId xid,
89
+ int nxids, const TransactionId *xids,
90
+ TransactionId latestXid);
91
+
92
+ extern void ProcArraySetReplicationSlotXmin(TransactionId xmin,
93
+ TransactionId catalog_xmin, bool already_locked);
94
+
95
+ extern void ProcArrayGetReplicationSlotXmin(TransactionId *xmin,
96
+ TransactionId *catalog_xmin);
97
+
98
+ #endif /* PROCARRAY_H */
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * See proclist.h for functions that operate on these types.
7
7
  *
8
- * Portions Copyright (c) 2016-2020, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 2016-2022, PostgreSQL Global Development Group
9
9
  *
10
10
  * IDENTIFICATION
11
11
  * src/include/storage/proclist_types.h
@@ -4,7 +4,7 @@
4
4
  * Routines for interprocess signaling
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/storage/procsignal.h
@@ -34,6 +34,7 @@ typedef enum
34
34
  PROCSIG_PARALLEL_MESSAGE, /* message from cooperating parallel backend */
35
35
  PROCSIG_WALSND_INIT_STOPPING, /* ask walsenders to prepare for shutdown */
36
36
  PROCSIG_BARRIER, /* global barrier interrupt */
37
+ PROCSIG_LOG_MEMORY_CONTEXT, /* ask backend to log the memory contexts */
37
38
 
38
39
  /* Recovery conflict reasons */
39
40
  PROCSIG_RECOVERY_CONFLICT_DATABASE,
@@ -48,12 +49,7 @@ typedef enum
48
49
 
49
50
  typedef enum
50
51
  {
51
- /*
52
- * XXX. PROCSIGNAL_BARRIER_PLACEHOLDER should be replaced when the first
53
- * real user of the ProcSignalBarrier mechanism is added. It's just here
54
- * for now because we can't have an empty enum.
55
- */
56
- PROCSIGNAL_BARRIER_PLACEHOLDER = 0
52
+ PROCSIGNAL_BARRIER_SMGRRELEASE /* ask smgr to close files */
57
53
  } ProcSignalBarrierType;
58
54
 
59
55
  /*
@@ -4,7 +4,7 @@
4
4
  * Physical access information for relations.
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/storage/relfilenode.h
@@ -86,7 +86,7 @@
86
86
  * when using the SysV semaphore code.
87
87
  *
88
88
  *
89
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
89
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
90
90
  * Portions Copyright (c) 1994, Regents of the University of California
91
91
  *
92
92
  * src/include/storage/s_lock.h
@@ -337,31 +337,25 @@ tas(volatile slock_t *lock)
337
337
 
338
338
  #define S_UNLOCK(lock) __sync_lock_release(lock)
339
339
 
340
- #endif /* HAVE_GCC__SYNC_INT32_TAS */
341
- #endif /* __arm__ || __arm || __aarch64__ || __aarch64 */
342
-
343
-
344
340
  /*
345
- * RISC-V likewise uses __sync_lock_test_and_set(int *, int) if available.
341
+ * Using an ISB instruction to delay in spinlock loops appears beneficial on
342
+ * high-core-count ARM64 processors. It seems mostly a wash for smaller gear,
343
+ * and ISB doesn't exist at all on pre-v7 ARM chips.
346
344
  */
347
- #if defined(__riscv)
348
- #ifdef HAVE_GCC__SYNC_INT32_TAS
349
- #define HAS_TEST_AND_SET
350
-
351
- #define TAS(lock) tas(lock)
345
+ #if defined(__aarch64__) || defined(__aarch64)
352
346
 
353
- typedef int slock_t;
347
+ #define SPIN_DELAY() spin_delay()
354
348
 
355
- static __inline__ int
356
- tas(volatile slock_t *lock)
349
+ static __inline__ void
350
+ spin_delay(void)
357
351
  {
358
- return __sync_lock_test_and_set(lock, 1);
352
+ __asm__ __volatile__(
353
+ " isb; \n");
359
354
  }
360
355
 
361
- #define S_UNLOCK(lock) __sync_lock_release(lock)
362
-
356
+ #endif /* __aarch64__ || __aarch64 */
363
357
  #endif /* HAVE_GCC__SYNC_INT32_TAS */
364
- #endif /* __riscv */
358
+ #endif /* __arm__ || __arm || __aarch64__ || __aarch64 */
365
359
 
366
360
 
367
361
  /* S/390 and S/390x Linux (32- and 64-bit zSeries) */
@@ -748,6 +742,51 @@ tas(volatile slock_t *lock)
748
742
  typedef unsigned char slock_t;
749
743
  #endif
750
744
 
745
+
746
+ /*
747
+ * If we have no platform-specific knowledge, but we found that the compiler
748
+ * provides __sync_lock_test_and_set(), use that. Prefer the int-width
749
+ * version over the char-width version if we have both, on the rather dubious
750
+ * grounds that that's known to be more likely to work in the ARM ecosystem.
751
+ * (But we dealt with ARM above.)
752
+ */
753
+ #if !defined(HAS_TEST_AND_SET)
754
+
755
+ #if defined(HAVE_GCC__SYNC_INT32_TAS)
756
+ #define HAS_TEST_AND_SET
757
+
758
+ #define TAS(lock) tas(lock)
759
+
760
+ typedef int slock_t;
761
+
762
+ static __inline__ int
763
+ tas(volatile slock_t *lock)
764
+ {
765
+ return __sync_lock_test_and_set(lock, 1);
766
+ }
767
+
768
+ #define S_UNLOCK(lock) __sync_lock_release(lock)
769
+
770
+ #elif defined(HAVE_GCC__SYNC_CHAR_TAS)
771
+ #define HAS_TEST_AND_SET
772
+
773
+ #define TAS(lock) tas(lock)
774
+
775
+ typedef char slock_t;
776
+
777
+ static __inline__ int
778
+ tas(volatile slock_t *lock)
779
+ {
780
+ return __sync_lock_test_and_set(lock, 1);
781
+ }
782
+
783
+ #define S_UNLOCK(lock) __sync_lock_release(lock)
784
+
785
+ #endif /* HAVE_GCC__SYNC_INT32_TAS */
786
+
787
+ #endif /* !defined(HAS_TEST_AND_SET) */
788
+
789
+
751
790
  /*
752
791
  * Default implementation of S_UNLOCK() for gcc/icc.
753
792
  *
@@ -1025,7 +1064,7 @@ extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or
1025
1064
  #define TAS_SPIN(lock) TAS(lock)
1026
1065
  #endif /* TAS_SPIN */
1027
1066
 
1028
- extern slock_t dummy_spinlock;
1067
+ extern PGDLLIMPORT slock_t dummy_spinlock;
1029
1068
 
1030
1069
  /*
1031
1070
  * Platform-independent out-of-line support routines
@@ -1065,7 +1104,7 @@ init_spin_delay(SpinDelayStatus *status,
1065
1104
  }
1066
1105
 
1067
1106
  #define init_local_spin_delay(status) init_spin_delay(status, __FILE__, __LINE__, PG_FUNCNAME_MACRO)
1068
- void perform_spin_delay(SpinDelayStatus *status);
1069
- void finish_spin_delay(SpinDelayStatus *status);
1107
+ extern void perform_spin_delay(SpinDelayStatus *status);
1108
+ extern void finish_spin_delay(SpinDelayStatus *status);
1070
1109
 
1071
1110
  #endif /* S_LOCK_H */
@@ -4,7 +4,7 @@
4
4
  * Shared temporary file management.
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/storage/sharedfileset.h
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "storage/dsm.h"
19
19
  #include "storage/fd.h"
20
+ #include "storage/fileset.h"
20
21
  #include "storage/spin.h"
21
22
 
22
23
  /*
@@ -24,22 +25,13 @@
24
25
  */
25
26
  typedef struct SharedFileSet
26
27
  {
27
- pid_t creator_pid; /* PID of the creating process */
28
- uint32 number; /* per-PID identifier */
28
+ FileSet fs;
29
29
  slock_t mutex; /* mutex protecting the reference count */
30
30
  int refcnt; /* number of attached backends */
31
- int ntablespaces; /* number of tablespaces to use */
32
- Oid tablespaces[8]; /* OIDs of tablespaces to use. Assumes that
33
- * it's rare that there more than temp
34
- * tablespaces. */
35
31
  } SharedFileSet;
36
32
 
37
33
  extern void SharedFileSetInit(SharedFileSet *fileset, dsm_segment *seg);
38
34
  extern void SharedFileSetAttach(SharedFileSet *fileset, dsm_segment *seg);
39
- extern File SharedFileSetCreate(SharedFileSet *fileset, const char *name);
40
- extern File SharedFileSetOpen(SharedFileSet *fileset, const char *name);
41
- extern bool SharedFileSetDelete(SharedFileSet *fileset, const char *name,
42
- bool error_on_failure);
43
35
  extern void SharedFileSetDeleteAll(SharedFileSet *fileset);
44
36
 
45
37
  #endif