pg_query 2.2.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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +59 -31
  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 +20 -8
  453. data/lib/pg_query/pg_query_pb.rb +1108 -942
  454. data/lib/pg_query/treewalker.rb +6 -0
  455. data/lib/pg_query/truncate.rb +1 -1
  456. data/lib/pg_query/version.rb +1 -1
  457. metadata +27 -17
  458. data/ext/pg_query/include/access/xloginsert.h +0 -64
  459. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  460. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  461. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  462. data/ext/pg_query/include/parser/parse_target.h +0 -46
  463. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  464. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  465. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  466. data/ext/pg_query/src_port_erand48.c +0 -127
  467. data/ext/pg_query/src_port_random.c +0 -31
@@ -3,7 +3,7 @@
3
3
  * xlogreader.h
4
4
  * Definitions for the generic XLog reading facility
5
5
  *
6
- * Portions Copyright (c) 2013-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
7
7
  *
8
8
  * IDENTIFICATION
9
9
  * src/include/access/xlogreader.h
@@ -17,7 +17,7 @@
17
17
  * XLogBeginRead() or XLogFindNextRecord(), and call XLogReadRecord()
18
18
  * until it returns NULL.
19
19
  *
20
- * Callers supply a page_read callback if they want to to call
20
+ * Callers supply a page_read callback if they want to call
21
21
  * XLogReadRecord or XLogFindNextRecord; it can be passed in as NULL
22
22
  * otherwise. The WALRead function can be used as a helper to write
23
23
  * page_read callbacks, but it is not mandatory; callers that use it,
@@ -39,6 +39,7 @@
39
39
  #endif
40
40
 
41
41
  #include "access/xlogrecord.h"
42
+ #include "storage/buf.h"
42
43
 
43
44
  /* WALOpenSegment represents a WAL segment being read. */
44
45
  typedef struct WALOpenSegment
@@ -125,6 +126,9 @@ typedef struct
125
126
  ForkNumber forknum;
126
127
  BlockNumber blkno;
127
128
 
129
+ /* Prefetching workspace. */
130
+ Buffer prefetch_buffer;
131
+
128
132
  /* copy of the fork_flags field from the XLogRecordBlockHeader */
129
133
  uint8 flags;
130
134
 
@@ -144,6 +148,30 @@ typedef struct
144
148
  uint16 data_bufsz;
145
149
  } DecodedBkpBlock;
146
150
 
151
+ /*
152
+ * The decoded contents of a record. This occupies a contiguous region of
153
+ * memory, with main_data and blocks[n].data pointing to memory after the
154
+ * members declared here.
155
+ */
156
+ typedef struct DecodedXLogRecord
157
+ {
158
+ /* Private member used for resource management. */
159
+ size_t size; /* total size of decoded record */
160
+ bool oversized; /* outside the regular decode buffer? */
161
+ struct DecodedXLogRecord *next; /* decoded record queue link */
162
+
163
+ /* Public members. */
164
+ XLogRecPtr lsn; /* location */
165
+ XLogRecPtr next_lsn; /* location of next record */
166
+ XLogRecord header; /* header */
167
+ RepOriginId record_origin;
168
+ TransactionId toplevel_xid; /* XID of top-level transaction */
169
+ char *main_data; /* record's main data portion */
170
+ uint32 main_data_len; /* main data portion's length */
171
+ int max_block_id; /* highest block_id in use (-1 if none) */
172
+ DecodedBkpBlock blocks[FLEXIBLE_ARRAY_MEMBER];
173
+ } DecodedXLogRecord;
174
+
147
175
  struct XLogReaderState
