pg_query 2.1.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -1,9 +1,9 @@
1
1
  /* ----------
2
2
  * pgstat.h
3
3
  *
4
- * Definitions for the PostgreSQL statistics collector daemon.
4
+ * Definitions for the PostgreSQL cumulative statistics system.
5
5
  *
6
- * Copyright (c) 2001-2020, PostgreSQL Global Development Group
6
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
7
7
  *
8
8
  * src/include/pgstat.h
9
9
  * ----------
@@ -12,14 +12,12 @@
12
12
  #define PGSTAT_H
13
13
 
14
14
  #include "datatype/timestamp.h"
15
- #include "libpq/pqcomm.h"
16
- #include "miscadmin.h"
17
- #include "port/atomics.h"
18
15
  #include "portability/instr_time.h"
19
- #include "postmaster/pgarch.h"
20
- #include "storage/proc.h"
21
- #include "utils/hsearch.h"
16
+ #include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */
17
+ #include "utils/backend_progress.h" /* for backward compatibility */
18
+ #include "utils/backend_status.h" /* for backward compatibility */
22
19
  #include "utils/relcache.h"
20
+ #include "utils/wait_event.h" /* for backward compatibility */
23
21
 
24
22
 
25
23
  /* ----------
@@ -27,12 +25,37 @@
27
25
  * ----------
28
26
  */
29
27
  #define PGSTAT_STAT_PERMANENT_DIRECTORY "pg_stat"
30
- #define PGSTAT_STAT_PERMANENT_FILENAME "pg_stat/global.stat"
31
- #define PGSTAT_STAT_PERMANENT_TMPFILE "pg_stat/global.tmp"
28
+ #define PGSTAT_STAT_PERMANENT_FILENAME "pg_stat/pgstat.stat"
29
+ #define PGSTAT_STAT_PERMANENT_TMPFILE "pg_stat/pgstat.tmp"
32
30
 
33
31
  /* Default directory to store temporary statistics data in */
34
32
  #define PG_STAT_TMP_DIR "pg_stat_tmp"
35
33
 
34
+ /* The types of statistics entries */
35
+ typedef enum PgStat_Kind
36
+ {
37
+ /* use 0 for INVALID, to catch zero-initialized data */
38
+ PGSTAT_KIND_INVALID = 0,
39
+
40
+ /* stats for variable-numbered objects */
41
+ PGSTAT_KIND_DATABASE, /* database-wide statistics */
42
+ PGSTAT_KIND_RELATION, /* per-table statistics */
43
+ PGSTAT_KIND_FUNCTION, /* per-function statistics */
44
+ PGSTAT_KIND_REPLSLOT, /* per-slot statistics */
45
+ PGSTAT_KIND_SUBSCRIPTION, /* per-subscription statistics */
46
+
47
+ /* stats for fixed-numbered objects */
48
+ PGSTAT_KIND_ARCHIVER,
49
+ PGSTAT_KIND_BGWRITER,
50
+ PGSTAT_KIND_CHECKPOINTER,
51
+ PGSTAT_KIND_SLRU,
52
+ PGSTAT_KIND_WAL,
53
+ } PgStat_Kind;
54
+
55
+ #define PGSTAT_KIND_FIRST_VALID PGSTAT_KIND_DATABASE
56
+ #define PGSTAT_KIND_LAST PGSTAT_KIND_WAL
57
+ #define PGSTAT_NUM_KINDS (PGSTAT_KIND_LAST + 1)
58
+
36
59
  /* Values for track_functions GUC variable --- order is significant! */
37
60
  typedef enum TrackFunctionsLevel
38
61
  {
@@ -41,48 +64,93 @@ typedef enum TrackFunctionsLevel
41
64
  TRACK_FUNC_ALL
42
65
  } TrackFunctionsLevel;
43
66
 
67
+ typedef enum PgStat_FetchConsistency
68
+ {
69
+ PGSTAT_FETCH_CONSISTENCY_NONE,
70
+ PGSTAT_FETCH_CONSISTENCY_CACHE,
71
+ PGSTAT_FETCH_CONSISTENCY_SNAPSHOT,
72
+ } PgStat_FetchConsistency;
73
+
74
+ /* Values to track the cause of session termination */
75
+ typedef enum SessionEndType
76
+ {
77
+ DISCONNECT_NOT_YET, /* still active */
78
+ DISCONNECT_NORMAL,
79
+ DISCONNECT_CLIENT_EOF,
80
+ DISCONNECT_FATAL,
81
+ DISCONNECT_KILLED
82
+ } SessionEndType;
83
+
84
+ /* ----------
85
+ * The data type used for counters.
86
+ * ----------
87
+ */
88
+ typedef int64 PgStat_Counter;
89
+
90
+
91
+ /* ------------------------------------------------------------
92
+ * Structures kept in backend local memory while accumulating counts
93
+ * ------------------------------------------------------------
94
+ */
95
+
44
96
  /* ----------
45
- * The types of backend -> collector messages
97
+ * PgStat_FunctionCounts The actual per-function counts kept by a backend
98
+ *
99
+ * This struct should contain only actual event counters, because we memcmp
100
+ * it against zeroes to detect whether there are any pending stats.
101
+ *
102
+ * Note that the time counters are in instr_time format here. We convert to
103
+ * microseconds in PgStat_Counter format when flushing out pending statistics.
46
104
  * ----------
47
105
  */
48
- typedef enum StatMsgType
106
+ typedef struct PgStat_FunctionCounts
49
107
  {
50
- PGSTAT_MTYPE_DUMMY,
51
- PGSTAT_MTYPE_INQUIRY,
52
- PGSTAT_MTYPE_TABSTAT,
53
- PGSTAT_MTYPE_TABPURGE,
54
- PGSTAT_MTYPE_DROPDB,
55
- PGSTAT_MTYPE_RESETCOUNTER,
56
- PGSTAT_MTYPE_RESETSHAREDCOUNTER,
57
- PGSTAT_MTYPE_RESETSINGLECOUNTER,
58
- PGSTAT_MTYPE_RESETSLRUCOUNTER,
59
- PGSTAT_MTYPE_AUTOVAC_START,
60
- PGSTAT_MTYPE_VACUUM,
61
- PGSTAT_MTYPE_ANALYZE,
62
- PGSTAT_MTYPE_ARCHIVER,
63
- PGSTAT_MTYPE_BGWRITER,
64
- PGSTAT_MTYPE_SLRU,
65
- PGSTAT_MTYPE_FUNCSTAT,
66
- PGSTAT_MTYPE_FUNCPURGE,
67
- PGSTAT_MTYPE_RECOVERYCONFLICT,
68
- PGSTAT_MTYPE_TEMPFILE,
69
- PGSTAT_MTYPE_DEADLOCK,
70
- PGSTAT_MTYPE_CHECKSUMFAILURE
71
- } StatMsgType;
108
+ PgStat_Counter f_numcalls;
109
+ instr_time f_total_time;
110
+ instr_time f_self_time;
111
+ } PgStat_FunctionCounts;
72
112
 
73
113
  /* ----------
74
- * The data type used for counters.
114
+ * PgStat_BackendFunctionEntry Non-flushed function stats.
75
115
  * ----------
76
116
  */
77
- typedef int64 PgStat_Counter;
117
+ typedef struct PgStat_BackendFunctionEntry
118
+ {
119
+ PgStat_FunctionCounts f_counts;
120
+ } PgStat_BackendFunctionEntry;
121
+
122
+ /*
123
+ * Working state needed to accumulate per-function-call timing statistics.
124
+ */
125
+ typedef struct PgStat_FunctionCallUsage
126
+ {
127
+ /* Link to function's hashtable entry (must still be there at exit!) */
128
+ /* NULL means we are not tracking the current function call */
129
+ PgStat_FunctionCounts *fs;
130
+ /* Total time previously charged to function, as of function start */
131
+ instr_time save_f_total_time;
132
+ /* Backend-wide total time as of function start */
133
+ instr_time save_total;
134
+ /* system clock as of function start */
135
+ instr_time f_start;
136
+ } PgStat_FunctionCallUsage;
137
+
138
+ /* ----------
139
+ * PgStat_BackendSubEntry Non-flushed subscription stats.
140
+ * ----------
141
+ */
142
+ typedef struct PgStat_BackendSubEntry
143
+ {
144
+ PgStat_Counter apply_error_count;
145
+ PgStat_Counter sync_error_count;
146
+ } PgStat_BackendSubEntry;
78
147
 
79
148
  /* ----------
80
149
  * PgStat_TableCounts The actual per-table counts kept by a backend
81
150
  *
82
151
  * This struct should contain only actual event counters, because we memcmp
83
- * it against zeroes to detect whether there are any counts to transmit.
84
- * It is a component of PgStat_TableStatus (within-backend state) and
85
- * PgStat_TableEntry (the transmitted message format).
152
+ * it against zeroes to detect whether there are any stats updates to apply.
153
+ * It is a component of PgStat_TableStatus (within-backend state).
86
154
  *
87
155
  * Note: for a table, tuples_returned is the number of tuples successfully
88
156
  * fetched by heap_getnext, while tuples_fetched is the number of tuples
@@ -108,7 +176,7 @@ typedef struct PgStat_TableCounts
108
176
  PgStat_Counter t_tuples_updated;
109
177
  PgStat_Counter t_tuples_deleted;
110
178
  PgStat_Counter t_tuples_hot_updated;
111
- bool t_truncated;
179
+ bool t_truncdropped;
112
180
 
113
181
  PgStat_Counter t_delta_live_tuples;
114
182
  PgStat_Counter t_delta_dead_tuples;
@@ -118,26 +186,6 @@ typedef struct PgStat_TableCounts
118
186
  PgStat_Counter t_blocks_hit;
119
187
  } PgStat_TableCounts;
120
188
 
121
- /* Possible targets for resetting cluster-wide shared values */
122
- typedef enum PgStat_Shared_Reset_Target
123
- {
124
- RESET_ARCHIVER,
125
- RESET_BGWRITER
126
- } PgStat_Shared_Reset_Target;
127
-
128
- /* Possible object types for resetting single counters */
129
- typedef enum PgStat_Single_Reset_Type
130
- {
131
- RESET_TABLE,
132
- RESET_FUNCTION
133
- } PgStat_Single_Reset_Type;
134
-
135
- /* ------------------------------------------------------------
136
- * Structures kept in backend local memory while accumulating counts
137
- * ------------------------------------------------------------
138
- */
139
-
140
-
141
189
  /* ----------
142
190
  * PgStat_TableStatus Per-table status within a backend
143
191
  *
@@ -159,6 +207,7 @@ typedef struct PgStat_TableStatus
159
207
  bool t_shared; /* is it a shared catalog? */
