pg_query 2.2.1 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (466) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -1
  3. data/README.md +29 -33
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/access/amapi.h +45 -1
  6. data/ext/pg_query/include/access/attmap.h +1 -1
  7. data/ext/pg_query/include/access/attnum.h +2 -2
  8. data/ext/pg_query/include/access/clog.h +4 -2
  9. data/ext/pg_query/include/access/commit_ts.h +6 -9
  10. data/ext/pg_query/include/access/detoast.h +1 -11
  11. data/ext/pg_query/include/access/genam.h +15 -12
  12. data/ext/pg_query/include/access/gin.h +2 -2
  13. data/ext/pg_query/include/access/htup.h +1 -1
  14. data/ext/pg_query/include/access/htup_details.h +75 -87
  15. data/ext/pg_query/include/access/itup.h +7 -1
  16. data/ext/pg_query/include/access/parallel.h +2 -2
  17. data/ext/pg_query/include/access/printtup.h +1 -1
  18. data/ext/pg_query/include/access/relation.h +1 -1
  19. data/ext/pg_query/include/access/relscan.h +17 -2
  20. data/ext/pg_query/include/access/rmgr.h +30 -3
  21. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  22. data/ext/pg_query/include/access/sdir.h +1 -1
  23. data/ext/pg_query/include/access/skey.h +1 -1
  24. data/ext/pg_query/include/access/stratnum.h +4 -2
  25. data/ext/pg_query/include/access/sysattr.h +1 -1
  26. data/ext/pg_query/include/access/table.h +2 -1
  27. data/ext/pg_query/include/access/tableam.h +272 -20
  28. data/ext/pg_query/include/access/toast_compression.h +73 -0
  29. data/ext/pg_query/include/access/transam.h +123 -13
  30. data/ext/pg_query/include/access/tupconvert.h +1 -1
  31. data/ext/pg_query/include/access/tupdesc.h +1 -1
  32. data/ext/pg_query/include/access/tupmacs.h +3 -3
  33. data/ext/pg_query/include/access/twophase.h +3 -1
  34. data/ext/pg_query/include/access/xact.h +73 -19
  35. data/ext/pg_query/include/access/xlog.h +60 -155
  36. data/ext/pg_query/include/access/xlog_internal.h +40 -13
  37. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  38. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  39. data/ext/pg_query/include/access/xlogreader.h +145 -39
  40. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  41. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  42. data/ext/pg_query/include/c.h +101 -44
  43. data/ext/pg_query/include/catalog/catalog.h +3 -1
  44. data/ext/pg_query/include/catalog/catversion.h +2 -2
  45. data/ext/pg_query/include/catalog/dependency.h +8 -16
  46. data/ext/pg_query/include/catalog/genbki.h +83 -5
  47. data/ext/pg_query/include/catalog/index.h +18 -3
  48. data/ext/pg_query/include/catalog/indexing.h +12 -324
  49. data/ext/pg_query/include/catalog/namespace.h +4 -2
  50. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  51. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  52. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  53. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  54. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  55. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  56. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  57. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  58. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  59. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  60. data/ext/pg_query/include/catalog/pg_class.h +44 -14
  61. data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
  62. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  63. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  64. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  65. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  66. data/ext/pg_query/include/catalog/pg_control.h +3 -5
  67. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  68. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  69. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  70. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  71. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  72. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  73. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  74. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  75. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  76. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  77. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  78. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  79. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  80. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  81. data/ext/pg_query/include/catalog/pg_operator.h +18 -15
  82. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  83. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  84. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  85. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  86. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  88. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  89. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  90. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  91. data/ext/pg_query/include/catalog/pg_publication.h +50 -7
  92. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  93. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  95. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  96. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  97. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  98. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  99. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  100. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  101. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  102. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  103. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  104. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  105. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  106. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  107. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  108. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  109. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  110. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  111. data/ext/pg_query/include/catalog/pg_type.h +55 -24
  112. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  113. data/ext/pg_query/include/catalog/storage.h +5 -3
  114. data/ext/pg_query/include/commands/async.h +3 -4
  115. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  116. data/ext/pg_query/include/commands/defrem.h +11 -24
  117. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  118. data/ext/pg_query/include/commands/explain.h +1 -1
  119. data/ext/pg_query/include/commands/prepare.h +1 -1
  120. data/ext/pg_query/include/commands/tablespace.h +2 -2
  121. data/ext/pg_query/include/commands/trigger.h +18 -16
  122. data/ext/pg_query/include/commands/user.h +2 -2
  123. data/ext/pg_query/include/commands/vacuum.h +88 -41
  124. data/ext/pg_query/include/commands/variable.h +1 -1
  125. data/ext/pg_query/include/common/file_perm.h +4 -4
  126. data/ext/pg_query/include/common/hashfn.h +1 -1
  127. data/ext/pg_query/include/common/ip.h +1 -7
  128. data/ext/pg_query/include/common/keywords.h +2 -6
  129. data/ext/pg_query/include/common/kwlookup.h +1 -1
  130. data/ext/pg_query/include/common/pg_prng.h +60 -0
  131. data/ext/pg_query/include/common/relpath.h +2 -2
  132. data/ext/pg_query/include/common/string.h +24 -1
  133. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  134. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  135. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  136. data/ext/pg_query/include/executor/execdesc.h +1 -1
  137. data/ext/pg_query/include/executor/executor.h +65 -22
  138. data/ext/pg_query/include/executor/functions.h +17 -3
  139. data/ext/pg_query/include/executor/instrument.h +33 -16
  140. data/ext/pg_query/include/executor/spi.h +41 -3
  141. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  142. data/ext/pg_query/include/executor/tuptable.h +1 -1
  143. data/ext/pg_query/include/fmgr.h +13 -7
  144. data/ext/pg_query/include/funcapi.h +16 -4
  145. data/ext/pg_query/include/getaddrinfo.h +1 -1
  146. data/ext/pg_query/include/jit/jit.h +11 -11
  147. data/ext/pg_query/include/kwlist_d.h +517 -494
  148. data/ext/pg_query/include/lib/dshash.h +112 -0
  149. data/ext/pg_query/include/lib/ilist.h +20 -1
  150. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  151. data/ext/pg_query/include/lib/simplehash.h +140 -15
  152. data/ext/pg_query/include/lib/sort_template.h +432 -0
  153. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  154. data/ext/pg_query/include/libpq/auth.h +6 -4
  155. data/ext/pg_query/include/libpq/crypt.h +5 -4
  156. data/ext/pg_query/include/libpq/hba.h +43 -4
  157. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  158. data/ext/pg_query/include/libpq/libpq.h +30 -20
  159. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  160. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  161. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  162. data/ext/pg_query/include/mb/pg_wchar.h +105 -23
  163. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  164. data/ext/pg_query/include/miscadmin.h +47 -41
  165. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  166. data/ext/pg_query/include/nodes/execnodes.h +270 -78
  167. data/ext/pg_query/include/nodes/extensible.h +4 -2
  168. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  169. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  170. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  171. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  172. data/ext/pg_query/include/nodes/nodes.h +30 -11
  173. data/ext/pg_query/include/nodes/params.h +1 -1
  174. data/ext/pg_query/include/nodes/parsenodes.h +322 -90
  175. data/ext/pg_query/include/nodes/pathnodes.h +243 -66
  176. data/ext/pg_query/include/nodes/pg_list.h +75 -69
  177. data/ext/pg_query/include/nodes/plannodes.h +111 -28
  178. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  179. data/ext/pg_query/include/nodes/print.h +1 -1
  180. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  181. data/ext/pg_query/include/nodes/value.h +58 -39
  182. data/ext/pg_query/include/optimizer/cost.h +9 -2
  183. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  184. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  185. data/ext/pg_query/include/optimizer/optimizer.h +25 -17
  186. data/ext/pg_query/include/optimizer/paths.h +6 -6
  187. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  188. data/ext/pg_query/include/parser/analyze.h +19 -5
  189. data/ext/pg_query/include/parser/gram.h +947 -913
  190. data/ext/pg_query/include/parser/gramparse.h +1 -1
  191. data/ext/pg_query/include/parser/kwlist.h +463 -453
  192. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  193. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  194. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  195. data/ext/pg_query/include/parser/parse_func.h +2 -1
  196. data/ext/pg_query/include/parser/parse_node.h +21 -9
  197. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  198. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  199. data/ext/pg_query/include/parser/parse_type.h +1 -1
  200. data/ext/pg_query/include/parser/parser.h +31 -4
  201. data/ext/pg_query/include/parser/parsetree.h +1 -1
  202. data/ext/pg_query/include/parser/scanner.h +1 -1
  203. data/ext/pg_query/include/parser/scansup.h +2 -5
  204. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  205. data/ext/pg_query/include/pg_config.h +83 -41
  206. data/ext/pg_query/include/pg_config_manual.h +74 -21
  207. data/ext/pg_query/include/pg_getopt.h +6 -6
  208. data/ext/pg_query/include/pg_query.h +5 -4
  209. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
  212. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  213. data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
  214. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  215. data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
  216. data/ext/pg_query/include/pg_trace.h +1 -1
  217. data/ext/pg_query/include/pgstat.h +449 -1238
  218. data/ext/pg_query/include/pgtime.h +14 -4
  219. data/ext/pg_query/include/pl_gram.h +126 -128
  220. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  221. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  222. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  223. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  224. data/ext/pg_query/include/plerrcodes.h +9 -1
  225. data/ext/pg_query/include/plpgsql.h +52 -54
  226. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  227. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  228. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  229. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  230. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  231. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  232. data/ext/pg_query/include/port/atomics.h +1 -1
  233. data/ext/pg_query/include/port/pg_bitutils.h +40 -10
  234. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  235. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  236. data/ext/pg_query/include/port.h +71 -46
  237. data/ext/pg_query/include/portability/instr_time.h +1 -1
  238. data/ext/pg_query/include/postgres.h +60 -16
  239. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  240. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  241. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  242. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  243. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  244. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  245. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  246. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  247. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  248. data/ext/pg_query/include/postmaster/startup.h +39 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  250. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  251. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
  252. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  253. data/ext/pg_query/include/regex/regex.h +18 -16
  254. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  255. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  256. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  257. data/ext/pg_query/include/replication/origin.h +7 -7
  258. data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
  259. data/ext/pg_query/include/replication/slot.h +22 -11
  260. data/ext/pg_query/include/replication/syncrep.h +5 -5
  261. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  262. data/ext/pg_query/include/replication/walsender.h +8 -8
  263. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  264. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  265. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  266. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  267. data/ext/pg_query/include/storage/backendid.h +3 -3
  268. data/ext/pg_query/include/storage/block.h +4 -10
  269. data/ext/pg_query/include/storage/buf.h +1 -1
  270. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  271. data/ext/pg_query/include/storage/bufpage.h +6 -8
  272. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  273. data/ext/pg_query/include/storage/dsm.h +4 -1
  274. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  275. data/ext/pg_query/include/storage/fd.h +33 -3
  276. data/ext/pg_query/include/storage/fileset.h +40 -0
  277. data/ext/pg_query/include/storage/ipc.h +4 -1
  278. data/ext/pg_query/include/storage/item.h +1 -1
  279. data/ext/pg_query/include/storage/itemid.h +1 -1
  280. data/ext/pg_query/include/storage/itemptr.h +3 -1
  281. data/ext/pg_query/include/storage/large_object.h +2 -2
  282. data/ext/pg_query/include/storage/latch.h +9 -13
  283. data/ext/pg_query/include/storage/lmgr.h +2 -1
  284. data/ext/pg_query/include/storage/lock.h +11 -8
  285. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  286. data/ext/pg_query/include/storage/lwlock.h +5 -32
  287. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  288. data/ext/pg_query/include/storage/off.h +1 -1
  289. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  290. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  291. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  292. data/ext/pg_query/include/storage/predicate.h +4 -4
  293. data/ext/pg_query/include/storage/proc.h +173 -59
  294. data/ext/pg_query/include/storage/procarray.h +98 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  296. data/ext/pg_query/include/storage/procsignal.h +3 -7
  297. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  298. data/ext/pg_query/include/storage/s_lock.h +60 -21
  299. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  300. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  301. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  302. data/ext/pg_query/include/storage/shmem.h +1 -1
  303. data/ext/pg_query/include/storage/sinval.h +3 -3
  304. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  305. data/ext/pg_query/include/storage/smgr.h +10 -8
  306. data/ext/pg_query/include/storage/spin.h +2 -2
  307. data/ext/pg_query/include/storage/standby.h +13 -6
  308. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  309. data/ext/pg_query/include/storage/sync.h +7 -3
  310. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  312. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  313. data/ext/pg_query/include/tcop/dest.h +1 -1
  314. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  315. data/ext/pg_query/include/tcop/pquery.h +1 -1
  316. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  317. data/ext/pg_query/include/tcop/utility.h +7 -3
  318. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  319. data/ext/pg_query/include/utils/acl.h +24 -3
  320. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  321. data/ext/pg_query/include/utils/array.h +7 -2
  322. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  323. data/ext/pg_query/include/utils/backend_status.h +321 -0
  324. data/ext/pg_query/include/utils/builtins.h +10 -11
  325. data/ext/pg_query/include/utils/bytea.h +3 -2
  326. data/ext/pg_query/include/utils/catcache.h +1 -1
  327. data/ext/pg_query/include/utils/date.h +1 -1
  328. data/ext/pg_query/include/utils/datetime.h +8 -7
  329. data/ext/pg_query/include/utils/datum.h +9 -1
  330. data/ext/pg_query/include/utils/dsa.h +1 -1
  331. data/ext/pg_query/include/utils/dynahash.h +4 -3
  332. data/ext/pg_query/include/utils/elog.h +52 -21
  333. data/ext/pg_query/include/utils/errcodes.h +2 -0
  334. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  335. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  336. data/ext/pg_query/include/utils/float.h +7 -7
  337. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  338. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  339. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  340. data/ext/pg_query/include/utils/guc.h +69 -43
  341. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  342. data/ext/pg_query/include/utils/hsearch.h +15 -11
  343. data/ext/pg_query/include/utils/inval.h +4 -1
  344. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  345. data/ext/pg_query/include/utils/memdebug.h +1 -1
  346. data/ext/pg_query/include/utils/memutils.h +8 -3
  347. data/ext/pg_query/include/utils/numeric.h +19 -5
  348. data/ext/pg_query/include/utils/palloc.h +25 -3
  349. data/ext/pg_query/include/utils/partcache.h +1 -1
  350. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  351. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  352. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  353. data/ext/pg_query/include/utils/pidfile.h +1 -1
  354. data/ext/pg_query/include/utils/plancache.h +6 -5
  355. data/ext/pg_query/include/utils/portal.h +10 -12
  356. data/ext/pg_query/include/utils/ps_status.h +1 -1
  357. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  358. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  359. data/ext/pg_query/include/utils/regproc.h +14 -3
  360. data/ext/pg_query/include/utils/rel.h +71 -19
  361. data/ext/pg_query/include/utils/relcache.h +8 -5
  362. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  363. data/ext/pg_query/include/utils/resowner.h +1 -1
  364. data/ext/pg_query/include/utils/rls.h +2 -2
  365. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  366. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  367. data/ext/pg_query/include/utils/snapmgr.h +34 -14
  368. data/ext/pg_query/include/utils/snapshot.h +14 -1
  369. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  370. data/ext/pg_query/include/utils/syscache.h +6 -1
  371. data/ext/pg_query/include/utils/timeout.h +11 -4
  372. data/ext/pg_query/include/utils/timestamp.h +6 -5
  373. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  374. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  375. data/ext/pg_query/include/utils/typcache.h +24 -17
  376. data/ext/pg_query/include/utils/tzparser.h +1 -1
  377. data/ext/pg_query/include/utils/varlena.h +5 -3
  378. data/ext/pg_query/include/utils/wait_event.h +289 -0
  379. data/ext/pg_query/include/utils/xml.h +4 -4
  380. data/ext/pg_query/pg_query.pb-c.c +4302 -2304
  381. data/ext/pg_query/pg_query_deparse.c +1106 -373
  382. data/ext/pg_query/pg_query_fingerprint.c +30 -10
  383. data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
  384. data/ext/pg_query/pg_query_normalize.c +1 -1
  385. data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
  386. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  387. data/ext/pg_query/pg_query_parse.c +1 -1
  388. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  389. data/ext/pg_query/pg_query_scan.c +2 -1
  390. data/ext/pg_query/pg_query_split.c +3 -2
  391. data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
  392. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  393. data/ext/pg_query/src_backend_commands_define.c +11 -1
  394. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  395. data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
  396. data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
  397. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  398. data/ext/pg_query/src_backend_nodes_list.c +74 -11
  399. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  400. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  401. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  402. data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
  403. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  404. data/ext/pg_query/src_backend_parser_scan.c +172 -209
  405. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  406. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  407. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  408. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  409. data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
  410. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  411. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  412. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  413. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  414. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +71 -5
  415. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  416. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  417. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  418. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  419. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  420. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  421. data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
  422. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  423. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  424. data/ext/pg_query/src_common_encnames.c +1 -1
  425. data/ext/pg_query/src_common_hashfn.c +3 -3
  426. data/ext/pg_query/src_common_keywords.c +15 -2
  427. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  428. data/ext/pg_query/src_common_kwlookup.c +1 -1
  429. data/ext/pg_query/src_common_pg_prng.c +152 -0
  430. data/ext/pg_query/src_common_psprintf.c +1 -1
  431. data/ext/pg_query/src_common_string.c +7 -1
  432. data/ext/pg_query/src_common_stringinfo.c +1 -1
  433. data/ext/pg_query/src_common_wchar.c +701 -109
  434. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
  435. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  436. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
  437. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  438. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  441. data/ext/pg_query/src_port_pg_bitutils.c +41 -31
  442. data/ext/pg_query/src_port_pgsleep.c +1 -1
  443. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  444. data/ext/pg_query/src_port_qsort.c +12 -224
  445. data/ext/pg_query/src_port_snprintf.c +37 -13
  446. data/ext/pg_query/src_port_strerror.c +9 -19
  447. data/ext/pg_query/src_port_strnlen.c +1 -1
  448. data/lib/pg_query/filter_columns.rb +1 -1
  449. data/lib/pg_query/fingerprint.rb +5 -1
  450. data/lib/pg_query/node.rb +2 -2
  451. data/lib/pg_query/param_refs.rb +1 -1
  452. data/lib/pg_query/parse.rb +18 -8
  453. data/lib/pg_query/pg_query_pb.rb +1108 -942
  454. data/lib/pg_query/truncate.rb +1 -1
  455. data/lib/pg_query/version.rb +1 -1
  456. metadata +28 -18
  457. data/ext/pg_query/include/access/xloginsert.h +0 -64
  458. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  459. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  460. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  461. data/ext/pg_query/include/parser/parse_target.h +0 -46
  462. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  463. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  464. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  465. data/ext/pg_query/src_port_erand48.c +0 -127
  466. 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