148
176
  {
149
177
  /*
@@ -171,10 +199,23 @@ struct XLogReaderState
171
199
  * Start and end point of last record read. EndRecPtr is also used as the
172
200
  * position to read next. Calling XLogBeginRead() sets EndRecPtr to the
173
201
  * starting position and ReadRecPtr to invalid.
202
+ *
203
+ * Start and end point of last record returned by XLogReadRecord(). These
204
+ * are also available as record->lsn and record->next_lsn.
174
205
  */
175
206
  XLogRecPtr ReadRecPtr; /* start of last record read */
176
207
  XLogRecPtr EndRecPtr; /* end+1 of last record read */
177
208
 
209
+ /*
210
+ * Set at the end of recovery: the start point of a partial record at the
211
+ * end of WAL (InvalidXLogRecPtr if there wasn't one), and the start
212
+ * location of its first contrecord that went missing.
213
+ */
214
+ XLogRecPtr abortedRecPtr;
215
+ XLogRecPtr missingContrecPtr;
216
+ /* Set when XLP_FIRST_IS_OVERWRITE_CONTRECORD is found */
217
+ XLogRecPtr overwrittenRecPtr;
218
+
178
219
 
179
220
  /* ----------------------------------------
180
221
  * Decoded representation of current record
@@ -182,25 +223,43 @@ struct XLogReaderState
182
223
  * Use XLogRecGet* functions to investigate the record; these fields
183
224
  * should not be accessed directly.
184
225
  * ----------------------------------------
226
+ * Start and end point of the last record read and decoded by
227
+ * XLogReadRecordInternal(). NextRecPtr is also used as the position to
228
+ * decode next. Calling XLogBeginRead() sets NextRecPtr and EndRecPtr to
229
+ * the requested starting position.
185
230
  */
186
- XLogRecord *decoded_record; /* currently decoded record */
231
+ XLogRecPtr DecodeRecPtr; /* start of last record decoded */
232
+ XLogRecPtr NextRecPtr; /* end+1 of last record decoded */
233
+ XLogRecPtr PrevRecPtr; /* start of previous record decoded */
187
234
 
188
- char *main_data; /* record's main data portion */
189
- uint32 main_data_len; /* main data portion's length */
190
- uint32 main_data_bufsz; /* allocated size of the buffer */
191
-
192
- RepOriginId record_origin;
193
-
194
- /* information about blocks referenced by the record. */
195
- DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID + 1];
196
-
197
- int max_block_id; /* highest block_id in use (-1 if none) */
235
+ /* Last record returned by XLogReadRecord(). */
236
+ DecodedXLogRecord *record;
198
237
 
199
238
  /* ----------------------------------------
200
239
  * private/internal state
201
240
  * ----------------------------------------
202
241
  */
203
242
 
243
+ /*
244
+ * Buffer for decoded records. This is a circular buffer, though
245
+ * individual records can't be split in the middle, so some space is often
246
+ * wasted at the end. Oversized records that don't fit in this space are
247
+ * allocated separately.
248
+ */
249
+ char *decode_buffer;
250
+ size_t decode_buffer_size;
251
+ bool free_decode_buffer; /* need to free? */
252
+ char *decode_buffer_head; /* data is read from the head */
253
+ char *decode_buffer_tail; /* new data is written at the tail */
254
+
255
+ /*
256
+ * Queue of records that have been decoded. This is a linked list that
257
+ * usually consists of consecutive records in decode_buffer, but may also
258
+ * contain oversized records allocated with palloc().
259
+ */
260
+ DecodedXLogRecord *decode_queue_head; /* oldest decoded record */
261
+ DecodedXLogRecord *decode_queue_tail; /* newest decoded record */
262
+
204
263
  /*
205
264
  * Buffer for currently read page (XLOG_BLCKSZ bytes, valid up to at least
206
265
  * readLen bytes)
@@ -250,18 +309,24 @@ struct XLogReaderState
250
309
 
251
310
  /* Buffer to hold error message */
252
311
  char *errormsg_buf;
312
+ bool errormsg_deferred;
253
313
 
254
314
  /*
255
- * Set at the end of recovery: the start point of a partial record at the
256
- * end of WAL (InvalidXLogRecPtr if there wasn't one), and the start
257
- * location of its first contrecord that went missing.
315
+ * Flag to indicate to XLogPageReadCB that it should not block waiting for
316
+ * data.
258
317
  */
259
- XLogRecPtr abortedRecPtr;
260
- XLogRecPtr missingContrecPtr;
261
- /* Set when XLP_FIRST_IS_OVERWRITE_CONTRECORD is found */
262
- XLogRecPtr overwrittenRecPtr;
318
+ bool nonblocking;
263
319
  };
264
320
 
321
+ /*
322
+ * Check if XLogNextRecord() has any more queued records or an error to return.
323
+ */
324
+ static inline bool
325
+ XLogReaderHasQueuedRecordOrError(XLogReaderState *state)
326
+ {
327
+ return (state->decode_queue_head != NULL) || state->errormsg_deferred;
328
+ }
329
+
265
330
  /* Get a new XLogReader */