160
208
  struct PgStat_TableXactStatus *trans; /* lowest subxact's counts */
161
209
  PgStat_TableCounts t_counts; /* event counts to be sent */
210
+ Relation relation; /* rel that is using this entry */
162
211
  } PgStat_TableStatus;
163
212
 
164
213
  /* ----------
@@ -170,10 +219,12 @@ typedef struct PgStat_TableXactStatus
170
219
  PgStat_Counter tuples_inserted; /* tuples inserted in (sub)xact */
171
220
  PgStat_Counter tuples_updated; /* tuples updated in (sub)xact */
172
221
  PgStat_Counter tuples_deleted; /* tuples deleted in (sub)xact */
173
- bool truncated; /* relation truncated in this (sub)xact */
174
- PgStat_Counter inserted_pre_trunc; /* tuples inserted prior to truncate */
175
- PgStat_Counter updated_pre_trunc; /* tuples updated prior to truncate */
176
- PgStat_Counter deleted_pre_trunc; /* tuples deleted prior to truncate */
222
+ bool truncdropped; /* relation truncated/dropped in this
223
+ * (sub)xact */
224
+ /* tuples i/u/d prior to truncate/drop */
225
+ PgStat_Counter inserted_pre_truncdrop;
226
+ PgStat_Counter updated_pre_truncdrop;
227
+ PgStat_Counter deleted_pre_truncdrop;
177
228
  int nest_level; /* subtransaction nest level */
178
229
  /* links to other structs for same relation: */
179
230
  struct PgStat_TableXactStatus *upper; /* next higher subxact if any */
@@ -184,1254 +235,332 @@ typedef struct PgStat_TableXactStatus
184
235
 
185
236
 
186
237
  /* ------------------------------------------------------------
187
- * Message formats follow
238
+ * Data structures on disk and in shared memory follow
239
+ *
240
+ * PGSTAT_FILE_FORMAT_ID should be changed whenever any of these
241
+ * data structures change.
188
242
  * ------------------------------------------------------------
189
243
  */
190
244
 
245
+ #define PGSTAT_FILE_FORMAT_ID 0x01A5BCA7
191
246
 
192
- /* ----------
193
- * PgStat_MsgHdr The common message header
194
- * ----------
195
- */
196
- typedef struct PgStat_MsgHdr
247
+ typedef struct PgStat_ArchiverStats
197
248
  {
198
- StatMsgType m_type;
199
- int m_size;
200
- } PgStat_MsgHdr;
201
-
202
- /* ----------
203
- * Space available in a message. This will keep the UDP packets below 1K,
204
- * which should fit unfragmented into the MTU of the loopback interface.
205
- * (Larger values of PGSTAT_MAX_MSG_SIZE would work for that on most
206
- * platforms, but we're being conservative here.)
207
- * ----------
208
- */
209
- #define PGSTAT_MAX_MSG_SIZE 1000
210
- #define PGSTAT_MSG_PAYLOAD (PGSTAT_MAX_MSG_SIZE - sizeof(PgStat_MsgHdr))
249
+ PgStat_Counter archived_count; /* archival successes */
250
+ char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file
251
+ * archived */
252
+ TimestampTz last_archived_timestamp; /* last archival success time */
253
+ PgStat_Counter failed_count; /* failed archival attempts */
254
+ char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in
255
+ * last failure */
256
+ TimestampTz last_failed_timestamp; /* last archival failure time */
257
+ TimestampTz stat_reset_timestamp;
258
+ } PgStat_ArchiverStats;
211
259
 
260
+ typedef struct PgStat_BgWriterStats
261
+ {
262
+ PgStat_Counter buf_written_clean;
263
+ PgStat_Counter maxwritten_clean;
264
+ PgStat_Counter buf_alloc;
265
+ TimestampTz stat_reset_timestamp;
266
+ } PgStat_BgWriterStats;
212
267
 
213
- /* ----------
214
- * PgStat_MsgDummy A dummy message, ignored by the collector
215
- * ----------
216
- */
217
- typedef struct PgStat_MsgDummy
268
+ typedef struct PgStat_CheckpointerStats
218
269
  {
219
- PgStat_MsgHdr m_hdr;
220
- } PgStat_MsgDummy;
270
+ PgStat_Counter timed_checkpoints;
271
+ PgStat_Counter requested_checkpoints;
272
+ PgStat_Counter checkpoint_write_time; /* times in milliseconds */
273
+ PgStat_Counter checkpoint_sync_time;
274
+ PgStat_Counter buf_written_checkpoints;
275
+ PgStat_Counter buf_written_backend;
276
+ PgStat_Counter buf_fsync_backend;
277
+ } PgStat_CheckpointerStats;
221
278
 
279
+ typedef struct PgStat_StatDBEntry
280
+ {
281
+ PgStat_Counter n_xact_commit;
282
+ PgStat_Counter n_xact_rollback;
283
+ PgStat_Counter n_blocks_fetched;
284
+ PgStat_Counter n_blocks_hit;
285
+ PgStat_Counter n_tuples_returned;
286
+ PgStat_Counter n_tuples_fetched;
287
+ PgStat_Counter n_tuples_inserted;
288
+ PgStat_Counter n_tuples_updated;
289
+ PgStat_Counter n_tuples_deleted;
290
+ TimestampTz last_autovac_time;
291
+ PgStat_Counter n_conflict_tablespace;
292
+ PgStat_Counter n_conflict_lock;
293
+ PgStat_Counter n_conflict_snapshot;
294
+ PgStat_Counter n_conflict_bufferpin;
295
+ PgStat_Counter n_conflict_startup_deadlock;
296
+ PgStat_Counter n_temp_files;
297
+ PgStat_Counter n_temp_bytes;
298
+ PgStat_Counter n_deadlocks;
299
+ PgStat_Counter n_checksum_failures;
300
+ TimestampTz last_checksum_failure;
301
+ PgStat_Counter n_block_read_time; /* times in microseconds */
302
+ PgStat_Counter n_block_write_time;
303
+ PgStat_Counter n_sessions;
304
+ PgStat_Counter total_session_time;
305
+ PgStat_Counter total_active_time;
306
+ PgStat_Counter total_idle_in_xact_time;
307
+ PgStat_Counter n_sessions_abandoned;
308
+ PgStat_Counter n_sessions_fatal;
309
+ PgStat_Counter n_sessions_killed;
222
310
 
223
- /* ----------
224
- * PgStat_MsgInquiry Sent by a backend to ask the collector
225
- * to write the stats file(s).
226
- *
227
- * Ordinarily, an inquiry message prompts writing of the global stats file,
228
- * the stats file for shared catalogs, and the stats file for the specified
229
- * database. If databaseid is InvalidOid, only the first two are written.
230
- *
231
- * New file(s) will be written only if the existing file has a timestamp
232
- * older than the specified cutoff_time; this prevents duplicated effort
233
- * when multiple requests arrive at nearly the same time, assuming that
234
- * backends send requests with cutoff_times a little bit in the past.
235
- *
236
- * clock_time should be the requestor's current local time; the collector
237
- * uses this to check for the system clock going backward, but it has no
238
- * effect unless that occurs. We assume clock_time >= cutoff_time, though.
239
- * ----------
240
- */
311
+ TimestampTz stat_reset_timestamp;
312
+ } PgStat_StatDBEntry;
241
313
 
242
- typedef struct PgStat_MsgInquiry
314
+ typedef struct PgStat_StatFuncEntry
243
315
  {
244
- PgStat_MsgHdr m_hdr;
245
- TimestampTz clock_time; /* observed local clock time */
246
- TimestampTz cutoff_time; /* minimum acceptable file timestamp */
247
- Oid databaseid; /* requested DB (InvalidOid => shared only) */
248
- } PgStat_MsgInquiry;
316
+ PgStat_Counter f_numcalls;
249
317
 
318
+ PgStat_Counter f_total_time; /* times in microseconds */
319
+ PgStat_Counter f_self_time;
320
+ } PgStat_StatFuncEntry;
250
321
 
251
- /* ----------
252
- * PgStat_TableEntry Per-table info in a MsgTabstat
253
- * ----------
254
- */
255
- typedef struct PgStat_TableEntry
322
+ typedef struct PgStat_StatReplSlotEntry
256
323
  {
257
- Oid t_id;
258
- PgStat_TableCounts t_counts;
259
- } PgStat_TableEntry;
324
+ /*
325
+ * In PG 15 this field is unused, but not removed, to avoid changing
326
+ * PGSTAT_FILE_FORMAT_ID.
327
+ */
328
+ NameData slotname_unused;
329
+ PgStat_Counter spill_txns;
330
+ PgStat_Counter spill_count;
331
+ PgStat_Counter spill_bytes;
332
+ PgStat_Counter stream_txns;
333
+ PgStat_Counter stream_count;
334
+ PgStat_Counter stream_bytes;
335
+ PgStat_Counter total_txns;
336
+ PgStat_Counter total_bytes;
337
+ TimestampTz stat_reset_timestamp;
338
+ } PgStat_StatReplSlotEntry;
260
339
 
261
- /* ----------
262
- * PgStat_MsgTabstat Sent by the backend to report table
263
- * and buffer access statistics.
264
- * ----------
265
- */
266
- #define PGSTAT_NUM_TABENTRIES \
267
- ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 2 * sizeof(PgStat_Counter)) \
268
- / sizeof(PgStat_TableEntry))
340
+ typedef struct PgStat_SLRUStats
341
+ {
342
+ PgStat_Counter blocks_zeroed;
343
+ PgStat_Counter blocks_hit;
344
+ PgStat_Counter blocks_read;
345
+ PgStat_Counter blocks_written;
346
+ PgStat_Counter blocks_exists;
347
+ PgStat_Counter flush;
348
+ PgStat_Counter truncate;
349
+ TimestampTz stat_reset_timestamp;
350
+ } PgStat_SLRUStats;
269
351
 
