pg_query 2.1.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -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,32 +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)
70
+
71
+ /*
72
+ * Xmin-related flags. Make sure any flags that affect how the process' Xmin
73
+ * value is interpreted by VACUUM are included here.
74
+ */
75
+ #define PROC_XMIN_FLAGS (PROC_IN_VACUUM | PROC_IN_SAFE_IC)
64
76
 
65
77
  /*
66
78
  * We allow a small number of "weak" relation locks (AccessShareLock,
@@ -76,6 +88,48 @@ struct XidCache
76
88
  */
77
89
  #define INVALID_PGPROCNO PG_INT32_MAX
78
90
 
91
+ /*
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.
122
+ */
123
+ #define DELAY_CHKPT_START (1<<0)
124
+ #define DELAY_CHKPT_COMPLETE (1<<1)
125
+
126
+ typedef enum
127
+ {
128
+ PROC_WAIT_STATUS_OK,
129
+ PROC_WAIT_STATUS_WAITING,
130
+ PROC_WAIT_STATUS_ERROR,
131
+ } ProcWaitStatus;
132
+
79
133
  /*
80
134
  * Each backend has a PGPROC struct in shared memory. There is also a list of
81
135
  * currently-unused PGPROC structs that will be reallocated to new backends.
@@ -91,6 +145,22 @@ struct XidCache
91
145
  * distinguished from a real one at need by the fact that it has pid == 0.
92
146
  * The semaphore and lock-activity fields in a prepared-xact PGPROC are unused,
93
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.
94
164
  */
95
165
  struct PGPROC
96
166
  {
@@ -99,14 +169,28 @@ struct PGPROC
99
169
  PGPROC **procgloballist; /* procglobal list that owns this PGPROC */
100
170
 
101
171
  PGSemaphore sem; /* ONE semaphore to sleep on */
102
- int waitStatus; /* STATUS_WAITING, STATUS_OK or STATUS_ERROR */
172
+ ProcWaitStatus waitStatus;
103
173
 
104
174
  Latch procLatch; /* generic latch for process */
105
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
+
106
187
  LocalTransactionId lxid; /* local id of top-level transaction currently
107
188
  * being executed by this proc, if running;
108
189
  * else InvalidLocalTransactionId */
109
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 */
110
194
  int pgprocno;
111
195
 
112
196
  /* These fields are zero while a backend is still starting up: */
@@ -141,8 +225,14 @@ struct PGPROC
141
225
  LOCKMODE waitLockMode; /* type of lock we're waiting for */
142
226
  LOCKMASK heldLocks; /* bitmask for lock types already held on this
143
227
  * lock object by this backend */
228
+ pg_atomic_uint64 waitStart; /* time at which wait for lock acquisition
229
+ * started */
144
230
 
145
- bool delayChkpt; /* true if this proc delays checkpoint start */
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] */
146
236
 
147
237
  /*
148
238
  * Info to allow us to wait for synchronous replication, if needed.
@@ -161,6 +251,8 @@ struct PGPROC
161
251
  */
162
252
  SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];
163
253
 
254
+ XidCacheStatus subxidStatus; /* mirrored with
255
+ * ProcGlobal->subxidStates[i] */
164
256
  struct XidCache subxids; /* cache for subtransaction XIDs */
165
257
 
166
258
  /* Support for group XID clearing. */
@@ -209,42 +301,81 @@ struct PGPROC
209
301
 
210
302
 
211
303
  extern PGDLLIMPORT PGPROC *MyProc;
212
- extern PGDLLIMPORT struct PGXACT *MyPgXact;
213
-
214
- /*
215
- * Prior to PostgreSQL 9.2, the fields below were stored as part of the
216
- * PGPROC. However, benchmarking revealed that packing these particular
217
- * members into a separate array as tightly as possible sped up GetSnapshotData
218
- * considerably on systems with many CPU cores, by reducing the number of
219
- * cache lines needing to be fetched. Thus, think very carefully before adding
220
- * anything else here.
221
- */
222
- typedef struct PGXACT
223
- {
224
- TransactionId xid; /* id of top-level transaction currently being
225
- * executed by this proc, if running and XID
226
- * is assigned; else InvalidTransactionId */
227
-
228
- TransactionId xmin; /* minimal running XID as it was when we were
229
- * starting our xact, excluding LAZY VACUUM:
230
- * vacuum must not remove tuples deleted by
231
- * xid >= xmin ! */
232
-
233
- uint8 vacuumFlags; /* vacuum-related flags, see above */
234
- bool overflowed;
235
-
236
- uint8 nxids;
237
- } PGXACT;
238
304
 
239
305
  /*
240
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.
241
358
  */
242
359
  typedef struct PROC_HDR
243
360
  {
244
361
  /* Array of PGPROC structures (not including dummies for prepared txns) */
245
362
  PGPROC *allProcs;
246
- /* Array of PGXACT structures (not including dummies for prepared txns) */
247
- 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
+
248
379
  /* Length of allProcs array */
249
380
  uint32 allProcCount;
250
381
  /* Head of list of free PGPROC structures */
@@ -265,16 +396,13 @@ typedef struct PROC_HDR
265
396
  Latch *checkpointerLatch;
266
397
  /* Current shared estimate of appropriate spins_per_delay value */
267
398
  int spins_per_delay;
268
- /* The proc of the Startup process, since not in ProcArray */
269
- PGPROC *startupProc;
270
- int startupProcPid;
271
399
  /* Buffer id of the buffer that Startup process waits for pin on, or -1 */
272
400
  int startupBufferPinWaitBufId;
273
401
  } PROC_HDR;