266
331
  extern XLogReaderState *XLogReaderAllocate(int wal_segment_size,
267
332
  const char *waldir,
@@ -272,20 +337,45 @@ extern XLogReaderRoutine *LocalXLogReaderRoutine(void);
272
337
  /* Free an XLogReader */
273
338
  extern void XLogReaderFree(XLogReaderState *state);
274
339
 
340
+ /* Optionally provide a circular decoding buffer to allow readahead. */
341
+ extern void XLogReaderSetDecodeBuffer(XLogReaderState *state,
342
+ void *buffer,
343
+ size_t size);
344
+
275
345
  /* Position the XLogReader to given record */
276
346
  extern void XLogBeginRead(XLogReaderState *state, XLogRecPtr RecPtr);
277
- #ifdef FRONTEND
278
347
  extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);
279
- #endif /* FRONTEND */
348
+
349
+ /* Return values from XLogPageReadCB. */
350
+ typedef enum XLogPageReadResult
351
+ {
352
+ XLREAD_SUCCESS = 0, /* record is successfully read */
353
+ XLREAD_FAIL = -1, /* failed during reading a record */
354
+ XLREAD_WOULDBLOCK = -2 /* nonblocking mode only, no data */
355
+ } XLogPageReadResult;
280
356
 
281
357
  /* Read the next XLog record. Returns NULL on end-of-WAL or failure */
282
358
  extern struct XLogRecord *XLogReadRecord(XLogReaderState *state,
283
359
  char **errormsg);
284
360
 
361
+ /* Consume the next record or error. */
362
+ extern DecodedXLogRecord *XLogNextRecord(XLogReaderState *state,
363
+ char **errormsg);
364
+
365
+ /* Release the previously returned record, if necessary. */
366
+ extern XLogRecPtr XLogReleasePreviousRecord(XLogReaderState *state);
367
+
368
+ /* Try to read ahead, if there is data and space. */
369
+ extern DecodedXLogRecord *XLogReadAhead(XLogReaderState *state,
370
+ bool nonblocking);
371
+
285
372
  /* Validate a page */
286
373
  extern bool XLogReaderValidatePageHeader(XLogReaderState *state,
287
374
  XLogRecPtr recptr, char *phdr);
288
375
 
376
+ /* Forget error produced by XLogReaderValidatePageHeader(). */
377
+ extern void XLogReaderResetError(XLogReaderState *state);
378
+
289
379
  /*
290
380
  * Error information from WALRead that both backend and frontend caller can
291
381
  * process. Currently only errors from pg_pread can be reported.
@@ -305,24 +395,36 @@ extern bool WALRead(XLogReaderState *state,
305
395
 
306
396
  /* Functions for decoding an XLogRecord */
307
397
 
308
- extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,
398
+ extern size_t DecodeXLogRecordRequiredSpace(size_t xl_tot_len);
399
+ extern bool DecodeXLogRecord(XLogReaderState *state,
400
+ DecodedXLogRecord *decoded,
401
+ XLogRecord *record,
402
+ XLogRecPtr lsn,
309
403
  char **errmsg);
310
404
 
311
- #define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len)
312
- #define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev)
313
- #define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info)
314
- #define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)
315
- #define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)
316
- #define XLogRecGetOrigin(decoder) ((decoder)->record_origin)
317
- #define XLogRecGetData(decoder) ((decoder)->main_data)
318
- #define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)
319
- #define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)
320
- #define XLogRecHasBlockRef(decoder, block_id) \
321
- ((decoder)->blocks[block_id].in_use)
322
- #define XLogRecHasBlockImage(decoder, block_id) \
323
- ((decoder)->blocks[block_id].has_image)
324
- #define XLogRecBlockImageApply(decoder, block_id) \
325
- ((decoder)->blocks[block_id].apply_image)
405
+ /*
406
+ * Macros that provide access to parts of the record most recently returned by
407
+ * XLogReadRecord() or XLogNextRecord().
408
+ */
409
+ #define XLogRecGetTotalLen(decoder) ((decoder)->record->header.xl_tot_len)
410
+ #define XLogRecGetPrev(decoder) ((decoder)->record->header.xl_prev)
411
+ #define XLogRecGetInfo(decoder) ((decoder)->record->header.xl_info)
412
+ #define XLogRecGetRmid(decoder) ((decoder)->record->header.xl_rmid)
413
+ #define XLogRecGetXid(decoder) ((decoder)->record->header.xl_xid)
414
+ #define XLogRecGetOrigin(decoder) ((decoder)->record->record_origin)
415
+ #define XLogRecGetTopXid(decoder) ((decoder)->record->toplevel_xid)
416
+ #define XLogRecGetData(decoder) ((decoder)->record->main_data)
417
+ #define XLogRecGetDataLen(decoder) ((decoder)->record->main_data_len)
418
+ #define XLogRecHasAnyBlockRefs(decoder) ((decoder)->record->max_block_id >= 0)
419
+ #define XLogRecMaxBlockId(decoder) ((decoder)->record->max_block_id)
420
+ #define XLogRecGetBlock(decoder, i) (&(decoder)->record->blocks[(i)])
421
+ #define XLogRecHasBlockRef(decoder, block_id) \
422
+ (((decoder)->record->max_block_id >= (block_id)) && \
423
+ ((decoder)->record->blocks[block_id].in_use))
424
+ #define XLogRecHasBlockImage(decoder, block_id) \
425
+ ((decoder)->record->blocks[block_id].has_image)
426
+ #define XLogRecBlockImageApply(decoder, block_id) \
427
+ ((decoder)->record->blocks[block_id].apply_image)
326
428
 