270
- typedef struct PgStat_MsgTabstat
352
+ typedef struct PgStat_StatSubEntry
271
353
  {
272
- PgStat_MsgHdr m_hdr;
273
- Oid m_databaseid;
274
- int m_nentries;
275
- int m_xact_commit;
276
- int m_xact_rollback;
277
- PgStat_Counter m_block_read_time; /* times in microseconds */
278
- PgStat_Counter m_block_write_time;
279
- PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];
280
- } PgStat_MsgTabstat;
354
+ PgStat_Counter apply_error_count;
355
+ PgStat_Counter sync_error_count;
356
+ TimestampTz stat_reset_timestamp;
357
+ } PgStat_StatSubEntry;
281
358
 
359
+ typedef struct PgStat_StatTabEntry
360
+ {
361
+ PgStat_Counter numscans;
282
362
 
283
- /* ----------
284
- * PgStat_MsgTabpurge Sent by the backend to tell the collector
285
- * about dead tables.
286
- * ----------
287
- */
288
- #define PGSTAT_NUM_TABPURGE \
289
- ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
290
- / sizeof(Oid))
363
+ PgStat_Counter tuples_returned;
364
+ PgStat_Counter tuples_fetched;
291
365
 
292
- typedef struct PgStat_MsgTabpurge
293
- {
294
- PgStat_MsgHdr m_hdr;
295
- Oid m_databaseid;
296
- int m_nentries;
297
- Oid m_tableid[PGSTAT_NUM_TABPURGE];
298
- } PgStat_MsgTabpurge;
366
+ PgStat_Counter tuples_inserted;
367
+ PgStat_Counter tuples_updated;
368
+ PgStat_Counter tuples_deleted;
369
+ PgStat_Counter tuples_hot_updated;
299
370
 
371
+ PgStat_Counter n_live_tuples;
372
+ PgStat_Counter n_dead_tuples;
373
+ PgStat_Counter changes_since_analyze;
374
+ PgStat_Counter inserts_since_vacuum;
300
375
 
301
- /* ----------
302
- * PgStat_MsgDropdb Sent by the backend to tell the collector
303
- * about a dropped database
304
- * ----------
305
- */
306
- typedef struct PgStat_MsgDropdb
307
- {
308
- PgStat_MsgHdr m_hdr;
309
- Oid m_databaseid;
310
- } PgStat_MsgDropdb;
376
+ PgStat_Counter blocks_fetched;
377
+ PgStat_Counter blocks_hit;
311
378
 
379
+ TimestampTz vacuum_timestamp; /* user initiated vacuum */
380
+ PgStat_Counter vacuum_count;
381
+ TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
382
+ PgStat_Counter autovac_vacuum_count;
383
+ TimestampTz analyze_timestamp; /* user initiated */
384
+ PgStat_Counter analyze_count;
385
+ TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
386
+ PgStat_Counter autovac_analyze_count;
387
+ } PgStat_StatTabEntry;
312
388
 
313
- /* ----------
314
- * PgStat_MsgResetcounter Sent by the backend to tell the collector
315
- * to reset counters
316
- * ----------
317
- */
318
- typedef struct PgStat_MsgResetcounter
389
+ typedef struct PgStat_WalStats
319
390
  {
320
- PgStat_MsgHdr m_hdr;
321
- Oid m_databaseid;
322
- } PgStat_MsgResetcounter;
391
+ PgStat_Counter wal_records;
392
+ PgStat_Counter wal_fpi;
393
+ uint64 wal_bytes;
394
+ PgStat_Counter wal_buffers_full;
395
+ PgStat_Counter wal_write;
396
+ PgStat_Counter wal_sync;
397
+ PgStat_Counter wal_write_time;
398
+ PgStat_Counter wal_sync_time;
399
+ TimestampTz stat_reset_timestamp;
400
+ } PgStat_WalStats;
323
401
 
324
- /* ----------
325
- * PgStat_MsgResetsharedcounter Sent by the backend to tell the collector
326
- * to reset a shared counter
327
- * ----------
328
- */
329
- typedef struct PgStat_MsgResetsharedcounter
330
- {
331
- PgStat_MsgHdr m_hdr;
332
- PgStat_Shared_Reset_Target m_resettarget;
333
- } PgStat_MsgResetsharedcounter;
334
402
 
335
- /* ----------
336
- * PgStat_MsgResetsinglecounter Sent by the backend to tell the collector
337
- * to reset a single counter
338
- * ----------
403
+ /*
404
+ * Functions in pgstat.c
339
405
  */
340
- typedef struct PgStat_MsgResetsinglecounter
341
- {
342
- PgStat_MsgHdr m_hdr;
343
- Oid m_databaseid;
344
- PgStat_Single_Reset_Type m_resettype;
345
- Oid m_objectid;
346
- } PgStat_MsgResetsinglecounter;
347
406
 
348
- /* ----------
349
- * PgStat_MsgResetslrucounter Sent by the backend to tell the collector
350
- * to reset a SLRU counter
351
- * ----------
352
- */
353
- typedef struct PgStat_MsgResetslrucounter
354
- {
355
- PgStat_MsgHdr m_hdr;
356
- int m_index;
357
- } PgStat_MsgResetslrucounter;
407
+ /* functions called from postmaster */
408
+ extern Size StatsShmemSize(void);
409
+ extern void StatsShmemInit(void);
358
410
 
359
- /* ----------
360
- * PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal
361
- * that a database is going to be processed
362
- * ----------
363
- */
364
- typedef struct PgStat_MsgAutovacStart
365
- {
366
- PgStat_MsgHdr m_hdr;
367
- Oid m_databaseid;
368
- TimestampTz m_start_time;
369
- } PgStat_MsgAutovacStart;
411
+ /* Functions called during server startup / shutdown */
412
+ extern void pgstat_restore_stats(void);
413
+ extern void pgstat_discard_stats(void);
414
+ extern void pgstat_before_server_shutdown(int code, Datum arg);
370
415
 
416
+ /* Functions for backend initialization */
417
+ extern void pgstat_initialize(void);
371
418
 
372
- /* ----------
373
- * PgStat_MsgVacuum Sent by the backend or autovacuum daemon
374
- * after VACUUM
375
- * ----------
376
- */
377
- typedef struct PgStat_MsgVacuum
378
- {
379
- PgStat_MsgHdr m_hdr;
380
- Oid m_databaseid;
381
- Oid m_tableoid;
382
- bool m_autovacuum;
383
- TimestampTz m_vacuumtime;
384
- PgStat_Counter m_live_tuples;
385
- PgStat_Counter m_dead_tuples;
386
- } PgStat_MsgVacuum;
419
+ /* Functions called from backends */
420
+ extern long pgstat_report_stat(bool force);
421
+ extern void pgstat_force_next_flush(void);
387
422
 
423
+ extern void pgstat_reset_counters(void);
424
+ extern void pgstat_reset(PgStat_Kind kind, Oid dboid, Oid objectid);
425
+ extern void pgstat_reset_of_kind(PgStat_Kind kind);
388
426
 
389
- /* ----------
390
- * PgStat_MsgAnalyze Sent by the backend or autovacuum daemon
391
- * after ANALYZE
392
- * ----------
393
- */
394
- typedef struct PgStat_MsgAnalyze
395
- {
396
- PgStat_MsgHdr m_hdr;
397
- Oid m_databaseid;
398
- Oid m_tableoid;
399
- bool m_autovacuum;
400
- bool m_resetcounter;
401
- TimestampTz m_analyzetime;
402
- PgStat_Counter m_live_tuples;
403
- PgStat_Counter m_dead_tuples;
404
- } PgStat_MsgAnalyze;
427
+ /* stats accessors */
428
+ extern void pgstat_clear_snapshot(void);
429
+ extern TimestampTz pgstat_get_stat_snapshot_timestamp(bool *have_snapshot);
405
430
 
431
+ /* helpers */
432
+ extern PgStat_Kind pgstat_get_kind_from_str(char *kind_str);
433
+ extern bool pgstat_have_entry(PgStat_Kind kind, Oid dboid, Oid objoid);
406
434
 
407
- /* ----------
408
- * PgStat_MsgArchiver Sent by the archiver to update statistics.
409
- * ----------
410
- */
411
- typedef struct PgStat_MsgArchiver
412
- {
413
- PgStat_MsgHdr m_hdr;
414
- bool m_failed; /* Failed attempt */
415
- char m_xlog[MAX_XFN_CHARS + 1];
416
- TimestampTz m_timestamp;
417
- } PgStat_MsgArchiver;
418
435
 
419
- /* ----------
420
- * PgStat_MsgBgWriter Sent by the bgwriter to update statistics.
421
- * ----------
436
+ /*
437
+ * Functions in pgstat_archiver.c
422
438
  */
423
- typedef struct PgStat_MsgBgWriter
424
- {
425
- PgStat_MsgHdr m_hdr;
426
-
427
- PgStat_Counter m_timed_checkpoints;
428
- PgStat_Counter m_requested_checkpoints;
429
- PgStat_Counter m_buf_written_checkpoints;
430
- PgStat_Counter m_buf_written_clean;
431
- PgStat_Counter m_maxwritten_clean;
432
- PgStat_Counter m_buf_written_backend;
433
- PgStat_Counter m_buf_fsync_backend;
434
- PgStat_Counter m_buf_alloc;
435
- PgStat_Counter m_checkpoint_write_time; /* times in milliseconds */
436
- PgStat_Counter m_checkpoint_sync_time;
437
- } PgStat_MsgBgWriter;
438
439
 
439
- /* ----------
440
- * PgStat_MsgSLRU Sent by a backend to update SLRU statistics.
441
- * ----------
442
- */
443
- typedef struct PgStat_MsgSLRU
444
- {
445
- PgStat_MsgHdr m_hdr;
446
- PgStat_Counter m_index;
447
- PgStat_Counter m_blocks_zeroed;
448
- PgStat_Counter m_blocks_hit;
449
- PgStat_Counter m_blocks_read;
450
- PgStat_Counter m_blocks_written;
451
- PgStat_Counter m_blocks_exists;
452
- PgStat_Counter m_flush;
453
- PgStat_Counter m_truncate;
454
- } PgStat_MsgSLRU;
440
+ extern void pgstat_report_archiver(const char *xlog, bool failed);
441
+ extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
455
442
 