274
402
 
275
403
  extern PGDLLIMPORT PROC_HDR *ProcGlobal;
276
404
 
277
- extern PGPROC *PreparedXactProcs;
405
+ extern PGDLLIMPORT PGPROC *PreparedXactProcs;
278
406
 
279
407
  /* Accessor for PGPROC given a pgprocno. */
280
408
  #define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)])
@@ -283,18 +411,19 @@ extern PGPROC *PreparedXactProcs;
283
411
  * We set aside some extra PGPROC structures for auxiliary processes,
284
412
  * ie things that aren't full-fledged backends but need shmem access.
285
413
  *
286
- * Background writer, checkpointer and WAL writer run during normal operation.
287
- * Startup process and WAL receiver also consume 2 slots, but WAL writer is
288
- * 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.
289
417
  */
290
- #define NUM_AUXILIARY_PROCS 4
418
+ #define NUM_AUXILIARY_PROCS 5
291
419
 
292
420
  /* configurable options */
293
421
  extern PGDLLIMPORT int DeadlockTimeout;
294
422
  extern PGDLLIMPORT int StatementTimeout;
295
423
  extern PGDLLIMPORT int LockTimeout;
296
424
  extern PGDLLIMPORT int IdleInTransactionSessionTimeout;
297
- extern bool log_lock_waits;
425
+ extern PGDLLIMPORT int IdleSessionTimeout;
426
+ extern PGDLLIMPORT bool log_lock_waits;
298
427
 
299
428
 
300
429
  /*
@@ -307,7 +436,6 @@ extern void InitProcess(void);
307
436
  extern void InitProcessPhase2(void);
308
437
  extern void InitAuxiliaryProcess(void);
309
438
 
310
- extern void PublishStartupProcessInformation(void);
311
439
  extern void SetStartupBufferPinWaitBufId(int bufid);
312
440
  extern int GetStartupBufferPinWaitBufId(void);
313
441
 
@@ -315,15 +443,15 @@ extern bool HaveNFreeProcs(int n);
315
443
  extern void ProcReleaseLocks(bool isCommit);
316
444
 
317
445
  extern void ProcQueueInit(PROC_QUEUE *queue);
318
- extern int ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
319
- extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);
446
+ extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);
447
+ extern PGPROC *ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus);
320
448
  extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);
321
449
  extern void CheckDeadLockAlert(void);
322
450
  extern bool IsWaitingForLock(void);
323
451
  extern void LockErrorCleanup(void);
324
452
 
325
453
  extern void ProcWaitForSignal(uint32 wait_event_info);
326
- extern void ProcSendSignal(int pid);
454
+ extern void ProcSendSignal(int pgprocno);
327
455
 
328
456
  extern PGPROC *AuxiliaryPidGetProc(int pid);
329
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
@@ -314,6 +314,7 @@ tas(volatile slock_t *lock)
314
314
  #endif /* __INTEL_COMPILER */
315
315
  #endif /* __ia64__ || __ia64 */
316
316
 
317
+
317
318
  /*
318
319
  * On ARM and ARM64, we use __sync_lock_test_and_set(int *, int) if available.
319
320
  *
@@ -336,6 +337,23 @@ tas(volatile slock_t *lock)
336
337
 
337
338
  #define S_UNLOCK(lock) __sync_lock_release(lock)
338
339
 
340
+ /*
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.
344
+ */
345
+ #if defined(__aarch64__) || defined(__aarch64)
346
+
347
+ #define SPIN_DELAY() spin_delay()
348
+
349
+ static __inline__ void
350
+ spin_delay(void)
351
+ {
352
+ __asm__ __volatile__(
353
+ " isb; \n");
354
+ }
355
+
356
+ #endif /* __aarch64__ || __aarch64 */
339
357
  #endif /* HAVE_GCC__SYNC_INT32_TAS */
340
358
  #endif /* __arm__ || __arm || __aarch64__ || __aarch64 */
341
359
 
@@ -724,6 +742,51 @@ tas(volatile slock_t *lock)
724
742
  typedef unsigned char slock_t;
725
743
  #endif
726
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
+
727
790
  /*
728
791
  * Default implementation of S_UNLOCK() for gcc/icc.
729
792
  *
@@ -1001,7 +1064,7 @@ extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or
1001
1064
  #define TAS_SPIN(lock) TAS(lock)
1002
1065
  #endif /* TAS_SPIN */
1003
1066
 
1004
- extern slock_t dummy_spinlock;
1067
+ extern PGDLLIMPORT slock_t dummy_spinlock;
1005
1068
 
1006
1069
  /*
1007
1070
  * Platform-independent out-of-line support routines
@@ -1041,7 +1104,7 @@ init_spin_delay(SpinDelayStatus *status,
1041
1104
  }
1042
1105
 
1043
1106
  #define init_local_spin_delay(status) init_spin_delay(status, __FILE__, __LINE__, PG_FUNCNAME_MACRO)
1044
- void perform_spin_delay(SpinDelayStatus *status);
1045
- void finish_spin_delay(SpinDelayStatus *status);
1107
+ extern void perform_spin_delay(SpinDelayStatus *status);
1108
+ extern void finish_spin_delay(SpinDelayStatus *status);
1046
1109
 
1047
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