327
429
  #ifndef FRONTEND
328
430
  extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record);
@@ -330,8 +432,12 @@ extern FullTransactionId XLogRecGetFullXid(XLogReaderState *record);
330
432
 
331
433
  extern bool RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page);
332
434
  extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len);
333
- extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id,
435
+ extern void XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id,
334
436
  RelFileNode *rnode, ForkNumber *forknum,
335
437
  BlockNumber *blknum);
438
+ extern bool XLogRecGetBlockTagExtended(XLogReaderState *record, uint8 block_id,
439
+ RelFileNode *rnode, ForkNumber *forknum,
440
+ BlockNumber *blknum,
441
+ Buffer *prefetch_buffer);
336
442
 
337
443
  #endif /* XLOGREADER_H */
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Definitions for the WAL record format.
5
5
  *
6
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * src/include/access/xlogrecord.h
@@ -114,8 +114,8 @@ typedef struct XLogRecordBlockHeader
114
114
  * present is (BLCKSZ - <length of "hole" bytes>).
115
115
  *
116
116
  * Additionally, when wal_compression is enabled, we will try to compress full
117
- * page images using the PGLZ compression algorithm, after removing the "hole".
118
- * This can reduce the WAL volume, but at some extra cost of CPU spent
117
+ * page images using one of the supported algorithms, after removing the
118
+ * "hole". This can reduce the WAL volume, but at some extra cost of CPU spent
119
119
  * on the compression during WAL logging. In this case, since the "hole"
120
120
  * length cannot be calculated by subtracting the number of page image bytes
121
121
  * from BLCKSZ, basically it needs to be stored as an extra information.
@@ -134,7 +134,7 @@ typedef struct XLogRecordBlockImageHeader
134
134
  uint8 bimg_info; /* flag bits, see below */
135
135
 
136
136
  /*
137
- * If BKPIMAGE_HAS_HOLE and BKPIMAGE_IS_COMPRESSED, an
137
+ * If BKPIMAGE_HAS_HOLE and BKPIMAGE_COMPRESSED(), an
138
138
  * XLogRecordBlockCompressHeader struct follows.
139
139
  */
140
140
  } XLogRecordBlockImageHeader;
@@ -144,9 +144,16 @@ typedef struct XLogRecordBlockImageHeader
144
144
 
145
145
  /* Information stored in bimg_info */
146
146
  #define BKPIMAGE_HAS_HOLE 0x01 /* page image has "hole" */
147
- #define BKPIMAGE_IS_COMPRESSED 0x02 /* page image is compressed */
148
- #define BKPIMAGE_APPLY 0x04 /* page image should be restored during
149
- * replay */
147
+ #define BKPIMAGE_APPLY 0x02 /* page image should be restored
148
+ * during replay */
149
+ /* compression methods supported */
150
+ #define BKPIMAGE_COMPRESS_PGLZ 0x04
151
+ #define BKPIMAGE_COMPRESS_LZ4 0x08
152
+ #define BKPIMAGE_COMPRESS_ZSTD 0x10
153
+
154
+ #define BKPIMAGE_COMPRESSED(info) \
155
+ ((info & (BKPIMAGE_COMPRESS_PGLZ | BKPIMAGE_COMPRESS_LZ4 | \
156
+ BKPIMAGE_COMPRESS_ZSTD)) != 0)
150
157
 