456
- /* ----------
457
- * PgStat_MsgRecoveryConflict Sent by the backend upon recovery conflict
458
- * ----------
443
+
444
+ /*
445
+ * Functions in pgstat_bgwriter.c
459
446
  */
460
- typedef struct PgStat_MsgRecoveryConflict
461
- {
462
- PgStat_MsgHdr m_hdr;
463
447
 
464
- Oid m_databaseid;
465
- int m_reason;
466
- } PgStat_MsgRecoveryConflict;
448
+ extern void pgstat_report_bgwriter(void);
449
+ extern PgStat_BgWriterStats *pgstat_fetch_stat_bgwriter(void);
467
450
 
468
- /* ----------
469
- * PgStat_MsgTempFile Sent by the backend upon creating a temp file
470
- * ----------
451
+
452
+ /*
453
+ * Functions in pgstat_checkpointer.c
471
454
  */
472
- typedef struct PgStat_MsgTempFile
473
- {
474
- PgStat_MsgHdr m_hdr;
475
455
 
476
- Oid m_databaseid;
477
- size_t m_filesize;
478
- } PgStat_MsgTempFile;
456
+ extern void pgstat_report_checkpointer(void);
457
+ extern PgStat_CheckpointerStats *pgstat_fetch_stat_checkpointer(void);
479
458
 
480
- /* ----------
481
- * PgStat_FunctionCounts The actual per-function counts kept by a backend
482
- *
483
- * This struct should contain only actual event counters, because we memcmp
484
- * it against zeroes to detect whether there are any counts to transmit.
485
- *
486
- * Note that the time counters are in instr_time format here. We convert to
487
- * microseconds in PgStat_Counter format when transmitting to the collector.
488
- * ----------
489
- */
490
- typedef struct PgStat_FunctionCounts
491
- {
492
- PgStat_Counter f_numcalls;
493
- instr_time f_total_time;
494
- instr_time f_self_time;
495
- } PgStat_FunctionCounts;
496
-
497
- /* ----------
498
- * PgStat_BackendFunctionEntry Entry in backend's per-function hash table
499
- * ----------
500
- */
501
- typedef struct PgStat_BackendFunctionEntry
502
- {
503
- Oid f_id;
504
- PgStat_FunctionCounts f_counts;
505
- } PgStat_BackendFunctionEntry;
506
-
507
- /* ----------
508
- * PgStat_FunctionEntry Per-function info in a MsgFuncstat
509
- * ----------
510
- */
511
- typedef struct PgStat_FunctionEntry
512
- {
513
- Oid f_id;
514
- PgStat_Counter f_numcalls;
515
- PgStat_Counter f_total_time; /* times in microseconds */
516
- PgStat_Counter f_self_time;
517
- } PgStat_FunctionEntry;
518
-
519
- /* ----------
520
- * PgStat_MsgFuncstat Sent by the backend to report function
521
- * usage statistics.
522
- * ----------
523
- */
524
- #define PGSTAT_NUM_FUNCENTRIES \
525
- ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
526
- / sizeof(PgStat_FunctionEntry))
527
-
528
- typedef struct PgStat_MsgFuncstat
529
- {
530
- PgStat_MsgHdr m_hdr;
531
- Oid m_databaseid;
532
- int m_nentries;
533
- PgStat_FunctionEntry m_entry[PGSTAT_NUM_FUNCENTRIES];
534
- } PgStat_MsgFuncstat;
535
-
536
- /* ----------
537
- * PgStat_MsgFuncpurge Sent by the backend to tell the collector
538
- * about dead functions.
539
- * ----------
540
- */
541
- #define PGSTAT_NUM_FUNCPURGE \
542
- ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \
543
- / sizeof(Oid))
544
-
545
- typedef struct PgStat_MsgFuncpurge
546
- {
547
- PgStat_MsgHdr m_hdr;
548
- Oid m_databaseid;
549
- int m_nentries;
550
- Oid m_functionid[PGSTAT_NUM_FUNCPURGE];
551
- } PgStat_MsgFuncpurge;
552
-
553
- /* ----------
554
- * PgStat_MsgDeadlock Sent by the backend to tell the collector
555
- * about a deadlock that occurred.
556
- * ----------
557
- */
558
- typedef struct PgStat_MsgDeadlock
559
- {
560
- PgStat_MsgHdr m_hdr;
561
- Oid m_databaseid;
562
- } PgStat_MsgDeadlock;
563
-
564
- /* ----------
565
- * PgStat_MsgChecksumFailure Sent by the backend to tell the collector
566
- * about checksum failures noticed.
567
- * ----------
568
- */
569
- typedef struct PgStat_MsgChecksumFailure
570
- {
571
- PgStat_MsgHdr m_hdr;
572
- Oid m_databaseid;
573
- int m_failurecount;
574
- TimestampTz m_failure_time;
575
- } PgStat_MsgChecksumFailure;
576
-
577
-
578
- /* ----------
579
- * PgStat_Msg Union over all possible messages.
580
- * ----------
581
- */
582
- typedef union PgStat_Msg
583
- {
584
- PgStat_MsgHdr msg_hdr;
585
- PgStat_MsgDummy msg_dummy;
586
- PgStat_MsgInquiry msg_inquiry;
587
- PgStat_MsgTabstat msg_tabstat;
588
- PgStat_MsgTabpurge msg_tabpurge;
589
- PgStat_MsgDropdb msg_dropdb;
590
- PgStat_MsgResetcounter msg_resetcounter;
591
- PgStat_MsgResetsharedcounter msg_resetsharedcounter;
592
- PgStat_MsgResetsinglecounter msg_resetsinglecounter;
593
- PgStat_MsgResetslrucounter msg_resetslrucounter;
594
- PgStat_MsgAutovacStart msg_autovacuum_start;
595
- PgStat_MsgVacuum msg_vacuum;
596
- PgStat_MsgAnalyze msg_analyze;
597
- PgStat_MsgArchiver msg_archiver;
598
- PgStat_MsgBgWriter msg_bgwriter;
599
- PgStat_MsgSLRU msg_slru;
600
- PgStat_MsgFuncstat msg_funcstat;
601
- PgStat_MsgFuncpurge msg_funcpurge;
602
- PgStat_MsgRecoveryConflict msg_recoveryconflict;
603
- PgStat_MsgDeadlock msg_deadlock;
604
- PgStat_MsgTempFile msg_tempfile;
605
- PgStat_MsgChecksumFailure msg_checksumfailure;
606
- } PgStat_Msg;
607
-
608
-
609
- /* ------------------------------------------------------------
610
- * Statistic collector data structures follow
611
- *
612
- * PGSTAT_FILE_FORMAT_ID should be changed whenever any of these
613
- * data structures change.
614
- * ------------------------------------------------------------
615
- */
616
-
617
- #define PGSTAT_FILE_FORMAT_ID 0x01A5BC9D
618
-
619
- /* ----------
620
- * PgStat_StatDBEntry The collector's data per database
621
- * ----------
622
- */
623
- typedef struct PgStat_StatDBEntry
624
- {
625
- Oid databaseid;
626
- PgStat_Counter n_xact_commit;
627
- PgStat_Counter n_xact_rollback;
628
- PgStat_Counter n_blocks_fetched;
629
- PgStat_Counter n_blocks_hit;
630
- PgStat_Counter n_tuples_returned;
631
- PgStat_Counter n_tuples_fetched;
632
- PgStat_Counter n_tuples_inserted;
633
- PgStat_Counter n_tuples_updated;
634
- PgStat_Counter n_tuples_deleted;
635
- TimestampTz last_autovac_time;
636
- PgStat_Counter n_conflict_tablespace;
637
- PgStat_Counter n_conflict_lock;
638
- PgStat_Counter n_conflict_snapshot;
639
- PgStat_Counter n_conflict_bufferpin;
640
- PgStat_Counter n_conflict_startup_deadlock;
641
- PgStat_Counter n_temp_files;
642
- PgStat_Counter n_temp_bytes;
643
- PgStat_Counter n_deadlocks;
644
- PgStat_Counter n_checksum_failures;
645
- TimestampTz last_checksum_failure;
646
- PgStat_Counter n_block_read_time; /* times in microseconds */
647
- PgStat_Counter n_block_write_time;
648
-
649
- TimestampTz stat_reset_timestamp;
650
- TimestampTz stats_timestamp; /* time of db stats file update */
651
-
652
- /*
653
- * tables and functions must be last in the struct, because we don't write
654
- * the pointers out to the stats file.
655
- */
656
- HTAB *tables;
657
- HTAB *functions;
658
- } PgStat_StatDBEntry;
659
-
660
-
661
- /* ----------
662
- * PgStat_StatTabEntry The collector's data per table (or index)
663
- * ----------
664
- */
665
- typedef struct PgStat_StatTabEntry
666
- {
667
- Oid tableid;
668
-
669
- PgStat_Counter numscans;
670
-
671
- PgStat_Counter tuples_returned;
672
- PgStat_Counter tuples_fetched;
673
-
674
- PgStat_Counter tuples_inserted;
675
- PgStat_Counter tuples_updated;
676
- PgStat_Counter tuples_deleted;
677
- PgStat_Counter tuples_hot_updated;
678
-
679
- PgStat_Counter n_live_tuples;
680
- PgStat_Counter n_dead_tuples;
681
- PgStat_Counter changes_since_analyze;
682
- PgStat_Counter inserts_since_vacuum;
683
-
684
- PgStat_Counter blocks_fetched;
685
- PgStat_Counter blocks_hit;
686
-
687
- TimestampTz vacuum_timestamp; /* user initiated vacuum */
688
- PgStat_Counter vacuum_count;
689
- TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */
690
- PgStat_Counter autovac_vacuum_count;
691
- TimestampTz analyze_timestamp; /* user initiated */
692
- PgStat_Counter analyze_count;
693
- TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */
694
- PgStat_Counter autovac_analyze_count;
695
- } PgStat_StatTabEntry;
696
-
697
-
698
- /* ----------
699
- * PgStat_StatFuncEntry The collector's data per function
700
- * ----------
701
- */
702
- typedef struct PgStat_StatFuncEntry
703
- {
704
- Oid functionid;
705
-
706
- PgStat_Counter f_numcalls;
707
-
708
- PgStat_Counter f_total_time; /* times in microseconds */
709
- PgStat_Counter f_self_time;
710
- } PgStat_StatFuncEntry;
711
-
712
-
713
- /*
714
- * Archiver statistics kept in the stats collector
715
- */
716
- typedef struct PgStat_ArchiverStats
717
- {
718
- PgStat_Counter archived_count; /* archival successes */
719
- char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file
720
- * archived */
721
- TimestampTz last_archived_timestamp; /* last archival success time */
722
- PgStat_Counter failed_count; /* failed archival attempts */
723
- char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in
724
- * last failure */
725
- TimestampTz last_failed_timestamp; /* last archival failure time */
726
- TimestampTz stat_reset_timestamp;
727
- } PgStat_ArchiverStats;
728
459
 