151
158
  /*
152
159
  * Extra header information used when page image has "hole" and
@@ -211,8 +218,9 @@ typedef struct XLogRecordDataHeaderLong
211
218
  * Block IDs used to distinguish different kinds of record fragments. Block
212
219
  * references are numbered from 0 to XLR_MAX_BLOCK_ID. A rmgr is free to use
213
220
  * any ID number in that range (although you should stick to small numbers,
214
- * because the WAL machinery is optimized for that case). A couple of ID
215
- * numbers are reserved to denote the "main" data portion of the record.
221
+ * because the WAL machinery is optimized for that case). A few ID
222
+ * numbers are reserved to denote the "main" data portion of the record,
223
+ * as well as replication-supporting transaction metadata.
216
224
  *
217
225
  * The maximum is currently set at 32, quite arbitrarily. Most records only
218
226
  * need a handful of block references, but there are a few exceptions that
@@ -223,5 +231,6 @@ typedef struct XLogRecordDataHeaderLong
223
231
  #define XLR_BLOCK_ID_DATA_SHORT 255
224
232
  #define XLR_BLOCK_ID_DATA_LONG 254
225
233
  #define XLR_BLOCK_ID_ORIGIN 253
234
+ #define XLR_BLOCK_ID_TOPLEVEL_XID 252
226
235
 
227
236
  #endif /* XLOGRECORD_H */