729
460
  /*
730
- * Global statistics kept in the stats collector
461
+ * Functions in pgstat_database.c
731
462
  */
732
- typedef struct PgStat_GlobalStats
733
- {
734
- TimestampTz stats_timestamp; /* time of stats file update */
735
- PgStat_Counter timed_checkpoints;
736
- PgStat_Counter requested_checkpoints;
737
- PgStat_Counter checkpoint_write_time; /* times in milliseconds */
738
- PgStat_Counter checkpoint_sync_time;
739
- PgStat_Counter buf_written_checkpoints;
740
- PgStat_Counter buf_written_clean;
741
- PgStat_Counter maxwritten_clean;
742
- PgStat_Counter buf_written_backend;
743
- PgStat_Counter buf_fsync_backend;
744
- PgStat_Counter buf_alloc;
745
- TimestampTz stat_reset_timestamp;
746
- } PgStat_GlobalStats;
747
463
 
748
- /*
749
- * SLRU statistics kept in the stats collector
750
- */
751
- typedef struct PgStat_SLRUStats
752
- {
753
- PgStat_Counter blocks_zeroed;
754
- PgStat_Counter blocks_hit;
755
- PgStat_Counter blocks_read;
756
- PgStat_Counter blocks_written;
757
- PgStat_Counter blocks_exists;
758
- PgStat_Counter flush;
759
- PgStat_Counter truncate;
760
- TimestampTz stat_reset_timestamp;
761
- } PgStat_SLRUStats;
762
-
763
-
764
- /* ----------
765
- * Backend states
766
- * ----------
767
- */
768
- typedef enum BackendState
769
- {
770
- STATE_UNDEFINED,
771
- STATE_IDLE,
772
- STATE_RUNNING,
773
- STATE_IDLEINTRANSACTION,
774
- STATE_FASTPATH,
775
- STATE_IDLEINTRANSACTION_ABORTED,
776
- STATE_DISABLED
777
- } BackendState;
778
-
779
-
780
- /* ----------
781
- * Wait Classes
782
- * ----------
783
- */
784
- #define PG_WAIT_LWLOCK 0x01000000U
785
- #define PG_WAIT_LOCK 0x03000000U
786
- #define PG_WAIT_BUFFER_PIN 0x04000000U
787
- #define PG_WAIT_ACTIVITY 0x05000000U
788
- #define PG_WAIT_CLIENT 0x06000000U
789
- #define PG_WAIT_EXTENSION 0x07000000U
790
- #define PG_WAIT_IPC 0x08000000U
791
- #define PG_WAIT_TIMEOUT 0x09000000U
792
- #define PG_WAIT_IO 0x0A000000U
793
-
794
- /* ----------
795
- * Wait Events - Activity
796
- *
797
- * Use this category when a process is waiting because it has no work to do,
798
- * unless the "Client" or "Timeout" category describes the situation better.
799
- * Typically, this should only be used for background processes.
800
- * ----------
801
- */
802
- typedef enum
803
- {
804
- WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY,
805
- WAIT_EVENT_AUTOVACUUM_MAIN,
806
- WAIT_EVENT_BGWRITER_HIBERNATE,
807
- WAIT_EVENT_BGWRITER_MAIN,
808
- WAIT_EVENT_CHECKPOINTER_MAIN,
809
- WAIT_EVENT_LOGICAL_APPLY_MAIN,
810
- WAIT_EVENT_LOGICAL_LAUNCHER_MAIN,
811
- WAIT_EVENT_PGSTAT_MAIN,
812
- WAIT_EVENT_RECOVERY_WAL_STREAM,
813
- WAIT_EVENT_SYSLOGGER_MAIN,
814
- WAIT_EVENT_WAL_RECEIVER_MAIN,
815
- WAIT_EVENT_WAL_SENDER_MAIN,
816
- WAIT_EVENT_WAL_WRITER_MAIN
817
- } WaitEventActivity;
818
-
819
- /* ----------
820
- * Wait Events - Client
821
- *
822
- * Use this category when a process is waiting to send data to or receive data
823
- * from the frontend process to which it is connected. This is never used for
824
- * a background process, which has no client connection.
825
- * ----------
826
- */
827
- typedef enum
828
- {
829
- WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT,
830
- WAIT_EVENT_CLIENT_WRITE,
831
- WAIT_EVENT_GSS_OPEN_SERVER,
832
- WAIT_EVENT_LIBPQWALRECEIVER_CONNECT,
833
- WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE,
834
- WAIT_EVENT_SSL_OPEN_SERVER,
835
- WAIT_EVENT_WAL_RECEIVER_WAIT_START,
836
- WAIT_EVENT_WAL_SENDER_WAIT_WAL,
837
- WAIT_EVENT_WAL_SENDER_WRITE_DATA,
838
- } WaitEventClient;
839
-
840
- /* ----------
841
- * Wait Events - IPC
842
- *
843
- * Use this category when a process cannot complete the work it is doing because
844
- * it is waiting for a notification from another process.
845
- * ----------
846
- */
847
- typedef enum
848
- {
849
- WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE = PG_WAIT_IPC,
850
- WAIT_EVENT_BGWORKER_SHUTDOWN,
851
- WAIT_EVENT_BGWORKER_STARTUP,
852
- WAIT_EVENT_BTREE_PAGE,
853
- WAIT_EVENT_CHECKPOINT_DONE,
854
- WAIT_EVENT_CHECKPOINT_START,
855
- WAIT_EVENT_EXECUTE_GATHER,
856
- WAIT_EVENT_HASH_BATCH_ALLOCATE,
857
- WAIT_EVENT_HASH_BATCH_ELECT,
858
- WAIT_EVENT_HASH_BATCH_LOAD,
859
- WAIT_EVENT_HASH_BUILD_ALLOCATE,
860
- WAIT_EVENT_HASH_BUILD_ELECT,
861
- WAIT_EVENT_HASH_BUILD_HASH_INNER,
862
- WAIT_EVENT_HASH_BUILD_HASH_OUTER,
863
- WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE,
864
- WAIT_EVENT_HASH_GROW_BATCHES_DECIDE,
865
- WAIT_EVENT_HASH_GROW_BATCHES_ELECT,
866
- WAIT_EVENT_HASH_GROW_BATCHES_FINISH,
867
- WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION,
868
- WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE,
869
- WAIT_EVENT_HASH_GROW_BUCKETS_ELECT,
870
- WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT,
871
- WAIT_EVENT_LOGICAL_SYNC_DATA,
872
- WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE,
873
- WAIT_EVENT_MQ_INTERNAL,
874
- WAIT_EVENT_MQ_PUT_MESSAGE,
875
- WAIT_EVENT_MQ_RECEIVE,
876
- WAIT_EVENT_MQ_SEND,
877
- WAIT_EVENT_PARALLEL_BITMAP_SCAN,
878
- WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN,
879
- WAIT_EVENT_PARALLEL_FINISH,
880
- WAIT_EVENT_PROCARRAY_GROUP_UPDATE,
881
- WAIT_EVENT_PROC_SIGNAL_BARRIER,
882
- WAIT_EVENT_PROMOTE,
883
- WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT,
884
- WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE,
885
- WAIT_EVENT_RECOVERY_PAUSE,
886
- WAIT_EVENT_REPLICATION_ORIGIN_DROP,
887
- WAIT_EVENT_REPLICATION_SLOT_DROP,
888
- WAIT_EVENT_SAFE_SNAPSHOT,
889
- WAIT_EVENT_SYNC_REP,
890
- WAIT_EVENT_XACT_GROUP_UPDATE
891
- } WaitEventIPC;
892
-
893
- /* ----------
894
- * Wait Events - Timeout
895
- *
896
- * Use this category when a process is waiting for a timeout to expire.
897
- * ----------
898
- */
899
- typedef enum
900
- {
901
- WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT,
902
- WAIT_EVENT_PG_SLEEP,
903
- WAIT_EVENT_RECOVERY_APPLY_DELAY,
904
- WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL,
905
- WAIT_EVENT_VACUUM_DELAY
906
- } WaitEventTimeout;
907
-
908
- /* ----------
909
- * Wait Events - IO
910
- *
911
- * Use this category when a process is waiting for a IO.
912
- * ----------
913
- */
914
- typedef enum
915
- {
916
- WAIT_EVENT_BUFFILE_READ = PG_WAIT_IO,
917
- WAIT_EVENT_BUFFILE_WRITE,
918
- WAIT_EVENT_CONTROL_FILE_READ,
919
- WAIT_EVENT_CONTROL_FILE_SYNC,
920
- WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE,
921
- WAIT_EVENT_CONTROL_FILE_WRITE,
922
- WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE,
923
- WAIT_EVENT_COPY_FILE_READ,
924
- WAIT_EVENT_COPY_FILE_WRITE,
925
- WAIT_EVENT_DATA_FILE_EXTEND,
926
- WAIT_EVENT_DATA_FILE_FLUSH,
927
- WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC,
928
- WAIT_EVENT_DATA_FILE_PREFETCH,
929
- WAIT_EVENT_DATA_FILE_READ,
930
- WAIT_EVENT_DATA_FILE_SYNC,
931
- WAIT_EVENT_DATA_FILE_TRUNCATE,
932
- WAIT_EVENT_DATA_FILE_WRITE,
933
- WAIT_EVENT_DSM_FILL_ZERO_WRITE,
934
- WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ,
935
- WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC,
936
- WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE,
937
- WAIT_EVENT_LOCK_FILE_CREATE_READ,
938
- WAIT_EVENT_LOCK_FILE_CREATE_SYNC,
939
- WAIT_EVENT_LOCK_FILE_CREATE_WRITE,
940
- WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ,
941
- WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC,
942
- WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC,
943
- WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE,
944
- WAIT_EVENT_LOGICAL_REWRITE_SYNC,
945
- WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE,
946
- WAIT_EVENT_LOGICAL_REWRITE_WRITE,
947
- WAIT_EVENT_RELATION_MAP_READ,
948
- WAIT_EVENT_RELATION_MAP_SYNC,
949
- WAIT_EVENT_RELATION_MAP_WRITE,
950
- WAIT_EVENT_REORDER_BUFFER_READ,
951
- WAIT_EVENT_REORDER_BUFFER_WRITE,
952
- WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ,
953
- WAIT_EVENT_REPLICATION_SLOT_READ,
954
- WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC,
955
- WAIT_EVENT_REPLICATION_SLOT_SYNC,
956
- WAIT_EVENT_REPLICATION_SLOT_WRITE,
957
- WAIT_EVENT_SLRU_FLUSH_SYNC,
958
- WAIT_EVENT_SLRU_READ,
959
- WAIT_EVENT_SLRU_SYNC,
960
- WAIT_EVENT_SLRU_WRITE,
961
- WAIT_EVENT_SNAPBUILD_READ,
962
- WAIT_EVENT_SNAPBUILD_SYNC,
963
- WAIT_EVENT_SNAPBUILD_WRITE,
964
- WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC,
965
- WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE,
966
- WAIT_EVENT_TIMELINE_HISTORY_READ,
967
- WAIT_EVENT_TIMELINE_HISTORY_SYNC,
968
- WAIT_EVENT_TIMELINE_HISTORY_WRITE,
969
- WAIT_EVENT_TWOPHASE_FILE_READ,
970
- WAIT_EVENT_TWOPHASE_FILE_SYNC,
971
- WAIT_EVENT_TWOPHASE_FILE_WRITE,
972
- WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ,
973
- WAIT_EVENT_WAL_BOOTSTRAP_SYNC,
974
- WAIT_EVENT_WAL_BOOTSTRAP_WRITE,
975
- WAIT_EVENT_WAL_COPY_READ,
976
- WAIT_EVENT_WAL_COPY_SYNC,
977
- WAIT_EVENT_WAL_COPY_WRITE,
978
- WAIT_EVENT_WAL_INIT_SYNC,
979
- WAIT_EVENT_WAL_INIT_WRITE,
980
- WAIT_EVENT_WAL_READ,
981
- WAIT_EVENT_WAL_SYNC,
982
- WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN,
983
- WAIT_EVENT_WAL_WRITE
984
- } WaitEventIO;
985
-
986
- /* ----------
987
- * Command type for progress reporting purposes
988
- * ----------
989
- */
990
- typedef enum ProgressCommandType
991
- {
992
- PROGRESS_COMMAND_INVALID,
993
- PROGRESS_COMMAND_VACUUM,
994
- PROGRESS_COMMAND_ANALYZE,
995
- PROGRESS_COMMAND_CLUSTER,
996
- PROGRESS_COMMAND_CREATE_INDEX,
997
- PROGRESS_COMMAND_BASEBACKUP
998
- } ProgressCommandType;
999
-
1000
- #define PGSTAT_NUM_PROGRESS_PARAM 20
1001
-
1002
- /* ----------
1003
- * Shared-memory data structures
1004
- * ----------
1005
- */
1006
-
1007
-
1008
- /*
1009
- * PgBackendSSLStatus
1010
- *
1011
- * For each backend, we keep the SSL status in a separate struct, that
1012
- * is only filled in if SSL is enabled.
1013
- *
1014
- * All char arrays must be null-terminated.
1015
- */
1016
- typedef struct PgBackendSSLStatus
1017
- {
1018
- /* Information about SSL connection */
1019
- int ssl_bits;
1020
- bool ssl_compression;
1021
- char ssl_version[NAMEDATALEN];
1022
- char ssl_cipher[NAMEDATALEN];
1023
- char ssl_client_dn[NAMEDATALEN];
1024
-
1025
- /*
1026
- * serial number is max "20 octets" per RFC 5280, so this size should be
1027
- * fine
1028
- */
1029
- char ssl_client_serial[NAMEDATALEN];
1030
-
1031
- char ssl_issuer_dn[NAMEDATALEN];
1032
- } PgBackendSSLStatus;
1033
-
1034
- /*
1035
- * PgBackendGSSStatus
1036
- *
1037
- * For each backend, we keep the GSS status in a separate struct, that
1038
- * is only filled in if GSS is enabled.
1039
- *
1040
- * All char arrays must be null-terminated.
1041
- */
1042
- typedef struct PgBackendGSSStatus
1043
- {
1044
- /* Information about GSSAPI connection */
1045
- char gss_princ[NAMEDATALEN]; /* GSSAPI Principal used to auth */
1046
- bool gss_auth; /* If GSSAPI authentication was used */
1047
- bool gss_enc; /* If encryption is being used */
1048
-
1049
- } PgBackendGSSStatus;
1050
-
1051
-
1052
- /* ----------
1053
- * PgBackendStatus
1054
- *
1055
- * Each live backend maintains a PgBackendStatus struct in shared memory
1056
- * showing its current activity. (The structs are allocated according to
1057
- * BackendId, but that is not critical.) Note that the collector process
1058
- * has no involvement in, or even access to, these structs.
1059
- *
1060
- * Each auxiliary process also maintains a PgBackendStatus struct in shared
1061
- * memory.
1062
- * ----------
1063
- */
1064
- typedef struct PgBackendStatus
1065
- {
1066
- /*
1067
- * To avoid locking overhead, we use the following protocol: a backend
1068
- * increments st_changecount before modifying its entry, and again after
1069
- * finishing a modification. A would-be reader should note the value of
1070
- * st_changecount, copy the entry into private memory, then check
1071
- * st_changecount again. If the value hasn't changed, and if it's even,
1072
- * the copy is valid; otherwise start over. This makes updates cheap
1073
- * while reads are potentially expensive, but that's the tradeoff we want.
1074
- *
1075
- * The above protocol needs memory barriers to ensure that the apparent
1076
- * order of execution is as it desires. Otherwise, for example, the CPU
1077
- * might rearrange the code so that st_changecount is incremented twice
1078
- * before the modification on a machine with weak memory ordering. Hence,
1079
- * use the macros defined below for manipulating st_changecount, rather
1080
- * than touching it directly.
1081
- */
1082
- int st_changecount;
1083
-
1084
- /* The entry is valid iff st_procpid > 0, unused if st_procpid == 0 */
1085
- int st_procpid;
1086
-
1087
- /* Type of backends */
1088
- BackendType st_backendType;
1089
-
1090
- /* Times when current backend, transaction, and activity started */
1091
- TimestampTz st_proc_start_timestamp;
1092
- TimestampTz st_xact_start_timestamp;
1093
- TimestampTz st_activity_start_timestamp;
1094
- TimestampTz st_state_start_timestamp;
1095
-
1096
- /* Database OID, owning user's OID, connection client address */
1097
- Oid st_databaseid;
1098
- Oid st_userid;
1099
- SockAddr st_clientaddr;
1100
- char *st_clienthostname; /* MUST be null-terminated */
1101
-
1102
- /* Information about SSL connection */
1103
- bool st_ssl;
1104
- PgBackendSSLStatus *st_sslstatus;
1105
-
1106
- /* Information about GSSAPI connection */
1107
- bool st_gss;
1108
- PgBackendGSSStatus *st_gssstatus;
1109
-
1110
- /* current state */
1111
- BackendState st_state;
1112
-
1113
- /* application name; MUST be null-terminated */
1114
- char *st_appname;
464
+ extern void pgstat_drop_database(Oid databaseid);
465
+ extern void pgstat_report_autovac(Oid dboid);
466
+ extern void pgstat_report_recovery_conflict(int reason);
467
+ extern void pgstat_report_deadlock(void);
468
+ extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount);
469
+ extern void pgstat_report_checksum_failure(void);
470
+ extern void pgstat_report_connect(Oid dboid);
1115
471
 
1116
- /*
1117
- * Current command string; MUST be null-terminated. Note that this string
1118
- * possibly is truncated in the middle of a multi-byte character. As
1119
- * activity strings are stored more frequently than read, that allows to
1120
- * move the cost of correct truncation to the display side. Use
1121
- * pgstat_clip_activity() to truncate correctly.
1122
- */
1123
- char *st_activity_raw;
472
+ #define pgstat_count_buffer_read_time(n) \
473
+ (pgStatBlockReadTime += (n))
474
+ #define pgstat_count_buffer_write_time(n) \
475
+ (pgStatBlockWriteTime += (n))
476
+ #define pgstat_count_conn_active_time(n) \
477
+ (pgStatActiveTime += (n))
478
+ #define pgstat_count_conn_txn_idle_time(n) \
479
+ (pgStatTransactionIdleTime += (n))
1124
480
 
1125
- /*
1126
- * Command progress reporting. Any command which wishes can advertise
1127
- * that it is running by setting st_progress_command,
1128
- * st_progress_command_target, and st_progress_param[].
1129
- * st_progress_command_target should be the OID of the relation which the
1130
- * command targets (we assume there's just one, as this is meant for
1131
- * utility commands), but the meaning of each element in the
1132
- * st_progress_param array is command-specific.
1133
- */
1134
- ProgressCommandType st_progress_command;
1135
- Oid st_progress_command_target;
1136
- int64 st_progress_param[PGSTAT_NUM_PROGRESS_PARAM];
1137
- } PgBackendStatus;
481
+ extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid);
1138
482
 
1139
483
  /*
1140
- * Macros to load and store st_changecount with appropriate memory barriers.
1141
- *
1142
- * Use PGSTAT_BEGIN_WRITE_ACTIVITY() before, and PGSTAT_END_WRITE_ACTIVITY()
1143
- * after, modifying the current process's PgBackendStatus data. Note that,
1144
- * since there is no mechanism for cleaning up st_changecount after an error,
1145
- * THESE MACROS FORM A CRITICAL SECTION. Any error between them will be
1146
- * promoted to PANIC, causing a database restart to clean up shared memory!
1147
- * Hence, keep the critical section as short and straight-line as possible.
1148
- * Aside from being safer, that minimizes the window in which readers will
1149
- * have to loop.
1150
- *
1151
- * Reader logic should follow this sketch:
1152
- *
1153
- * for (;;)
1154
- * {
1155
- * int before_ct, after_ct;
1156
- *
1157
- * pgstat_begin_read_activity(beentry, before_ct);
1158
- * ... copy beentry data to local memory ...
1159
- * pgstat_end_read_activity(beentry, after_ct);
1160
- * if (pgstat_read_activity_complete(before_ct, after_ct))
1161
- * break;
1162
- * CHECK_FOR_INTERRUPTS();
1163
- * }
1164
- *
1165
- * For extra safety, we generally use volatile beentry pointers, although
1166
- * the memory barriers should theoretically be sufficient.
484
+ * Functions in pgstat_function.c
1167
485
  */