@@ -0,0 +1,157 @@
1
+ /*
2
+ * xlogrecovery.h
3
+ *
4
+ * Functions for WAL recovery and standby mode
5
+ *
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/access/xlogrecovery.h
10
+ */
11
+ #ifndef XLOGRECOVERY_H
12
+ #define XLOGRECOVERY_H
13
+
14
+ #include "access/xlogreader.h"
15
+ #include "catalog/pg_control.h"
16
+ #include "lib/stringinfo.h"
17
+ #include "utils/timestamp.h"
18
+
19
+ /*
20
+ * Recovery target type.
21
+ * Only set during a Point in Time recovery, not when in standby mode.
22
+ */
23
+ typedef enum
24
+ {
25
+ RECOVERY_TARGET_UNSET,
26
+ RECOVERY_TARGET_XID,
27
+ RECOVERY_TARGET_TIME,
28
+ RECOVERY_TARGET_NAME,
29
+ RECOVERY_TARGET_LSN,
30
+ RECOVERY_TARGET_IMMEDIATE
31
+ } RecoveryTargetType;
32
+
33
+ /*
34
+ * Recovery target TimeLine goal
35
+ */
36
+ typedef enum
37
+ {
38
+ RECOVERY_TARGET_TIMELINE_CONTROLFILE,
39
+ RECOVERY_TARGET_TIMELINE_LATEST,
40
+ RECOVERY_TARGET_TIMELINE_NUMERIC
41
+ } RecoveryTargetTimeLineGoal;
42
+
43
+ /* Recovery pause states */
44
+ typedef enum RecoveryPauseState
45
+ {
46
+ RECOVERY_NOT_PAUSED, /* pause not requested */
47
+ RECOVERY_PAUSE_REQUESTED, /* pause requested, but not yet paused */
48
+ RECOVERY_PAUSED /* recovery is paused */
49
+ } RecoveryPauseState;
50
+
51
+ /* User-settable GUC parameters */
52
+ extern PGDLLIMPORT bool recoveryTargetInclusive;
53
+ extern PGDLLIMPORT int recoveryTargetAction;
54
+ extern PGDLLIMPORT int recovery_min_apply_delay;
55
+ extern PGDLLIMPORT char *PrimaryConnInfo;
56
+ extern PGDLLIMPORT char *PrimarySlotName;
57
+ extern PGDLLIMPORT char *recoveryRestoreCommand;
58
+ extern PGDLLIMPORT char *recoveryEndCommand;
59
+ extern PGDLLIMPORT char *archiveCleanupCommand;
60
+
61
+ /* indirectly set via GUC system */
62
+ extern PGDLLIMPORT TransactionId recoveryTargetXid;
63
+ extern PGDLLIMPORT char *recovery_target_time_string;
64
+ extern PGDLLIMPORT TimestampTz recoveryTargetTime;
65
+ extern PGDLLIMPORT const char *recoveryTargetName;
66
+ extern PGDLLIMPORT XLogRecPtr recoveryTargetLSN;
67
+ extern PGDLLIMPORT RecoveryTargetType recoveryTarget;
68
+ extern PGDLLIMPORT char *PromoteTriggerFile;
69
+ extern PGDLLIMPORT bool wal_receiver_create_temp_slot;
70
+ extern PGDLLIMPORT RecoveryTargetTimeLineGoal recoveryTargetTimeLineGoal;
71
+ extern PGDLLIMPORT TimeLineID recoveryTargetTLIRequested;
72
+ extern PGDLLIMPORT TimeLineID recoveryTargetTLI;
73
+
74
+ /* Have we already reached a consistent database state? */
75
+ extern PGDLLIMPORT bool reachedConsistency;
76
+
77
+ /* Are we currently in standby mode? */
78
+ extern PGDLLIMPORT bool StandbyMode;
79
+
80
+ extern Size XLogRecoveryShmemSize(void);
81
+ extern void XLogRecoveryShmemInit(void);
82
+
83
+ extern void InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdownPtr, bool *haveBackupLabel, bool *haveTblspcMap);
84
+ extern void PerformWalRecovery(void);
85
+
86
+ /*
87
+ * FinishWalRecovery() returns this. It contains information about the point
88
+ * where recovery ended, and why it ended.
89
+ */
90
+ typedef struct
91
+ {
92
+ /*
93
+ * Information about the last valid or applied record, after which new WAL
94
+ * can be appended. 'lastRec' is the position where the last record
95
+ * starts, and 'endOfLog' is its end. 'lastPage' is a copy of the last
96
+ * partial page that contains endOfLog (or NULL if endOfLog is exactly at
97
+ * page boundary). 'lastPageBeginPtr' is the position where the last page
98
+ * begins.
99
+ *
100
+ * endOfLogTLI is the TLI in the filename of the XLOG segment containing
101
+ * the last applied record. It could be different from lastRecTLI, if
102
+ * there was a timeline switch in that segment, and we were reading the
103
+ * old WAL from a segment belonging to a higher timeline.
104
+ */
105
+ XLogRecPtr lastRec; /* start of last valid or applied record */
106
+ TimeLineID lastRecTLI;
107
+ XLogRecPtr endOfLog; /* end of last valid or applied record */
108
+ TimeLineID endOfLogTLI;
109
+
110
+ XLogRecPtr lastPageBeginPtr; /* LSN of page that contains endOfLog */
111
+ char *lastPage; /* copy of the last page, up to endOfLog */
112
+
113
+ /*
114
+ * abortedRecPtr is the start pointer of a broken record at end of WAL
115
+ * when recovery completes; missingContrecPtr is the location of the first
116
+ * contrecord that went missing. See CreateOverwriteContrecordRecord for
117
+ * details.
118
+ */
119
+ XLogRecPtr abortedRecPtr;
120
+ XLogRecPtr missingContrecPtr;
121
+
122
+ /* short human-readable string describing why recovery ended */
123
+ char *recoveryStopReason;
124
+
125
+ /*
126
+ * If standby or recovery signal file was found, these flags are set
127
+ * accordingly.
128
+ */
129
+ bool standby_signal_file_found;
130
+ bool recovery_signal_file_found;
131
+ } EndOfWalRecoveryInfo;
132
+
133
+ extern EndOfWalRecoveryInfo *FinishWalRecovery(void);
134
+ extern void ShutdownWalRecovery(void);
135
+ extern void RemovePromoteSignalFiles(void);
136
+
137
+ extern bool HotStandbyActive(void);
138
+ extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI);
139
+ extern RecoveryPauseState GetRecoveryPauseState(void);
140
+ extern void SetRecoveryPause(bool recoveryPause);
141
+ extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream);
142
+ extern TimestampTz GetLatestXTime(void);
143
+ extern TimestampTz GetCurrentChunkReplayStartTime(void);
144
+ extern XLogRecPtr GetCurrentReplayRecPtr(TimeLineID *replayEndTLI);
145
+
146
+ extern bool PromoteIsTriggered(void);
147
+ extern bool CheckPromoteSignal(void);
148
+ extern void WakeupRecovery(void);
149
+
150
+ extern void StartupRequestWalReceiverRestart(void);
151
+ extern void XLogRequestWalReceiverReply(void);
152
+
153
+ extern void RecoveryRequiresIntParameter(const char *param_name, int currValue, int minValue);
154
+
155
+ extern void xlog_outdesc(StringInfo buf, XLogReaderState *record);
156
+
157
+ #endif /* XLOGRECOVERY_H */