1168
- #define PGSTAT_BEGIN_WRITE_ACTIVITY(beentry) \
1169
- do { \
1170
- START_CRIT_SECTION(); \
1171
- (beentry)->st_changecount++; \
1172
- pg_write_barrier(); \
1173
- } while (0)
1174
486
 
1175
- #define PGSTAT_END_WRITE_ACTIVITY(beentry) \
1176
- do { \
1177
- pg_write_barrier(); \
1178
- (beentry)->st_changecount++; \
1179
- Assert(((beentry)->st_changecount & 1) == 0); \
1180
- END_CRIT_SECTION(); \
1181
- } while (0)
1182
-
1183
- #define pgstat_begin_read_activity(beentry, before_changecount) \
1184
- do { \
1185
- (before_changecount) = (beentry)->st_changecount; \
1186
- pg_read_barrier(); \
1187
- } while (0)
1188
-
1189
- #define pgstat_end_read_activity(beentry, after_changecount) \
1190
- do { \
1191
- pg_read_barrier(); \
1192
- (after_changecount) = (beentry)->st_changecount; \
1193
- } while (0)
1194
-
1195
- #define pgstat_read_activity_complete(before_changecount, after_changecount) \
1196
- ((before_changecount) == (after_changecount) && \
1197
- ((before_changecount) & 1) == 0)
1198
-
1199
-
1200
- /* ----------
1201
- * LocalPgBackendStatus
1202
- *
1203
- * When we build the backend status array, we use LocalPgBackendStatus to be
1204
- * able to add new values to the struct when needed without adding new fields
1205
- * to the shared memory. It contains the backend status as a first member.
1206
- * ----------
1207
- */
1208
- typedef struct LocalPgBackendStatus
1209
- {
1210
- /*
1211
- * Local version of the backend status entry.
1212
- */
1213
- PgBackendStatus backendStatus;
1214
-
1215
- /*
1216
- * The xid of the current transaction if available, InvalidTransactionId
1217
- * if not.
1218
- */
1219
- TransactionId backend_xid;
1220
-
1221
- /*
1222
- * The xmin of the current session if available, InvalidTransactionId if
1223
- * not.
1224
- */
1225
- TransactionId backend_xmin;
1226
- } LocalPgBackendStatus;
1227
-
1228
- /*
1229
- * Working state needed to accumulate per-function-call timing statistics.
1230
- */
1231
- typedef struct PgStat_FunctionCallUsage
1232
- {
1233
- /* Link to function's hashtable entry (must still be there at exit!) */
1234
- /* NULL means we are not tracking the current function call */
1235
- PgStat_FunctionCounts *fs;
1236
- /* Total time previously charged to function, as of function start */
1237
- instr_time save_f_total_time;
1238
- /* Backend-wide total time as of function start */
1239
- instr_time save_total;
1240
- /* system clock as of function start */
1241
- instr_time f_start;
1242
- } PgStat_FunctionCallUsage;
487
+ extern void pgstat_create_function(Oid proid);
488
+ extern void pgstat_drop_function(Oid proid);
1243
489
 
490
+ struct FunctionCallInfoBaseData;
491
+ extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo,
492
+ PgStat_FunctionCallUsage *fcu);
493
+ extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu,
494
+ bool finalize);
1244
495
 
1245
- /* ----------
1246
- * GUC parameters
1247
- * ----------
1248
- */
1249
- extern PGDLLIMPORT bool pgstat_track_activities;
1250
- extern PGDLLIMPORT bool pgstat_track_counts;
1251
- extern PGDLLIMPORT int pgstat_track_functions;
1252
- extern PGDLLIMPORT int pgstat_track_activity_query_size;
1253
- extern char *pgstat_stat_directory;
1254
- extern char *pgstat_stat_tmpname;
1255
- extern char *pgstat_stat_filename;
496
+ extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid);
497
+ extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id);
1256
498
 
1257
- /*
1258
- * BgWriter statistics counters are updated directly by bgwriter and bufmgr
1259
- */
1260
- extern PgStat_MsgBgWriter BgWriterStats;
1261
499
 
1262
500
  /*
1263
- * Updated by pgstat_count_buffer_*_time macros
501
+ * Functions in pgstat_relation.c
1264
502
  */
1265
- extern PgStat_Counter pgStatBlockReadTime;
1266
- extern PgStat_Counter pgStatBlockWriteTime;
1267
503
 
1268
- /* ----------
1269
- * Functions called from postmaster
1270
- * ----------
1271
- */
1272
- extern Size BackendStatusShmemSize(void);
1273
- extern void CreateSharedBackendStatus(void);
1274
-
1275
- extern void pgstat_init(void);
1276
- extern int pgstat_start(void);
1277
- extern void pgstat_reset_all(void);
1278
- extern void allow_immediate_pgstat_restart(void);
1279
-
1280
- #ifdef EXEC_BACKEND
1281
- extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn();
1282
- #endif
1283
-
1284
-
1285
- /* ----------
1286
- * Functions called from backends
1287
- * ----------
1288
- */
1289
- extern void pgstat_ping(void);
504
+ extern void pgstat_create_relation(Relation rel);
505
+ extern void pgstat_drop_relation(Relation rel);
506
+ extern void pgstat_copy_relation_stats(Relation dstrel, Relation srcrel);
1290
507
 
1291
- extern void pgstat_report_stat(bool force);
1292
- extern void pgstat_vacuum_stat(void);
1293
- extern void pgstat_drop_database(Oid databaseid);
508
+ extern void pgstat_init_relation(Relation rel);
509
+ extern void pgstat_assoc_relation(Relation rel);
510
+ extern void pgstat_unlink_relation(Relation rel);
1294
511
 
1295
- extern void pgstat_clear_snapshot(void);
1296
- extern void pgstat_reset_counters(void);
1297
- extern void pgstat_reset_shared_counters(const char *);
1298
- extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type);
1299
- extern void pgstat_reset_slru_counter(const char *);
1300
-
1301
- extern void pgstat_report_autovac(Oid dboid);
1302
512
  extern void pgstat_report_vacuum(Oid tableoid, bool shared,
1303
513
  PgStat_Counter livetuples, PgStat_Counter deadtuples);
1304
514
  extern void pgstat_report_analyze(Relation rel,
1305
515
  PgStat_Counter livetuples, PgStat_Counter deadtuples,
1306
516
  bool resetcounter);
1307
517
 
1308
- extern void pgstat_report_recovery_conflict(int reason);
1309
- extern void pgstat_report_deadlock(void);
1310
- extern void pgstat_report_checksum_failures_in_db(Oid dboid, int failurecount);
1311
- extern void pgstat_report_checksum_failure(void);
1312
-
1313
- extern void pgstat_initialize(void);
1314
- extern void pgstat_bestart(void);
1315
-
1316
- extern void pgstat_report_activity(BackendState state, const char *cmd_str);
1317
- extern void pgstat_report_tempfile(size_t filesize);
1318
- extern void pgstat_report_appname(const char *appname);
1319
- extern void pgstat_report_xact_timestamp(TimestampTz tstamp);
1320
- extern const char *pgstat_get_wait_event(uint32 wait_event_info);
1321
- extern const char *pgstat_get_wait_event_type(uint32 wait_event_info);
1322
- extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);
1323
- extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,
1324
- int buflen);
1325
-
1326
- extern void pgstat_progress_start_command(ProgressCommandType cmdtype,
1327
- Oid relid);
1328
- extern void pgstat_progress_update_param(int index, int64 val);
1329
- extern void pgstat_progress_update_multi_param(int nparam, const int *index,
1330
- const int64 *val);
1331
- extern void pgstat_progress_end_command(void);
1332
-
1333
- extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
1334
- extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id);
1335
-
1336
- extern void pgstat_initstats(Relation rel);
1337
-
1338
- extern char *pgstat_clip_activity(const char *raw_activity);
1339
-
1340
- /* ----------
1341
- * pgstat_report_wait_start() -
1342
- *
1343
- * Called from places where server process needs to wait. This is called
1344
- * to report wait event information. The wait information is stored
1345
- * as 4-bytes where first byte represents the wait event class (type of
1346
- * wait, for different types of wait, refer WaitClass) and the next
1347
- * 3-bytes represent the actual wait event. Currently 2-bytes are used
1348
- * for wait event which is sufficient for current usage, 1-byte is
1349
- * reserved for future usage.
1350
- *
1351
- * NB: this *must* be able to survive being called before MyProc has been
1352
- * initialized.
1353
- * ----------
1354
- */
1355
- static inline void
1356
- pgstat_report_wait_start(uint32 wait_event_info)
1357
- {
1358
- volatile PGPROC *proc = MyProc;
1359
-
1360
- if (!pgstat_track_activities || !proc)
1361
- return;
1362
-
1363
- /*
1364
- * Since this is a four-byte field which is always read and written as
1365
- * four-bytes, updates are atomic.
1366
- */
1367
- proc->wait_event_info = wait_event_info;
1368
- }
1369
-
1370
- /* ----------
1371
- * pgstat_report_wait_end() -
1372
- *
1373
- * Called to report end of a wait.
1374
- *
1375
- * NB: this *must* be able to survive being called before MyProc has been
1376
- * initialized.
1377
- * ----------
518
+ /*
519
+ * If stats are enabled, but pending data hasn't been prepared yet, call
520
+ * pgstat_assoc_relation() to do so. See its comment for why this is done
521
+ * separately from pgstat_init_relation().
1378
522
  */
1379
- static inline void
1380
- pgstat_report_wait_end(void)
1381
- {
1382
- volatile PGPROC *proc = MyProc;
1383
-
1384
- if (!pgstat_track_activities || !proc)
1385
- return;
1386
-
1387
- /*
1388
- * Since this is a four-byte field which is always read and written as
1389
- * four-bytes, updates are atomic.
1390
- */
1391
- proc->wait_event_info = 0;
1392
- }
523
+ #define pgstat_should_count_relation(rel) \
524
+ (likely((rel)->pgstat_info != NULL) ? true : \
525
+ ((rel)->pgstat_enabled ? pgstat_assoc_relation(rel), true : false))
1393
526
 
1394
527
  /* nontransactional event counts are simple enough to inline */
1395
528
 
1396
529
  #define pgstat_count_heap_scan(rel) \
1397
530
  do { \
1398
- if ((rel)->pgstat_info != NULL) \
531
+ if (pgstat_should_count_relation(rel)) \
1399
532
  (rel)->pgstat_info->t_counts.t_numscans++; \
1400
533
  } while (0)
1401
534
  #define pgstat_count_heap_getnext(rel) \
1402
535
  do { \
1403
- if ((rel)->pgstat_info != NULL) \
536
+ if (pgstat_should_count_relation(rel)) \
1404
537
  (rel)->pgstat_info->t_counts.t_tuples_returned++; \
1405
538
  } while (0)
1406
539
  #define pgstat_count_heap_fetch(rel) \
1407
540
  do { \
1408
- if ((rel)->pgstat_info != NULL) \
541
+ if (pgstat_should_count_relation(rel)) \
1409
542
  (rel)->pgstat_info->t_counts.t_tuples_fetched++; \
1410
543
  } while (0)
1411
544
  #define pgstat_count_index_scan(rel) \
1412
545
  do { \
1413
- if ((rel)->pgstat_info != NULL) \
546
+ if (pgstat_should_count_relation(rel)) \
1414
547
  (rel)->pgstat_info->t_counts.t_numscans++; \
1415
548
  } while (0)
1416
549
  #define pgstat_count_index_tuples(rel, n) \
1417
550
  do { \
1418
- if ((rel)->pgstat_info != NULL) \
551
+ if (pgstat_should_count_relation(rel)) \
1419
552
  (rel)->pgstat_info->t_counts.t_tuples_returned += (n); \
1420
553
  } while (0)
1421
554
  #define pgstat_count_buffer_read(rel) \
1422
555
  do { \
1423
- if ((rel)->pgstat_info != NULL) \
556
+ if (pgstat_should_count_relation(rel)) \
1424
557
  (rel)->pgstat_info->t_counts.t_blocks_fetched++; \
1425
558
  } while (0)
1426
559
  #define pgstat_count_buffer_hit(rel) \
1427
560
  do { \
1428
- if ((rel)->pgstat_info != NULL) \
561
+ if (pgstat_should_count_relation(rel)) \
1429
562
  (rel)->pgstat_info->t_counts.t_blocks_hit++; \
1430
563
  } while (0)
1431
- #define pgstat_count_buffer_read_time(n) \
1432
- (pgStatBlockReadTime += (n))
1433
- #define pgstat_count_buffer_write_time(n) \
1434
- (pgStatBlockWriteTime += (n))
1435
564
 
1436
565
  extern void pgstat_count_heap_insert(Relation rel, PgStat_Counter n);
1437
566
  extern void pgstat_count_heap_update(Relation rel, bool hot);
@@ -1439,41 +568,35 @@ extern void pgstat_count_heap_delete(Relation rel);
1439
568
  extern void pgstat_count_truncate(Relation rel);
1440
569
  extern void pgstat_update_heap_dead_tuples(Relation rel, int delta);
1441
570
 
1442
- struct FunctionCallInfoBaseData;
1443
- extern void pgstat_init_function_usage(struct FunctionCallInfoBaseData *fcinfo,
1444
- PgStat_FunctionCallUsage *fcu);
1445
- extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu,
1446
- bool finalize);
1447
-
1448
- extern void AtEOXact_PgStat(bool isCommit, bool parallel);
1449
- extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);
1450
-
1451
- extern void AtPrepare_PgStat(void);
1452
- extern void PostPrepare_PgStat(void);
1453
-
1454
571
  extern void pgstat_twophase_postcommit(TransactionId xid, uint16 info,
1455
572
  void *recdata, uint32 len);
1456
573
  extern void pgstat_twophase_postabort(TransactionId xid, uint16 info,
1457
574
  void *recdata, uint32 len);
1458
575
 
1459
- extern void pgstat_send_archiver(const char *xlog, bool failed);
1460
- extern void pgstat_send_bgwriter(void);
576
+ extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);
577
+ extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry_ext(bool shared,
578
+ Oid relid);
579
+ extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);
1461
580
 
1462
- /* ----------
1463
- * Support functions for the SQL-callable functions to
1464
- * generate the pgstat* views.
1465
- * ----------
581
+
582
+ /*
583
+ * Functions in pgstat_replslot.c
1466
584
  */
1467
- extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid);
1468
- extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);
1469
- extern PgBackendStatus *pgstat_fetch_stat_beentry(int beid);
1470
- extern LocalPgBackendStatus *pgstat_fetch_stat_local_beentry(int beid);
1471
- extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid);
1472
- extern int pgstat_fetch_stat_numbackends(void);
1473
- extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);
1474
- extern PgStat_GlobalStats *pgstat_fetch_global(void);
1475
- extern PgStat_SLRUStats *pgstat_fetch_slru(void);
1476
585
 
586
+ extern void pgstat_reset_replslot(const char *name);
587
+ struct ReplicationSlot;
588
+ extern void pgstat_report_replslot(struct ReplicationSlot *slot, const PgStat_StatReplSlotEntry *repSlotStat);
589
+ extern void pgstat_create_replslot(struct ReplicationSlot *slot);
590
+ extern void pgstat_acquire_replslot(struct ReplicationSlot *slot);
591
+ extern void pgstat_drop_replslot(struct ReplicationSlot *slot);
592
+ extern PgStat_StatReplSlotEntry *pgstat_fetch_replslot(NameData slotname);
593
+
594
+
595
+ /*
596
+ * Functions in pgstat_slru.c
597
+ */
598
+
599
+ extern void pgstat_reset_slru(const char *);
1477
600
  extern void pgstat_count_slru_page_zeroed(int slru_idx);
1478
601
  extern void pgstat_count_slru_page_hit(int slru_idx);
1479
602
  extern void pgstat_count_slru_page_read(int slru_idx);
@@ -1481,7 +604,96 @@ extern void pgstat_count_slru_page_written(int slru_idx);
1481
604
  extern void pgstat_count_slru_page_exists(int slru_idx);
1482
605
  extern void pgstat_count_slru_flush(int slru_idx);
1483
606
  extern void pgstat_count_slru_truncate(int slru_idx);
1484
- extern const char *pgstat_slru_name(int slru_idx);
1485
- extern int pgstat_slru_index(const char *name);
607
+ extern const char *pgstat_get_slru_name(int slru_idx);
608
+ extern int pgstat_get_slru_index(const char *name);
609
+ extern PgStat_SLRUStats *pgstat_fetch_slru(void);
610
+
611
+
612
+ /*
613
+ * Functions in pgstat_subscription.c
614
+ */
615
+
616
+ extern void pgstat_report_subscription_error(Oid subid, bool is_apply_error);
617
+ extern void pgstat_create_subscription(Oid subid);
618
+ extern void pgstat_drop_subscription(Oid subid);
619
+ extern PgStat_StatSubEntry *pgstat_fetch_stat_subscription(Oid subid);
620
+
621
+
622
+ /*
623
+ * Functions in pgstat_xact.c
624
+ */
625
+
626
+ extern void AtEOXact_PgStat(bool isCommit, bool parallel);
627
+ extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);
628
+ extern void AtPrepare_PgStat(void);
629
+ extern void PostPrepare_PgStat(void);
630
+ struct xl_xact_stats_item;
631
+ extern int pgstat_get_transactional_drops(bool isCommit, struct xl_xact_stats_item **items);
632
+ extern void pgstat_execute_transactional_drops(int ndrops, struct xl_xact_stats_item *items, bool is_redo);
633
+
634
+
635
+ /*
636
+ * Functions in pgstat_wal.c
637
+ */
638
+
639
+ extern void pgstat_report_wal(bool force);
640
+ extern PgStat_WalStats *pgstat_fetch_stat_wal(void);
641
+
642
+
643
+ /*
644
+ * Variables in pgstat.c
645
+ */
646
+
647
+ /* GUC parameters */
648
+ extern PGDLLIMPORT bool pgstat_track_counts;
649
+ extern PGDLLIMPORT int pgstat_track_functions;
650
+ extern PGDLLIMPORT int pgstat_fetch_consistency;
651
+
652
+
653
+ /*
654
+ * Variables in pgstat_bgwriter.c
655
+ */
656
+
657
+ /* updated directly by bgwriter and bufmgr */
658
+ extern PGDLLIMPORT PgStat_BgWriterStats PendingBgWriterStats;
659
+
660
+
661
+ /*
662
+ * Variables in pgstat_checkpointer.c
663
+ */
664
+
665
+ /*
666
+ * Checkpointer statistics counters are updated directly by checkpointer and
667
+ * bufmgr.
668
+ */
669
+ extern PGDLLIMPORT PgStat_CheckpointerStats PendingCheckpointerStats;
670
+
671
+
672
+ /*
673
+ * Variables in pgstat_database.c
674
+ */
675
+
676
+ /* Updated by pgstat_count_buffer_*_time macros */
677
+ extern PGDLLIMPORT PgStat_Counter pgStatBlockReadTime;
678
+ extern PGDLLIMPORT PgStat_Counter pgStatBlockWriteTime;
679
+
680
+ /*
681
+ * Updated by pgstat_count_conn_*_time macros, called by
682
+ * pgstat_report_activity().
683
+ */
684
+ extern PGDLLIMPORT PgStat_Counter pgStatActiveTime;
685
+ extern PGDLLIMPORT PgStat_Counter pgStatTransactionIdleTime;
686
+
687
+ /* updated by the traffic cop and in errfinish() */
688
+ extern PGDLLIMPORT __thread SessionEndType pgStatSessionEndCause;
689
+
690
+
691
+ /*
692
+ * Variables in pgstat_wal.c
693
+ */
694
+
695
+ /* updated directly by backends and background processes */
696
+ extern PGDLLIMPORT PgStat_WalStats PendingWalStats;
697
+
1486
698
 
1487
699
  #endif /* PGSTAT_H */