pg_query 2.0.3 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +165 -0
  3. data/README.md +67 -29
  4. data/Rakefile +8 -23
  5. data/ext/pg_query/extconf.rb +21 -3
  6. data/ext/pg_query/include/pg_query.h +29 -4
  7. data/ext/pg_query/include/pg_query_enum_defs.c +551 -272
  8. data/ext/pg_query/include/pg_query_fingerprint_conds.c +563 -470
  9. data/ext/pg_query/include/pg_query_fingerprint_defs.c +5403 -3945
  10. data/ext/pg_query/include/pg_query_outfuncs_conds.c +402 -330
  11. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1319 -1059
  12. data/ext/pg_query/include/pg_query_readfuncs_conds.c +141 -118
  13. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1685 -1379
  14. data/ext/pg_query/include/{access → postgres/access}/amapi.h +47 -1
  15. data/ext/pg_query/include/{access → postgres/access}/attmap.h +5 -3
  16. data/ext/pg_query/include/{access → postgres/access}/attnum.h +2 -2
  17. data/ext/pg_query/include/{access → postgres/access}/clog.h +4 -2
  18. data/ext/pg_query/include/{access → postgres/access}/commit_ts.h +6 -9
  19. data/ext/pg_query/include/{access → postgres/access}/detoast.h +1 -11
  20. data/ext/pg_query/include/{access → postgres/access}/genam.h +21 -16
  21. data/ext/pg_query/include/{access → postgres/access}/gin.h +17 -4
  22. data/ext/pg_query/include/{access → postgres/access}/htup.h +1 -1
  23. data/ext/pg_query/include/{access → postgres/access}/htup_details.h +80 -88
  24. data/ext/pg_query/include/{access → postgres/access}/itup.h +61 -52
  25. data/ext/pg_query/include/{access → postgres/access}/parallel.h +2 -2
  26. data/ext/pg_query/include/{access → postgres/access}/printtup.h +1 -1
  27. data/ext/pg_query/include/{access → postgres/access}/relation.h +1 -1
  28. data/ext/pg_query/include/{access → postgres/access}/relscan.h +17 -2
  29. data/ext/pg_query/include/postgres/access/rmgr.h +62 -0
  30. data/ext/pg_query/include/{access → postgres/access}/rmgrlist.h +24 -24
  31. data/ext/pg_query/include/{access → postgres/access}/sdir.h +12 -3
  32. data/ext/pg_query/include/{access → postgres/access}/skey.h +1 -1
  33. data/ext/pg_query/include/{access → postgres/access}/stratnum.h +4 -2
  34. data/ext/pg_query/include/{access → postgres/access}/sysattr.h +1 -1
  35. data/ext/pg_query/include/{access → postgres/access}/table.h +2 -1
  36. data/ext/pg_query/include/{access → postgres/access}/tableam.h +337 -62
  37. data/ext/pg_query/include/postgres/access/toast_compression.h +73 -0
  38. data/ext/pg_query/include/{access → postgres/access}/transam.h +123 -13
  39. data/ext/pg_query/include/postgres/access/tsmapi.h +82 -0
  40. data/ext/pg_query/include/{access → postgres/access}/tupconvert.h +5 -2
  41. data/ext/pg_query/include/{access → postgres/access}/tupdesc.h +2 -2
  42. data/ext/pg_query/include/{access → postgres/access}/tupmacs.h +60 -100
  43. data/ext/pg_query/include/{access → postgres/access}/twophase.h +5 -1
  44. data/ext/pg_query/include/{access → postgres/access}/xact.h +99 -32
  45. data/ext/pg_query/include/{access → postgres/access}/xlog.h +69 -165
  46. data/ext/pg_query/include/{access → postgres/access}/xlog_internal.h +147 -73
  47. data/ext/pg_query/include/postgres/access/xlogbackup.h +41 -0
  48. data/ext/pg_query/include/{access → postgres/access}/xlogdefs.h +13 -40
  49. data/ext/pg_query/include/postgres/access/xlogprefetcher.h +55 -0
  50. data/ext/pg_query/include/{access → postgres/access}/xlogreader.h +154 -37
  51. data/ext/pg_query/include/{access → postgres/access}/xlogrecord.h +34 -13
  52. data/ext/pg_query/include/postgres/access/xlogrecovery.h +158 -0
  53. data/ext/pg_query/include/postgres/archive/archive_module.h +59 -0
  54. data/ext/pg_query/include/{c.h → postgres/c.h} +245 -188
  55. data/ext/pg_query/include/{catalog → postgres/catalog}/catalog.h +6 -3
  56. data/ext/pg_query/include/{catalog → postgres/catalog}/catversion.h +6 -2
  57. data/ext/pg_query/include/{catalog → postgres/catalog}/dependency.h +14 -19
  58. data/ext/pg_query/include/postgres/catalog/genbki.h +143 -0
  59. data/ext/pg_query/include/{catalog → postgres/catalog}/index.h +20 -5
  60. data/ext/pg_query/include/postgres/catalog/indexing.h +54 -0
  61. data/ext/pg_query/include/{catalog → postgres/catalog}/namespace.h +5 -3
  62. data/ext/pg_query/include/{catalog → postgres/catalog}/objectaccess.h +73 -3
  63. data/ext/pg_query/include/{catalog → postgres/catalog}/objectaddress.h +12 -7
  64. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate.h +14 -10
  65. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_aggregate_d.h +2 -1
  66. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am.h +4 -1
  67. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_am_d.h +3 -1
  68. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute.h +45 -26
  69. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_attribute_d.h +19 -16
  70. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid.h +7 -2
  71. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_authid_d.h +19 -9
  72. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class.h +45 -15
  73. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_class_d.h +31 -2
  74. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation.h +35 -8
  75. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_collation_d.h +21 -3
  76. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint.h +39 -13
  77. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_constraint_d.h +10 -4
  78. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_control.h +13 -5
  79. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion.h +8 -5
  80. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_conversion_d.h +4 -1
  81. data/ext/pg_query/include/postgres/catalog/pg_database.h +124 -0
  82. data/ext/pg_query/include/postgres/catalog/pg_database_d.h +52 -0
  83. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend.h +11 -7
  84. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_depend_d.h +3 -1
  85. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger.h +9 -3
  86. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_event_trigger_d.h +3 -1
  87. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index.h +17 -7
  88. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_index_d.h +20 -17
  89. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language.h +10 -5
  90. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_language_d.h +3 -1
  91. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace.h +7 -2
  92. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_namespace_d.h +3 -1
  93. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass.h +8 -5
  94. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opclass_d.h +3 -1
  95. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator.h +21 -16
  96. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_operator_d.h +37 -1
  97. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily.h +8 -4
  98. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_opfamily_d.h +6 -2
  99. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table.h +20 -9
  100. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_partitioned_table_d.h +2 -1
  101. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc.h +20 -11
  102. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_proc_d.h +10 -8
  103. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication.h +49 -6
  104. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_publication_d.h +3 -1
  105. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin.h +6 -1
  106. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_replication_origin_d.h +5 -1
  107. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic.h +19 -12
  108. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_d.h +2 -1
  109. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext.h +19 -5
  110. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_statistic_ext_d.h +7 -2
  111. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform.h +8 -5
  112. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_transform_d.h +3 -1
  113. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger.h +24 -8
  114. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_trigger_d.h +4 -1
  115. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config.h +6 -3
  116. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_config_d.h +3 -1
  117. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict.h +8 -3
  118. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_dict_d.h +3 -1
  119. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser.h +6 -3
  120. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_parser_d.h +3 -1
  121. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template.h +6 -3
  122. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_ts_template_d.h +3 -1
  123. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type.h +56 -24
  124. data/ext/pg_query/include/{catalog → postgres/catalog}/pg_type_d.h +70 -31
  125. data/ext/pg_query/include/{catalog → postgres/catalog}/storage.h +9 -7
  126. data/ext/pg_query/include/{commands → postgres/commands}/async.h +4 -5
  127. data/ext/pg_query/include/{commands → postgres/commands}/dbcommands.h +3 -1
  128. data/ext/pg_query/include/{commands → postgres/commands}/defrem.h +12 -24
  129. data/ext/pg_query/include/{commands → postgres/commands}/event_trigger.h +2 -2
  130. data/ext/pg_query/include/{commands → postgres/commands}/explain.h +3 -1
  131. data/ext/pg_query/include/{commands → postgres/commands}/prepare.h +1 -1
  132. data/ext/pg_query/include/{commands → postgres/commands}/tablespace.h +6 -4
  133. data/ext/pg_query/include/{commands → postgres/commands}/trigger.h +36 -25
  134. data/ext/pg_query/include/{commands → postgres/commands}/user.h +10 -4
  135. data/ext/pg_query/include/{commands → postgres/commands}/vacuum.h +140 -47
  136. data/ext/pg_query/include/postgres/common/cryptohash.h +39 -0
  137. data/ext/pg_query/include/{common → postgres/common}/file_perm.h +4 -4
  138. data/ext/pg_query/include/{common → postgres/common}/hashfn.h +1 -1
  139. data/ext/pg_query/include/postgres/common/int.h +437 -0
  140. data/ext/pg_query/include/{common → postgres/common}/keywords.h +2 -6
  141. data/ext/pg_query/include/{common → postgres/common}/kwlookup.h +2 -2
  142. data/ext/pg_query/include/postgres/common/pg_prng.h +61 -0
  143. data/ext/pg_query/include/{common → postgres/common}/relpath.h +21 -14
  144. data/ext/pg_query/include/postgres/common/scram-common.h +70 -0
  145. data/ext/pg_query/include/postgres/common/sha2.h +32 -0
  146. data/ext/pg_query/include/postgres/common/string.h +44 -0
  147. data/ext/pg_query/include/postgres/common/unicode_east_asian_fw_table.h +125 -0
  148. data/ext/pg_query/include/{common/unicode_combining_table.h → postgres/common/unicode_nonspacing_table.h} +138 -8
  149. data/ext/pg_query/include/postgres/copyfuncs.funcs.c +5013 -0
  150. data/ext/pg_query/include/postgres/copyfuncs.switch.c +938 -0
  151. data/ext/pg_query/include/{datatype → postgres/datatype}/timestamp.h +50 -4
  152. data/ext/pg_query/include/postgres/equalfuncs.funcs.c +3097 -0
  153. data/ext/pg_query/include/postgres/equalfuncs.switch.c +785 -0
  154. data/ext/pg_query/include/{executor → postgres/executor}/execdesc.h +1 -1
  155. data/ext/pg_query/include/{executor → postgres/executor}/executor.h +98 -32
  156. data/ext/pg_query/include/{executor → postgres/executor}/functions.h +17 -3
  157. data/ext/pg_query/include/{executor → postgres/executor}/instrument.h +33 -16
  158. data/ext/pg_query/include/{executor → postgres/executor}/spi.h +42 -4
  159. data/ext/pg_query/include/{executor → postgres/executor}/tablefunc.h +1 -1
  160. data/ext/pg_query/include/{executor → postgres/executor}/tuptable.h +18 -11
  161. data/ext/pg_query/include/{fmgr.h → postgres/fmgr.h} +33 -8
  162. data/ext/pg_query/include/postgres/foreign/fdwapi.h +294 -0
  163. data/ext/pg_query/include/{funcapi.h → postgres/funcapi.h} +22 -10
  164. data/ext/pg_query/include/postgres/gram.h +1127 -0
  165. data/ext/pg_query/include/{parser → postgres}/gramparse.h +4 -4
  166. data/ext/pg_query/include/{jit → postgres/jit}/jit.h +12 -12
  167. data/ext/pg_query/include/postgres/kwlist_d.h +1119 -0
  168. data/ext/pg_query/include/postgres/lib/dshash.h +115 -0
  169. data/ext/pg_query/include/{lib → postgres/lib}/ilist.h +454 -22
  170. data/ext/pg_query/include/{lib → postgres/lib}/pairingheap.h +1 -1
  171. data/ext/pg_query/include/{lib → postgres/lib}/simplehash.h +158 -33
  172. data/ext/pg_query/include/postgres/lib/sort_template.h +432 -0
  173. data/ext/pg_query/include/{lib → postgres/lib}/stringinfo.h +3 -3
  174. data/ext/pg_query/include/{libpq → postgres/libpq}/auth.h +12 -4
  175. data/ext/pg_query/include/{libpq → postgres/libpq}/crypt.h +5 -4
  176. data/ext/pg_query/include/{libpq → postgres/libpq}/hba.h +54 -8
  177. data/ext/pg_query/include/{libpq → postgres/libpq}/libpq-be.h +45 -17
  178. data/ext/pg_query/include/{libpq → postgres/libpq}/libpq.h +31 -20
  179. data/ext/pg_query/include/{libpq → postgres/libpq}/pqcomm.h +26 -71
  180. data/ext/pg_query/include/{libpq → postgres/libpq}/pqformat.h +2 -2
  181. data/ext/pg_query/include/{libpq → postgres/libpq}/pqsignal.h +25 -13
  182. data/ext/pg_query/include/postgres/libpq/sasl.h +136 -0
  183. data/ext/pg_query/include/postgres/libpq/scram.h +37 -0
  184. data/ext/pg_query/include/{mb → postgres/mb}/pg_wchar.h +125 -25
  185. data/ext/pg_query/include/{mb → postgres/mb}/stringinfo_mb.h +1 -1
  186. data/ext/pg_query/include/{miscadmin.h → postgres/miscadmin.h} +96 -65
  187. data/ext/pg_query/include/{nodes → postgres/nodes}/bitmapset.h +11 -7
  188. data/ext/pg_query/include/{nodes → postgres/nodes}/execnodes.h +351 -103
  189. data/ext/pg_query/include/{nodes → postgres/nodes}/extensible.h +8 -4
  190. data/ext/pg_query/include/{nodes → postgres/nodes}/lockoptions.h +1 -1
  191. data/ext/pg_query/include/{nodes → postgres/nodes}/makefuncs.h +19 -6
  192. data/ext/pg_query/include/{nodes → postgres/nodes}/memnodes.h +11 -6
  193. data/ext/pg_query/include/postgres/nodes/miscnodes.h +56 -0
  194. data/ext/pg_query/include/{nodes → postgres/nodes}/nodeFuncs.h +89 -29
  195. data/ext/pg_query/include/{nodes → postgres/nodes}/nodes.h +100 -496
  196. data/ext/pg_query/include/postgres/nodes/nodetags.h +471 -0
  197. data/ext/pg_query/include/{nodes → postgres/nodes}/params.h +3 -3
  198. data/ext/pg_query/include/{nodes → postgres/nodes}/parsenodes.h +678 -207
  199. data/ext/pg_query/include/{nodes → postgres/nodes}/pathnodes.h +1282 -454
  200. data/ext/pg_query/include/{nodes → postgres/nodes}/pg_list.h +103 -73
  201. data/ext/pg_query/include/{nodes → postgres/nodes}/plannodes.h +474 -133
  202. data/ext/pg_query/include/{nodes → postgres/nodes}/primnodes.h +754 -254
  203. data/ext/pg_query/include/{nodes → postgres/nodes}/print.h +1 -1
  204. data/ext/pg_query/include/postgres/nodes/queryjumble.h +86 -0
  205. data/ext/pg_query/include/postgres/nodes/replnodes.h +111 -0
  206. data/ext/pg_query/include/postgres/nodes/supportnodes.h +346 -0
  207. data/ext/pg_query/include/{nodes → postgres/nodes}/tidbitmap.h +1 -1
  208. data/ext/pg_query/include/postgres/nodes/value.h +90 -0
  209. data/ext/pg_query/include/{optimizer → postgres/optimizer}/cost.h +14 -5
  210. data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo.h +9 -7
  211. data/ext/pg_query/include/{optimizer → postgres/optimizer}/geqo_gene.h +1 -1
  212. data/ext/pg_query/include/{optimizer → postgres/optimizer}/optimizer.h +31 -28
  213. data/ext/pg_query/include/{optimizer → postgres/optimizer}/paths.h +29 -12
  214. data/ext/pg_query/include/{optimizer → postgres/optimizer}/planmain.h +15 -17
  215. data/ext/pg_query/include/{parser → postgres/parser}/analyze.h +20 -5
  216. data/ext/pg_query/include/postgres/parser/kwlist.h +498 -0
  217. data/ext/pg_query/include/{parser → postgres/parser}/parse_agg.h +5 -8
  218. data/ext/pg_query/include/{parser → postgres/parser}/parse_coerce.h +6 -1
  219. data/ext/pg_query/include/{parser → postgres/parser}/parse_expr.h +2 -3
  220. data/ext/pg_query/include/{parser → postgres/parser}/parse_func.h +2 -1
  221. data/ext/pg_query/include/{parser → postgres/parser}/parse_node.h +41 -11
  222. data/ext/pg_query/include/{parser → postgres/parser}/parse_oper.h +3 -5
  223. data/ext/pg_query/include/{parser → postgres/parser}/parse_relation.h +11 -5
  224. data/ext/pg_query/include/{parser → postgres/parser}/parse_type.h +4 -3
  225. data/ext/pg_query/include/postgres/parser/parser.h +68 -0
  226. data/ext/pg_query/include/{parser → postgres/parser}/parsetree.h +1 -1
  227. data/ext/pg_query/include/{parser → postgres/parser}/scanner.h +2 -2
  228. data/ext/pg_query/include/{parser → postgres/parser}/scansup.h +2 -5
  229. data/ext/pg_query/include/{partitioning → postgres/partitioning}/partdefs.h +1 -1
  230. data/ext/pg_query/include/{pg_config.h → postgres/pg_config.h} +216 -228
  231. data/ext/pg_query/include/{pg_config_manual.h → postgres/pg_config_manual.h} +80 -58
  232. data/ext/pg_query/include/postgres/pg_config_os.h +8 -0
  233. data/ext/pg_query/include/{pg_getopt.h → postgres/pg_getopt.h} +6 -6
  234. data/ext/pg_query/include/{pg_trace.h → postgres/pg_trace.h} +1 -1
  235. data/ext/pg_query/include/postgres/pgstat.h +778 -0
  236. data/ext/pg_query/include/{pgtime.h → postgres/pgtime.h} +16 -6
  237. data/ext/pg_query/include/{pl_gram.h → postgres/pl_gram.h} +116 -116
  238. data/ext/pg_query/include/{pl_reserved_kwlist.h → postgres/pl_reserved_kwlist.h} +1 -1
  239. data/ext/pg_query/include/{pl_reserved_kwlist_d.h → postgres/pl_reserved_kwlist_d.h} +10 -10
  240. data/ext/pg_query/include/{pl_unreserved_kwlist.h → postgres/pl_unreserved_kwlist.h} +3 -3
  241. data/ext/pg_query/include/{pl_unreserved_kwlist_d.h → postgres/pl_unreserved_kwlist_d.h} +60 -60
  242. data/ext/pg_query/include/{plerrcodes.h → postgres/plerrcodes.h} +9 -1
  243. data/ext/pg_query/include/{plpgsql.h → postgres/plpgsql.h} +79 -86
  244. data/ext/pg_query/include/{port → postgres/port}/atomics/arch-arm.h +9 -3
  245. data/ext/pg_query/include/postgres/port/atomics/arch-hppa.h +17 -0
  246. data/ext/pg_query/include/{port → postgres/port}/atomics/arch-ppc.h +21 -21
  247. data/ext/pg_query/include/{port → postgres/port}/atomics/arch-x86.h +2 -2
  248. data/ext/pg_query/include/{port → postgres/port}/atomics/fallback.h +3 -3
  249. data/ext/pg_query/include/{port → postgres/port}/atomics/generic-gcc.h +3 -3
  250. data/ext/pg_query/include/postgres/port/atomics/generic-msvc.h +101 -0
  251. data/ext/pg_query/include/postgres/port/atomics/generic-sunpro.h +106 -0
  252. data/ext/pg_query/include/{port → postgres/port}/atomics/generic.h +1 -1
  253. data/ext/pg_query/include/{port → postgres/port}/atomics.h +2 -7
  254. data/ext/pg_query/include/{port → postgres/port}/pg_bitutils.h +129 -16
  255. data/ext/pg_query/include/{port → postgres/port}/pg_bswap.h +1 -1
  256. data/ext/pg_query/include/{port → postgres/port}/pg_crc32c.h +1 -1
  257. data/ext/pg_query/include/postgres/port/simd.h +375 -0
  258. data/ext/pg_query/include/postgres/port/win32/arpa/inet.h +3 -0
  259. data/ext/pg_query/include/postgres/port/win32/dlfcn.h +1 -0
  260. data/ext/pg_query/include/postgres/port/win32/grp.h +1 -0
  261. data/ext/pg_query/include/postgres/port/win32/netdb.h +7 -0
  262. data/ext/pg_query/include/postgres/port/win32/netinet/in.h +3 -0
  263. data/ext/pg_query/include/postgres/port/win32/netinet/tcp.h +7 -0
  264. data/ext/pg_query/include/postgres/port/win32/pwd.h +3 -0
  265. data/ext/pg_query/include/postgres/port/win32/sys/resource.h +20 -0
  266. data/ext/pg_query/include/postgres/port/win32/sys/select.h +3 -0
  267. data/ext/pg_query/include/postgres/port/win32/sys/socket.h +26 -0
  268. data/ext/pg_query/include/postgres/port/win32/sys/un.h +17 -0
  269. data/ext/pg_query/include/postgres/port/win32/sys/wait.h +3 -0
  270. data/ext/pg_query/include/postgres/port/win32.h +59 -0
  271. data/ext/pg_query/include/postgres/port/win32_msvc/dirent.h +34 -0
  272. data/ext/pg_query/include/postgres/port/win32_msvc/sys/file.h +1 -0
  273. data/ext/pg_query/include/postgres/port/win32_msvc/sys/param.h +1 -0
  274. data/ext/pg_query/include/postgres/port/win32_msvc/sys/time.h +1 -0
  275. data/ext/pg_query/include/postgres/port/win32_msvc/unistd.h +9 -0
  276. data/ext/pg_query/include/postgres/port/win32_msvc/utime.h +3 -0
  277. data/ext/pg_query/include/postgres/port/win32_port.h +594 -0
  278. data/ext/pg_query/include/{port.h → postgres/port.h} +107 -111
  279. data/ext/pg_query/include/postgres/portability/instr_time.h +197 -0
  280. data/ext/pg_query/include/postgres/postgres.h +579 -0
  281. data/ext/pg_query/include/{postgres_ext.h → postgres/postgres_ext.h} +0 -1
  282. data/ext/pg_query/include/{postmaster → postgres/postmaster}/autovacuum.h +17 -20
  283. data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker.h +3 -2
  284. data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgworker_internals.h +2 -2
  285. data/ext/pg_query/include/{postmaster → postgres/postmaster}/bgwriter.h +6 -6
  286. data/ext/pg_query/include/{postmaster → postgres/postmaster}/interrupt.h +1 -1
  287. data/ext/pg_query/include/{postmaster → postgres/postmaster}/pgarch.h +7 -10
  288. data/ext/pg_query/include/{postmaster → postgres/postmaster}/postmaster.h +21 -17
  289. data/ext/pg_query/include/postgres/postmaster/startup.h +41 -0
  290. data/ext/pg_query/include/{postmaster → postgres/postmaster}/syslogger.h +16 -11
  291. data/ext/pg_query/include/{postmaster → postgres/postmaster}/walwriter.h +5 -3
  292. data/ext/pg_query/include/{regex → postgres/regex}/regex.h +27 -22
  293. data/ext/pg_query/include/{replication → postgres/replication}/logicallauncher.h +8 -5
  294. data/ext/pg_query/include/postgres/replication/logicalproto.h +274 -0
  295. data/ext/pg_query/include/postgres/replication/logicalworker.h +32 -0
  296. data/ext/pg_query/include/{replication → postgres/replication}/origin.h +8 -8
  297. data/ext/pg_query/include/postgres/replication/reorderbuffer.h +753 -0
  298. data/ext/pg_query/include/{replication → postgres/replication}/slot.h +42 -12
  299. data/ext/pg_query/include/{replication → postgres/replication}/syncrep.h +6 -12
  300. data/ext/pg_query/include/{replication → postgres/replication}/walreceiver.h +158 -20
  301. data/ext/pg_query/include/{replication → postgres/replication}/walsender.h +20 -20
  302. data/ext/pg_query/include/{rewrite → postgres/rewrite}/prs2lock.h +1 -1
  303. data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteHandler.h +1 -6
  304. data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteManip.h +11 -2
  305. data/ext/pg_query/include/{rewrite → postgres/rewrite}/rewriteSupport.h +1 -1
  306. data/ext/pg_query/include/{storage → postgres/storage}/backendid.h +3 -3
  307. data/ext/pg_query/include/{storage → postgres/storage}/block.h +24 -37
  308. data/ext/pg_query/include/{storage → postgres/storage}/buf.h +1 -1
  309. data/ext/pg_query/include/{storage → postgres/storage}/bufmgr.h +196 -95
  310. data/ext/pg_query/include/{storage → postgres/storage}/bufpage.h +152 -101
  311. data/ext/pg_query/include/{storage → postgres/storage}/condition_variable.h +14 -3
  312. data/ext/pg_query/include/{storage → postgres/storage}/dsm.h +6 -6
  313. data/ext/pg_query/include/{storage → postgres/storage}/dsm_impl.h +6 -2
  314. data/ext/pg_query/include/{storage → postgres/storage}/fd.h +48 -14
  315. data/ext/pg_query/include/postgres/storage/fileset.h +40 -0
  316. data/ext/pg_query/include/{storage → postgres/storage}/ipc.h +5 -2
  317. data/ext/pg_query/include/{storage → postgres/storage}/item.h +1 -1
  318. data/ext/pg_query/include/{storage → postgres/storage}/itemid.h +1 -1
  319. data/ext/pg_query/include/{storage → postgres/storage}/itemptr.h +96 -57
  320. data/ext/pg_query/include/{storage → postgres/storage}/large_object.h +2 -2
  321. data/ext/pg_query/include/{storage → postgres/storage}/latch.h +17 -13
  322. data/ext/pg_query/include/{storage → postgres/storage}/lmgr.h +7 -1
  323. data/ext/pg_query/include/{storage → postgres/storage}/lock.h +37 -25
  324. data/ext/pg_query/include/{storage → postgres/storage}/lockdefs.h +4 -4
  325. data/ext/pg_query/include/{storage → postgres/storage}/lwlock.h +21 -33
  326. data/ext/pg_query/include/{storage → postgres/storage}/lwlocknames.h +0 -1
  327. data/ext/pg_query/include/{storage → postgres/storage}/off.h +1 -1
  328. data/ext/pg_query/include/{storage → postgres/storage}/pg_sema.h +1 -1
  329. data/ext/pg_query/include/{storage → postgres/storage}/pg_shmem.h +9 -7
  330. data/ext/pg_query/include/{storage → postgres/storage}/pmsignal.h +15 -4
  331. data/ext/pg_query/include/{storage → postgres/storage}/predicate.h +5 -5
  332. data/ext/pg_query/include/{storage → postgres/storage}/proc.h +200 -67
  333. data/ext/pg_query/include/postgres/storage/procarray.h +99 -0
  334. data/ext/pg_query/include/{storage → postgres/storage}/proclist_types.h +1 -1
  335. data/ext/pg_query/include/{storage → postgres/storage}/procsignal.h +5 -7
  336. data/ext/pg_query/include/postgres/storage/relfilelocator.h +99 -0
  337. data/ext/pg_query/include/{storage → postgres/storage}/s_lock.h +118 -298
  338. data/ext/pg_query/include/{storage → postgres/storage}/sharedfileset.h +3 -11
  339. data/ext/pg_query/include/{storage → postgres/storage}/shm_mq.h +5 -4
  340. data/ext/pg_query/include/{storage → postgres/storage}/shm_toc.h +1 -1
  341. data/ext/pg_query/include/{storage → postgres/storage}/shmem.h +1 -23
  342. data/ext/pg_query/include/{storage → postgres/storage}/sinval.h +5 -5
  343. data/ext/pg_query/include/{storage → postgres/storage}/sinvaladt.h +4 -2
  344. data/ext/pg_query/include/{storage → postgres/storage}/smgr.h +21 -17
  345. data/ext/pg_query/include/{storage → postgres/storage}/spin.h +2 -2
  346. data/ext/pg_query/include/{storage → postgres/storage}/standby.h +17 -9
  347. data/ext/pg_query/include/{storage → postgres/storage}/standbydefs.h +2 -2
  348. data/ext/pg_query/include/{storage → postgres/storage}/sync.h +9 -5
  349. data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtag.h +7 -2
  350. data/ext/pg_query/include/{tcop → postgres/tcop}/cmdtaglist.h +3 -2
  351. data/ext/pg_query/include/{tcop → postgres/tcop}/deparse_utility.h +1 -1
  352. data/ext/pg_query/include/{tcop → postgres/tcop}/dest.h +1 -3
  353. data/ext/pg_query/include/{tcop → postgres/tcop}/fastpath.h +1 -2
  354. data/ext/pg_query/include/{tcop → postgres/tcop}/pquery.h +7 -1
  355. data/ext/pg_query/include/{tcop → postgres/tcop}/tcopprot.h +19 -14
  356. data/ext/pg_query/include/{tcop → postgres/tcop}/utility.h +7 -3
  357. data/ext/pg_query/include/{tsearch → postgres/tsearch}/ts_cache.h +3 -5
  358. data/ext/pg_query/include/{utils → postgres/utils}/acl.h +37 -71
  359. data/ext/pg_query/include/{utils → postgres/utils}/aclchk_internal.h +1 -1
  360. data/ext/pg_query/include/{utils → postgres/utils}/array.h +26 -2
  361. data/ext/pg_query/include/postgres/utils/backend_progress.h +45 -0
  362. data/ext/pg_query/include/postgres/utils/backend_status.h +342 -0
  363. data/ext/pg_query/include/{utils → postgres/utils}/builtins.h +20 -11
  364. data/ext/pg_query/include/{utils → postgres/utils}/bytea.h +3 -2
  365. data/ext/pg_query/include/{utils → postgres/utils}/catcache.h +1 -1
  366. data/ext/pg_query/include/{utils → postgres/utils}/date.h +37 -9
  367. data/ext/pg_query/include/{utils → postgres/utils}/datetime.h +48 -27
  368. data/ext/pg_query/include/{utils → postgres/utils}/datum.h +9 -1
  369. data/ext/pg_query/include/{utils → postgres/utils}/dsa.h +5 -1
  370. data/ext/pg_query/include/{utils → postgres/utils}/elog.h +154 -48
  371. data/ext/pg_query/include/{utils → postgres/utils}/errcodes.h +2 -0
  372. data/ext/pg_query/include/{utils → postgres/utils}/expandeddatum.h +14 -3
  373. data/ext/pg_query/include/{utils → postgres/utils}/expandedrecord.h +14 -4
  374. data/ext/pg_query/include/{utils → postgres/utils}/float.h +13 -12
  375. data/ext/pg_query/include/{utils → postgres/utils}/fmgroids.h +1353 -696
  376. data/ext/pg_query/include/{utils → postgres/utils}/fmgrprotos.h +243 -18
  377. data/ext/pg_query/include/{utils → postgres/utils}/fmgrtab.h +6 -5
  378. data/ext/pg_query/include/{utils → postgres/utils}/guc.h +120 -121
  379. data/ext/pg_query/include/postgres/utils/guc_hooks.h +163 -0
  380. data/ext/pg_query/include/{utils → postgres/utils}/guc_tables.h +71 -21
  381. data/ext/pg_query/include/{utils → postgres/utils}/hsearch.h +15 -11
  382. data/ext/pg_query/include/{utils → postgres/utils}/inval.h +7 -3
  383. data/ext/pg_query/include/postgres/utils/logtape.h +77 -0
  384. data/ext/pg_query/include/{utils → postgres/utils}/lsyscache.h +16 -1
  385. data/ext/pg_query/include/{utils → postgres/utils}/memdebug.h +1 -1
  386. data/ext/pg_query/include/{utils → postgres/utils}/memutils.h +14 -53
  387. data/ext/pg_query/include/postgres/utils/memutils_internal.h +136 -0
  388. data/ext/pg_query/include/postgres/utils/memutils_memorychunk.h +237 -0
  389. data/ext/pg_query/include/{utils → postgres/utils}/numeric.h +38 -9
  390. data/ext/pg_query/include/{utils → postgres/utils}/palloc.h +33 -4
  391. data/ext/pg_query/include/{utils → postgres/utils}/partcache.h +3 -2
  392. data/ext/pg_query/include/{utils → postgres/utils}/pg_locale.h +37 -21
  393. data/ext/pg_query/include/postgres/utils/pgstat_internal.h +814 -0
  394. data/ext/pg_query/include/{utils → postgres/utils}/plancache.h +6 -5
  395. data/ext/pg_query/include/{utils → postgres/utils}/portal.h +12 -1
  396. data/ext/pg_query/include/{utils → postgres/utils}/probes.h +59 -59
  397. data/ext/pg_query/include/postgres/utils/ps_status.h +47 -0
  398. data/ext/pg_query/include/{utils → postgres/utils}/queryenvironment.h +1 -1
  399. data/ext/pg_query/include/postgres/utils/regproc.h +39 -0
  400. data/ext/pg_query/include/{utils → postgres/utils}/rel.h +129 -61
  401. data/ext/pg_query/include/{utils → postgres/utils}/relcache.h +21 -14
  402. data/ext/pg_query/include/{utils → postgres/utils}/reltrigger.h +1 -1
  403. data/ext/pg_query/include/{utils → postgres/utils}/resowner.h +1 -1
  404. data/ext/pg_query/include/{utils → postgres/utils}/ruleutils.h +9 -1
  405. data/ext/pg_query/include/{utils → postgres/utils}/sharedtuplestore.h +1 -1
  406. data/ext/pg_query/include/{utils → postgres/utils}/snapmgr.h +38 -15
  407. data/ext/pg_query/include/{utils → postgres/utils}/snapshot.h +14 -1
  408. data/ext/pg_query/include/{utils → postgres/utils}/sortsupport.h +117 -2
  409. data/ext/pg_query/include/{utils → postgres/utils}/syscache.h +9 -1
  410. data/ext/pg_query/include/{utils → postgres/utils}/timeout.h +11 -4
  411. data/ext/pg_query/include/{utils → postgres/utils}/timestamp.h +46 -15
  412. data/ext/pg_query/include/{utils → postgres/utils}/tuplesort.h +209 -41
  413. data/ext/pg_query/include/{utils → postgres/utils}/tuplestore.h +2 -2
  414. data/ext/pg_query/include/{utils → postgres/utils}/typcache.h +24 -17
  415. data/ext/pg_query/include/{utils → postgres/utils}/varlena.h +17 -3
  416. data/ext/pg_query/include/postgres/utils/wait_event.h +294 -0
  417. data/ext/pg_query/include/{utils → postgres/utils}/xml.h +18 -8
  418. data/ext/pg_query/include/{postgres.h → postgres/varatt.h} +65 -471
  419. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +7494 -6382
  420. data/ext/pg_query/include/protobuf/pg_query.pb.h +116922 -84792
  421. data/ext/pg_query/include/protobuf-c/protobuf-c.h +7 -3
  422. data/ext/pg_query/include/protobuf-c.h +7 -3
  423. data/ext/pg_query/pg_query.c +10 -1
  424. data/ext/pg_query/pg_query.pb-c.c +21026 -17002
  425. data/ext/pg_query/pg_query_deparse.c +1 -9896
  426. data/ext/pg_query/pg_query_fingerprint.c +162 -50
  427. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  428. data/ext/pg_query/pg_query_internal.h +1 -1
  429. data/ext/pg_query/pg_query_json_plpgsql.c +56 -12
  430. data/ext/pg_query/pg_query_normalize.c +259 -64
  431. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  432. data/ext/pg_query/pg_query_outfuncs_json.c +71 -16
  433. data/ext/pg_query/pg_query_outfuncs_protobuf.c +73 -12
  434. data/ext/pg_query/pg_query_parse.c +47 -5
  435. data/ext/pg_query/pg_query_parse_plpgsql.c +86 -21
  436. data/ext/pg_query/pg_query_readfuncs_protobuf.c +43 -8
  437. data/ext/pg_query/pg_query_ruby.c +6 -1
  438. data/ext/pg_query/pg_query_ruby_freebsd.sym +2 -0
  439. data/ext/pg_query/pg_query_scan.c +3 -2
  440. data/ext/pg_query/pg_query_split.c +6 -5
  441. data/ext/pg_query/postgres_deparse.c +11067 -0
  442. data/ext/pg_query/postgres_deparse.h +9 -0
  443. data/ext/pg_query/protobuf-c.c +34 -27
  444. data/ext/pg_query/src_backend_catalog_namespace.c +27 -10
  445. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  446. data/ext/pg_query/src_backend_commands_define.c +11 -1
  447. data/ext/pg_query/src_backend_nodes_bitmapset.c +13 -70
  448. data/ext/pg_query/src_backend_nodes_copyfuncs.c +103 -5894
  449. data/ext/pg_query/src_backend_nodes_equalfuncs.c +102 -3830
  450. data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
  451. data/ext/pg_query/src_backend_nodes_list.c +99 -12
  452. data/ext/pg_query/src_backend_nodes_makefuncs.c +99 -4
  453. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +325 -131
  454. data/ext/pg_query/src_backend_nodes_nodes.c +38 -0
  455. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  456. data/ext/pg_query/src_backend_parser_gram.c +36104 -32074
  457. data/ext/pg_query/src_backend_parser_parser.c +53 -8
  458. data/ext/pg_query/src_backend_parser_scan.c +4893 -3701
  459. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  460. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  461. data/ext/pg_query/src_backend_tcop_postgres.c +133 -105
  462. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  463. data/ext/pg_query/src_backend_utils_adt_datum.c +17 -7
  464. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  465. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  466. data/ext/pg_query/src_backend_utils_adt_numutils.c +489 -0
  467. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +187 -19
  468. data/ext/pg_query/src_backend_utils_error_assert.c +17 -18
  469. data/ext/pg_query/src_backend_utils_error_elog.c +513 -318
  470. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +44 -17
  471. data/ext/pg_query/src_backend_utils_init_globals.c +9 -6
  472. data/ext/pg_query/src_backend_utils_mb_mbutils.c +74 -131
  473. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +492 -0
  474. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +163 -0
  475. data/ext/pg_query/src_backend_utils_mmgr_aset.c +453 -314
  476. data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
  477. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +549 -76
  478. data/ext/pg_query/src_backend_utils_mmgr_slab.c +1021 -0
  479. data/ext/pg_query/src_common_encnames.c +4 -1
  480. data/ext/pg_query/src_common_hashfn.c +420 -0
  481. data/ext/pg_query/src_common_keywords.c +15 -2
  482. data/ext/pg_query/src_common_kwlist_d.h +545 -498
  483. data/ext/pg_query/src_common_kwlookup.c +1 -1
  484. data/ext/pg_query/src_common_psprintf.c +1 -1
  485. data/ext/pg_query/src_common_stringinfo.c +4 -4
  486. data/ext/pg_query/src_common_wchar.c +717 -113
  487. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  488. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -18
  489. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1136 -1195
  490. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  491. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  492. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  493. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +60 -60
  494. data/ext/pg_query/src_port_pg_bitutils.c +103 -40
  495. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  496. data/ext/pg_query/src_port_qsort.c +12 -224
  497. data/ext/pg_query/src_port_snprintf.c +51 -29
  498. data/ext/pg_query/src_port_strerror.c +9 -19
  499. data/ext/pg_query/src_port_strlcpy.c +79 -0
  500. data/lib/pg_query/deparse.rb +7 -1
  501. data/lib/pg_query/filter_columns.rb +7 -5
  502. data/lib/pg_query/fingerprint.rb +21 -9
  503. data/lib/pg_query/node.rb +18 -13
  504. data/lib/pg_query/param_refs.rb +1 -1
  505. data/lib/pg_query/parse.rb +141 -50
  506. data/lib/pg_query/pg_query_pb.rb +175 -3031
  507. data/lib/pg_query/treewalker.rb +26 -2
  508. data/lib/pg_query/truncate.rb +54 -8
  509. data/lib/pg_query/version.rb +1 -1
  510. data/lib/pg_query.rb +0 -1
  511. metadata +443 -380
  512. data/ext/pg_query/guc-file.c +0 -0
  513. data/ext/pg_query/include/access/rmgr.h +0 -35
  514. data/ext/pg_query/include/access/xloginsert.h +0 -64
  515. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  516. data/ext/pg_query/include/catalog/genbki.h +0 -64
  517. data/ext/pg_query/include/catalog/indexing.h +0 -366
  518. data/ext/pg_query/include/commands/variable.h +0 -38
  519. data/ext/pg_query/include/common/ip.h +0 -37
  520. data/ext/pg_query/include/common/string.h +0 -19
  521. data/ext/pg_query/include/getaddrinfo.h +0 -162
  522. data/ext/pg_query/include/kwlist_d.h +0 -1072
  523. data/ext/pg_query/include/nodes/value.h +0 -61
  524. data/ext/pg_query/include/parser/gram.h +0 -1067
  525. data/ext/pg_query/include/parser/kwlist.h +0 -477
  526. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  527. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  528. data/ext/pg_query/include/parser/parse_target.h +0 -46
  529. data/ext/pg_query/include/parser/parser.h +0 -41
  530. data/ext/pg_query/include/pg_config_os.h +0 -8
  531. data/ext/pg_query/include/pgstat.h +0 -1487
  532. data/ext/pg_query/include/portability/instr_time.h +0 -256
  533. data/ext/pg_query/include/postmaster/fork_process.h +0 -17
  534. data/ext/pg_query/include/replication/logicalproto.h +0 -110
  535. data/ext/pg_query/include/replication/logicalworker.h +0 -19
  536. data/ext/pg_query/include/replication/reorderbuffer.h +0 -467
  537. data/ext/pg_query/include/storage/relfilenode.h +0 -99
  538. data/ext/pg_query/include/utils/dynahash.h +0 -19
  539. data/ext/pg_query/include/utils/pg_lsn.h +0 -29
  540. data/ext/pg_query/include/utils/pidfile.h +0 -56
  541. data/ext/pg_query/include/utils/ps_status.h +0 -25
  542. data/ext/pg_query/include/utils/regproc.h +0 -28
  543. data/ext/pg_query/include/utils/rls.h +0 -50
  544. data/ext/pg_query/include/utils/tzparser.h +0 -39
  545. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  546. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  547. data/ext/pg_query/src_backend_postmaster_postmaster.c +0 -2230
  548. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -370
  549. data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1086
  550. data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1831
  551. data/ext/pg_query/src_common_string.c +0 -86
  552. data/ext/pg_query/src_port_erand48.c +0 -127
  553. data/ext/pg_query/src_port_pgsleep.c +0 -69
  554. data/ext/pg_query/src_port_random.c +0 -31
  555. data/ext/pg_query/src_port_strnlen.c +0 -39
  556. data/lib/pg_query/json_field_names.rb +0 -1402
  557. /data/ext/pg_query/include/{pg_config_ext.h → postgres/pg_config_ext.h} +0 -0
@@ -10,10 +10,21 @@
10
10
  * - MemoryContextCallResetCallbacks
11
11
  * - MemoryContextResetOnly
12
12
  * - repalloc
13
+ * - GetMemoryChunkContext
13
14
  * - MemoryContextStats
14
15
  * - MemoryContextStatsDetail
15
16
  * - MemoryContextStatsInternal
16
17
  * - MemoryContextStatsPrint
18
+ * - mcxt_methods
19
+ * - GetMemoryChunkSpace
20
+ * - MemoryContextAllocAligned
21
+ * - MemoryContextAllocExtended
22
+ * - BogusFree
23
+ * - GetMemoryChunkHeader
24
+ * - BogusRealloc
25
+ * - BogusGetChunkContext
26
+ * - BogusGetChunkSpace
27
+ * - GetMemoryChunkMethodID
17
28
  * - pfree
18
29
  * - pstrdup
19
30
  * - MemoryContextStrdup
@@ -28,6 +39,7 @@
28
39
  * - CurrentMemoryContext
29
40
  * - MemoryContextDelete
30
41
  * - palloc0
42
+ * - MemoryContextAllocExtended
31
43
  *--------------------------------------------------------------------
32
44
  */
33
45
 
@@ -42,7 +54,7 @@
42
54
  * context's MemoryContextMethods struct.
43
55
  *
44
56
  *
45
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
57
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
46
58
  * Portions Copyright (c) 1994, Regents of the University of California
47
59
  *
48
60
  *
@@ -56,14 +68,111 @@
56
68
 
57
69
  #include "mb/pg_wchar.h"
58
70
  #include "miscadmin.h"
71
+ #include "storage/proc.h"
72
+ #include "storage/procarray.h"
73
+ #include "storage/procsignal.h"
74
+ #include "utils/fmgrprotos.h"
59
75
  #include "utils/memdebug.h"
60
76
  #include "utils/memutils.h"
77
+ #include "utils/memutils_internal.h"
78
+ #include "utils/memutils_memorychunk.h"
61
79
 
62
80
 
81
+ static void BogusFree(void *pointer);
82
+ static void *BogusRealloc(void *pointer, Size size);
83
+ static MemoryContext BogusGetChunkContext(void *pointer);
84
+ static Size BogusGetChunkSpace(void *pointer);
85
+
63
86
  /*****************************************************************************
64
87
  * GLOBAL MEMORY *
65
88
  *****************************************************************************/
66
89
 
90
+ static const MemoryContextMethods mcxt_methods[] = {
91
+ /* aset.c */
92
+ [MCTX_ASET_ID].alloc = AllocSetAlloc,
93
+ [MCTX_ASET_ID].free_p = AllocSetFree,
94
+ [MCTX_ASET_ID].realloc = AllocSetRealloc,
95
+ [MCTX_ASET_ID].reset = AllocSetReset,
96
+ [MCTX_ASET_ID].delete_context = AllocSetDelete,
97
+ [MCTX_ASET_ID].get_chunk_context = AllocSetGetChunkContext,
98
+ [MCTX_ASET_ID].get_chunk_space = AllocSetGetChunkSpace,
99
+ [MCTX_ASET_ID].is_empty = AllocSetIsEmpty,
100
+ [MCTX_ASET_ID].stats = AllocSetStats,
101
+ #ifdef MEMORY_CONTEXT_CHECKING
102
+ [MCTX_ASET_ID].check = AllocSetCheck,
103
+ #endif
104
+
105
+ /* generation.c */
106
+ [MCTX_GENERATION_ID].alloc = GenerationAlloc,
107
+ [MCTX_GENERATION_ID].free_p = GenerationFree,
108
+ [MCTX_GENERATION_ID].realloc = GenerationRealloc,
109
+ [MCTX_GENERATION_ID].reset = GenerationReset,
110
+ [MCTX_GENERATION_ID].delete_context = GenerationDelete,
111
+ [MCTX_GENERATION_ID].get_chunk_context = GenerationGetChunkContext,
112
+ [MCTX_GENERATION_ID].get_chunk_space = GenerationGetChunkSpace,
113
+ [MCTX_GENERATION_ID].is_empty = GenerationIsEmpty,
114
+ [MCTX_GENERATION_ID].stats = GenerationStats,
115
+ #ifdef MEMORY_CONTEXT_CHECKING
116
+ [MCTX_GENERATION_ID].check = GenerationCheck,
117
+ #endif
118
+
119
+ /* slab.c */
120
+ [MCTX_SLAB_ID].alloc = SlabAlloc,
121
+ [MCTX_SLAB_ID].free_p = SlabFree,
122
+ [MCTX_SLAB_ID].realloc = SlabRealloc,
123
+ [MCTX_SLAB_ID].reset = SlabReset,
124
+ [MCTX_SLAB_ID].delete_context = SlabDelete,
125
+ [MCTX_SLAB_ID].get_chunk_context = SlabGetChunkContext,
126
+ [MCTX_SLAB_ID].get_chunk_space = SlabGetChunkSpace,
127
+ [MCTX_SLAB_ID].is_empty = SlabIsEmpty,
128
+ [MCTX_SLAB_ID].stats = SlabStats,
129
+ #ifdef MEMORY_CONTEXT_CHECKING
130
+ [MCTX_SLAB_ID].check = SlabCheck,
131
+ #endif
132
+
133
+ /* alignedalloc.c */
134
+ [MCTX_ALIGNED_REDIRECT_ID].alloc = NULL, /* not required */
135
+ [MCTX_ALIGNED_REDIRECT_ID].free_p = AlignedAllocFree,
136
+ [MCTX_ALIGNED_REDIRECT_ID].realloc = AlignedAllocRealloc,
137
+ [MCTX_ALIGNED_REDIRECT_ID].reset = NULL, /* not required */
138
+ [MCTX_ALIGNED_REDIRECT_ID].delete_context = NULL, /* not required */
139
+ [MCTX_ALIGNED_REDIRECT_ID].get_chunk_context = AlignedAllocGetChunkContext,
140
+ [MCTX_ALIGNED_REDIRECT_ID].get_chunk_space = AlignedAllocGetChunkSpace,
141
+ [MCTX_ALIGNED_REDIRECT_ID].is_empty = NULL, /* not required */
142
+ [MCTX_ALIGNED_REDIRECT_ID].stats = NULL, /* not required */
143
+ #ifdef MEMORY_CONTEXT_CHECKING
144
+ [MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */
145
+ #endif
146
+
147
+
148
+ /*
149
+ * Unused (as yet) IDs should have dummy entries here. This allows us to
150
+ * fail cleanly if a bogus pointer is passed to pfree or the like. It
151
+ * seems sufficient to provide routines for the methods that might get
152
+ * invoked from inspection of a chunk (see MCXT_METHOD calls below).
153
+ */
154
+
155
+ [MCTX_UNUSED1_ID].free_p = BogusFree,
156
+ [MCTX_UNUSED1_ID].realloc = BogusRealloc,
157
+ [MCTX_UNUSED1_ID].get_chunk_context = BogusGetChunkContext,
158
+ [MCTX_UNUSED1_ID].get_chunk_space = BogusGetChunkSpace,
159
+
160
+ [MCTX_UNUSED2_ID].free_p = BogusFree,
161
+ [MCTX_UNUSED2_ID].realloc = BogusRealloc,
162
+ [MCTX_UNUSED2_ID].get_chunk_context = BogusGetChunkContext,
163
+ [MCTX_UNUSED2_ID].get_chunk_space = BogusGetChunkSpace,
164
+
165
+ [MCTX_UNUSED3_ID].free_p = BogusFree,
166
+ [MCTX_UNUSED3_ID].realloc = BogusRealloc,
167
+ [MCTX_UNUSED3_ID].get_chunk_context = BogusGetChunkContext,
168
+ [MCTX_UNUSED3_ID].get_chunk_space = BogusGetChunkSpace,
169
+
170
+ [MCTX_UNUSED4_ID].free_p = BogusFree,
171
+ [MCTX_UNUSED4_ID].realloc = BogusRealloc,
172
+ [MCTX_UNUSED4_ID].get_chunk_context = BogusGetChunkContext,
173
+ [MCTX_UNUSED4_ID].get_chunk_space = BogusGetChunkSpace,
174
+ };
175
+
67
176
  /*
68
177
  * CurrentMemoryContext
69
178
  * Default memory context for allocations.
@@ -91,9 +200,11 @@ __thread MemoryContext ErrorContext = NULL;
91
200
  static void MemoryContextCallResetCallbacks(MemoryContext context);
92
201
  static void MemoryContextStatsInternal(MemoryContext context, int level,
93
202
  bool print, int max_children,
94
- MemoryContextCounters *totals);
203
+ MemoryContextCounters *totals,
204
+ bool print_to_stderr);
95
205
  static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
96
- const char *stats_string);
206
+ const char *stats_string,
207
+ bool print_to_stderr);
97
208
 
98
209
  /*
99
210
  * You should not do memory allocations within a critical section, because
@@ -103,6 +214,101 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
103
214
  #define AssertNotInCriticalSection(context) \
104
215
  Assert(CritSectionCount == 0 || (context)->allowInCritSection)
105
216
 
217
+ /*
218
+ * Call the given function in the MemoryContextMethods for the memory context
219
+ * type that 'pointer' belongs to.
220
+ */
221
+ #define MCXT_METHOD(pointer, method) \
222
+ mcxt_methods[GetMemoryChunkMethodID(pointer)].method
223
+
224
+ /*
225
+ * GetMemoryChunkMethodID
226
+ * Return the MemoryContextMethodID from the uint64 chunk header which
227
+ * directly precedes 'pointer'.
228
+ */
229
+ static inline MemoryContextMethodID
230
+ GetMemoryChunkMethodID(const void *pointer)
231
+ {
232
+ uint64 header;
233
+
234
+ /*
235
+ * Try to detect bogus pointers handed to us, poorly though we can.
236
+ * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an
237
+ * allocated chunk.
238
+ */
239
+ Assert(pointer == (const void *) MAXALIGN(pointer));
240
+
241
+ /* Allow access to the uint64 header */
242
+ VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
243
+
244
+ header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
245
+
246
+ /* Disallow access to the uint64 header */
247
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
248
+
249
+ return (MemoryContextMethodID) (header & MEMORY_CONTEXT_METHODID_MASK);
250
+ }
251
+
252
+ /*
253
+ * GetMemoryChunkHeader
254
+ * Return the uint64 chunk header which directly precedes 'pointer'.
255
+ *
256
+ * This is only used after GetMemoryChunkMethodID, so no need for error checks.
257
+ */
258
+ static inline uint64
259
+ GetMemoryChunkHeader(const void *pointer)
260
+ {
261
+ uint64 header;
262
+
263
+ /* Allow access to the uint64 header */
264
+ VALGRIND_MAKE_MEM_DEFINED((char *) pointer - sizeof(uint64), sizeof(uint64));
265
+
266
+ header = *((const uint64 *) ((const char *) pointer - sizeof(uint64)));
267
+
268
+ /* Disallow access to the uint64 header */
269
+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer - sizeof(uint64), sizeof(uint64));
270
+
271
+ return header;
272
+ }
273
+
274
+ /*
275
+ * Support routines to trap use of invalid memory context method IDs
276
+ * (from calling pfree or the like on a bogus pointer). As a possible
277
+ * aid in debugging, we report the header word along with the pointer
278
+ * address (if we got here, there must be an accessible header word).
279
+ */
280
+ static void
281
+ BogusFree(void *pointer)
282
+ {
283
+ elog(ERROR, "pfree called with invalid pointer %p (header 0x%016llx)",
284
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
285
+ }
286
+
287
+ static void *
288
+ BogusRealloc(void *pointer, Size size)
289
+ {
290
+ elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)",
291
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
292
+ return NULL; /* keep compiler quiet */
293
+ }
294
+
295
+ static MemoryContext
296
+ BogusGetChunkContext(void *pointer)
297
+ {
298
+ elog(ERROR, "GetMemoryChunkContext called with invalid pointer %p (header 0x%016llx)",
299
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
300
+ return NULL; /* keep compiler quiet */
301
+ }
302
+
303
+ static Size
304
+ BogusGetChunkSpace(void *pointer)
305
+ {
306
+ elog(ERROR, "GetMemoryChunkSpace called with invalid pointer %p (header 0x%016llx)",
307
+ pointer, (unsigned long long) GetMemoryChunkHeader(pointer));
308
+ return 0; /* keep compiler quiet */
309
+ }
310
+
311
+
106
312
  /*****************************************************************************
107
313
  * EXPORTED ROUTINES *
108
314
  *****************************************************************************/
@@ -127,7 +333,7 @@ static void MemoryContextStatsPrint(MemoryContext context, void *passthru,
127
333
  void
128
334
  MemoryContextInit(void)
129
335
  {
130
- AssertState(TopMemoryContext == NULL);
336
+ Assert(TopMemoryContext == NULL);
131
337
 
132
338
  /*
133
339
  * First, initialize TopMemoryContext, which is the parent of all others.
@@ -171,7 +377,7 @@ MemoryContextInit(void)
171
377
  void
172
378
  MemoryContextReset(MemoryContext context)
173
379
  {
174
- AssertArg(MemoryContextIsValid(context));
380
+ Assert(MemoryContextIsValid(context));
175
381
 
176
382
  /* save a function call in common case where there are no children */
177
383
  if (context->firstchild != NULL)
@@ -190,7 +396,7 @@ MemoryContextReset(MemoryContext context)
190
396
  void
191
397
  MemoryContextResetOnly(MemoryContext context)
192
398
  {
193
- AssertArg(MemoryContextIsValid(context));
399
+ Assert(MemoryContextIsValid(context));
194
400
 
195
401
  /* Nothing to do if no pallocs since startup or last reset */
196
402
  if (!context->isReset)
@@ -201,10 +407,8 @@ MemoryContextResetOnly(MemoryContext context)
201
407
  * If context->ident points into the context's memory, it will become
202
408
  * a dangling pointer. We could prevent that by setting it to NULL
203
409
  * here, but that would break valid coding patterns that keep the
204
- * ident elsewhere, e.g. in a parent context. Another idea is to use
205
- * MemoryContextContains(), but we don't require ident strings to be
206
- * in separately-palloc'd chunks, so that risks false positives. So
207
- * for now we assume the programmer got it right.
410
+ * ident elsewhere, e.g. in a parent context. So for now we assume
411
+ * the programmer got it right.
208
412
  */
209
413
 
210
414
  context->methods->reset(context);
@@ -234,7 +438,7 @@ MemoryContextResetOnly(MemoryContext context)
234
438
  void
235
439
  MemoryContextDelete(MemoryContext context)
236
440
  {
237
- AssertArg(MemoryContextIsValid(context));
441
+ Assert(MemoryContextIsValid(context));
238
442
  /* We had better not be deleting TopMemoryContext ... */
239
443
  Assert(context != TopMemoryContext);
240
444
  /* And not CurrentMemoryContext, either */
@@ -279,7 +483,7 @@ MemoryContextDelete(MemoryContext context)
279
483
  void
280
484
  MemoryContextDeleteChildren(MemoryContext context)
281
485
  {
282
- AssertArg(MemoryContextIsValid(context));
486
+ Assert(MemoryContextIsValid(context));
283
487
 
284
488
  /*
285
489
  * MemoryContextDelete will delink the child from me, so just iterate as
@@ -361,8 +565,8 @@ MemoryContextCallResetCallbacks(MemoryContext context)
361
565
  void
362
566
  MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
363
567
  {
364
- AssertArg(MemoryContextIsValid(context));
365
- AssertArg(context != new_parent);
568
+ Assert(MemoryContextIsValid(context));
569
+ Assert(context != new_parent);
366
570
 
367
571
  /* Fast path if it's got correct parent already */
368
572
  if (new_parent == context->parent)
@@ -388,7 +592,7 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
388
592
  /* And relink */
389
593
  if (new_parent)
390
594
  {
391
- AssertArg(MemoryContextIsValid(new_parent));
595
+ Assert(MemoryContextIsValid(new_parent));
392
596
  context->parent = new_parent;
393
597
  context->prevchild = NULL;
394
598
  context->nextchild = new_parent->firstchild;
@@ -418,11 +622,22 @@ MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)
418
622
  void
419
623
  MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
420
624
  {
421
- AssertArg(MemoryContextIsValid(context));
625
+ Assert(MemoryContextIsValid(context));
422
626
 
423
627
  context->allowInCritSection = allow;
424
628
  }
425
629
 
630
+ /*
631
+ * GetMemoryChunkContext
632
+ * Given a currently-allocated chunk, determine the MemoryContext that
633
+ * the chunk belongs to.
634
+ */
635
+ MemoryContext
636
+ GetMemoryChunkContext(void *pointer)
637
+ {
638
+ return MCXT_METHOD(pointer, get_chunk_context) (pointer);
639
+ }
640
+
426
641
  /*
427
642
  * GetMemoryChunkSpace
428
643
  * Given a currently-allocated chunk, determine the total space
@@ -431,7 +646,11 @@ MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)
431
646
  * This is useful for measuring the total space occupied by a set of
432
647
  * allocated chunks.
433
648
  */
434
-
649
+ Size
650
+ GetMemoryChunkSpace(void *pointer)
651
+ {
652
+ return MCXT_METHOD(pointer, get_chunk_space) (pointer);
653
+ }
435
654
 
436
655
  /*
437
656
  * MemoryContextGetParent
@@ -463,28 +682,52 @@ void
463
682
  MemoryContextStats(MemoryContext context)
464
683
  {
465
684
  /* A hard-wired limit on the number of children is usually good enough */
466
- MemoryContextStatsDetail(context, 100);
685
+ MemoryContextStatsDetail(context, 100, true);
467
686
  }
468
687
 
469
688
  /*
470
689
  * MemoryContextStatsDetail
471
690
  *
472
691
  * Entry point for use if you want to vary the number of child contexts shown.
692
+ *
693
+ * If print_to_stderr is true, print statistics about the memory contexts
694
+ * with fprintf(stderr), otherwise use ereport().
473
695
  */
474
696
  void
475
- MemoryContextStatsDetail(MemoryContext context, int max_children)
697
+ MemoryContextStatsDetail(MemoryContext context, int max_children,
698
+ bool print_to_stderr)
476
699
  {
477
700
  MemoryContextCounters grand_totals;
478
701
 
479
702
  memset(&grand_totals, 0, sizeof(grand_totals));
480
703
 
481
- MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals);
704
+ MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr);
482
705
 
483
- fprintf(stderr,
484
- "Grand total: %zu bytes in %zd blocks; %zu free (%zd chunks); %zu used\n",
485
- grand_totals.totalspace, grand_totals.nblocks,
486
- grand_totals.freespace, grand_totals.freechunks,
487
- grand_totals.totalspace - grand_totals.freespace);
706
+ if (print_to_stderr)
707
+ fprintf(stderr,
708
+ "Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used\n",
709
+ grand_totals.totalspace, grand_totals.nblocks,
710
+ grand_totals.freespace, grand_totals.freechunks,
711
+ grand_totals.totalspace - grand_totals.freespace);
712
+ else
713
+
714
+ /*
715
+ * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent
716
+ * to the connected client.
717
+ *
718
+ * We don't buffer the information about all memory contexts in a
719
+ * backend into StringInfo and log it as one message. That would
720
+ * require the buffer to be enlarged, risking an OOM as there could be
721
+ * a large number of memory contexts in a backend. Instead, we log
722
+ * one message per memory context.
723
+ */
724
+ ereport(LOG_SERVER_ONLY,
725
+ (errhidestmt(true),
726
+ errhidecontext(true),
727
+ errmsg_internal("Grand total: %zu bytes in %zu blocks; %zu free (%zu chunks); %zu used",
728
+ grand_totals.totalspace, grand_totals.nblocks,
729
+ grand_totals.freespace, grand_totals.freechunks,
730
+ grand_totals.totalspace - grand_totals.freespace)));
488
731
  }
489
732
 
490
733
  /*
@@ -497,19 +740,20 @@ MemoryContextStatsDetail(MemoryContext context, int max_children)
497
740
  static void
498
741
  MemoryContextStatsInternal(MemoryContext context, int level,
499
742
  bool print, int max_children,
500
- MemoryContextCounters *totals)
743
+ MemoryContextCounters *totals,
744
+ bool print_to_stderr)
501
745
  {
502
746
  MemoryContextCounters local_totals;
503
747
  MemoryContext child;
504
748
  int ichild;
505
749
 
506
- AssertArg(MemoryContextIsValid(context));
750
+ Assert(MemoryContextIsValid(context));
507
751
 
508
752
  /* Examine the context itself */
509
753
  context->methods->stats(context,
510
754
  print ? MemoryContextStatsPrint : NULL,
511
755
  (void *) &level,
512
- totals);
756
+ totals, print_to_stderr);
513
757
 
514
758
  /*
515
759
  * Examine children. If there are more than max_children of them, we do
@@ -524,11 +768,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
524
768
  if (ichild < max_children)
525
769
  MemoryContextStatsInternal(child, level + 1,
526
770
  print, max_children,
527
- totals);
771
+ totals,
772
+ print_to_stderr);
528
773
  else
529
774
  MemoryContextStatsInternal(child, level + 1,
530
775
  false, max_children,
531
- &local_totals);
776
+ &local_totals,
777
+ print_to_stderr);
532
778
  }
533
779
 
534
780
  /* Deal with excess children */
@@ -536,18 +782,33 @@ MemoryContextStatsInternal(MemoryContext context, int level,
536
782
  {
537
783
  if (print)
538
784
  {
539
- int i;
540
-
541
- for (i = 0; i <= level; i++)
542
- fprintf(stderr, " ");
543
- fprintf(stderr,
544
- "%d more child contexts containing %zu total in %zd blocks; %zu free (%zd chunks); %zu used\n",
545
- ichild - max_children,
546
- local_totals.totalspace,
547
- local_totals.nblocks,
548
- local_totals.freespace,
549
- local_totals.freechunks,
550
- local_totals.totalspace - local_totals.freespace);
785
+ if (print_to_stderr)
786
+ {
787
+ int i;
788
+
789
+ for (i = 0; i <= level; i++)
790
+ fprintf(stderr, " ");
791
+ fprintf(stderr,
792
+ "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n",
793
+ ichild - max_children,
794
+ local_totals.totalspace,
795
+ local_totals.nblocks,
796
+ local_totals.freespace,
797
+ local_totals.freechunks,
798
+ local_totals.totalspace - local_totals.freespace);
799
+ }
800
+ else
801
+ ereport(LOG_SERVER_ONLY,
802
+ (errhidestmt(true),
803
+ errhidecontext(true),
804
+ errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used",
805
+ level,
806
+ ichild - max_children,
807
+ local_totals.totalspace,
808
+ local_totals.nblocks,
809
+ local_totals.freespace,
810
+ local_totals.freechunks,
811
+ local_totals.totalspace - local_totals.freespace)));
551
812
  }
552
813
 
553
814
  if (totals)
@@ -569,11 +830,13 @@ MemoryContextStatsInternal(MemoryContext context, int level,
569
830
  */
570
831
  static void
571
832
  MemoryContextStatsPrint(MemoryContext context, void *passthru,
572
- const char *stats_string)
833
+ const char *stats_string,
834
+ bool print_to_stderr)
573
835
  {
574
836
  int level = *(int *) passthru;
575
837
  const char *name = context->name;
576
838
  const char *ident = context->ident;
839
+ char truncated_ident[110];
577
840
  int i;
578
841
 
579
842
  /*
@@ -587,9 +850,8 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
587
850
  ident = NULL;
588
851
  }
589
852
 
590
- for (i = 0; i < level; i++)
591
- fprintf(stderr, " ");
592
- fprintf(stderr, "%s: %s", name, stats_string);
853
+ truncated_ident[0] = '\0';
854
+
593
855
  if (ident)
594
856
  {
595
857
  /*
@@ -601,24 +863,41 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
601
863
  int idlen = strlen(ident);
602
864
  bool truncated = false;
603
865
 
866
+ strcpy(truncated_ident, ": ");
867
+ i = strlen(truncated_ident);
868
+
604
869
  if (idlen > 100)
605
870
  {
606
871
  idlen = pg_mbcliplen(ident, idlen, 100);
607
872
  truncated = true;
608
873
  }
609
- fprintf(stderr, ": ");
874
+
610
875
  while (idlen-- > 0)
611
876
  {
612
877
  unsigned char c = *ident++;
613
878
 
614
879
  if (c < ' ')
615
880
  c = ' ';
616
- fputc(c, stderr);
881
+ truncated_ident[i++] = c;
617
882
  }
883
+ truncated_ident[i] = '\0';
884
+
618
885
  if (truncated)
619
- fprintf(stderr, "...");
886
+ strcat(truncated_ident, "...");
887
+ }
888
+
889
+ if (print_to_stderr)
890
+ {
891
+ for (i = 0; i < level; i++)
892
+ fprintf(stderr, " ");
893
+ fprintf(stderr, "%s: %s%s\n", name, stats_string, truncated_ident);
620
894
  }
621
- fputc('\n', stderr);
895
+ else
896
+ ereport(LOG_SERVER_ONLY,
897
+ (errhidestmt(true),
898
+ errhidecontext(true),
899
+ errmsg_internal("level: %d; %s: %s%s",
900
+ level, name, stats_string, truncated_ident)));
622
901
  }
623
902
 
624
903
  /*
@@ -631,19 +910,6 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
631
910
 
632
911
  #endif
633
912
 
634
- /*
635
- * MemoryContextContains
636
- * Detect whether an allocated chunk of memory belongs to a given
637
- * context or not.
638
- *
639
- * Caution: this test is reliable as long as 'pointer' does point to
640
- * a chunk of memory allocated from *some* context. If 'pointer' points
641
- * at memory obtained in some other way, there is a small chance of a
642
- * false-positive result, since the bits right before it might look like
643
- * a valid chunk header by chance.
644
- */
645
-
646
-
647
913
  /*
648
914
  * MemoryContextCreate
649
915
  * Context-type-independent part of context creation.
@@ -669,7 +935,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
669
935
  *
670
936
  * node: the as-yet-uninitialized common part of the context header node.
671
937
  * tag: NodeTag code identifying the memory context type.
672
- * methods: context-type-specific methods (usually statically allocated).
938
+ * method_id: MemoryContextMethodID of the context-type being created.
673
939
  * parent: parent context, or NULL if this will be a top-level context.
674
940
  * name: name of context (must be statically allocated).
675
941
  *
@@ -679,7 +945,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru,
679
945
  void
680
946
  MemoryContextCreate(MemoryContext node,
681
947
  NodeTag tag,
682
- const MemoryContextMethods *methods,
948
+ MemoryContextMethodID method_id,
683
949
  MemoryContext parent,
684
950
  const char *name)
685
951
  {
@@ -689,7 +955,7 @@ MemoryContextCreate(MemoryContext node,
689
955
  /* Initialize all standard fields of memory context header */
690
956
  node->type = tag;
691
957
  node->isReset = true;
692
- node->methods = methods;
958
+ node->methods = &mcxt_methods[method_id];
693
959
  node->parent = parent;
694
960
  node->firstchild = NULL;
695
961
  node->mem_allocated = 0;
@@ -729,7 +995,7 @@ MemoryContextAlloc(MemoryContext context, Size size)
729
995
  {
730
996
  void *ret;
731
997
 
732
- AssertArg(MemoryContextIsValid(context));
998
+ Assert(MemoryContextIsValid(context));
733
999
  AssertNotInCriticalSection(context);
734
1000
 
735
1001
  if (!AllocSizeIsValid(size))
@@ -772,7 +1038,7 @@ MemoryContextAllocZero(MemoryContext context, Size size)
772
1038
  {
773
1039
  void *ret;
774
1040
 
775
- AssertArg(MemoryContextIsValid(context));
1041
+ Assert(MemoryContextIsValid(context));
776
1042
  AssertNotInCriticalSection(context);
777
1043
 
778
1044
  if (!AllocSizeIsValid(size))
@@ -810,7 +1076,7 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
810
1076
  {
811
1077
  void *ret;
812
1078
 
813
- AssertArg(MemoryContextIsValid(context));
1079
+ Assert(MemoryContextIsValid(context));
814
1080
  AssertNotInCriticalSection(context);
815
1081
 
816
1082
  if (!AllocSizeIsValid(size))
@@ -840,6 +1106,62 @@ MemoryContextAllocZeroAligned(MemoryContext context, Size size)
840
1106
  * MemoryContextAllocExtended
841
1107
  * Allocate space within the specified context using the given flags.
842
1108
  */
1109
+ void *
1110
+ MemoryContextAllocExtended(MemoryContext context, Size size, int flags)
1111
+ {
1112
+ void *ret;
1113
+
1114
+ Assert(MemoryContextIsValid(context));
1115
+ AssertNotInCriticalSection(context);
1116
+
1117
+ if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) :
1118
+ AllocSizeIsValid(size)))
1119
+ elog(ERROR, "invalid memory alloc request size %zu", size);
1120
+
1121
+ context->isReset = false;
1122
+
1123
+ ret = context->methods->alloc(context, size);
1124
+ if (unlikely(ret == NULL))
1125
+ {
1126
+ if ((flags & MCXT_ALLOC_NO_OOM) == 0)
1127
+ {
1128
+ MemoryContextStats(TopMemoryContext);
1129
+ ereport(ERROR,
1130
+ (errcode(ERRCODE_OUT_OF_MEMORY),
1131
+ errmsg("out of memory"),
1132
+ errdetail("Failed on request of size %zu in memory context \"%s\".",
1133
+ size, context->name)));
1134
+ }
1135
+ return NULL;
1136
+ }
1137
+
1138
+ VALGRIND_MEMPOOL_ALLOC(context, ret, size);
1139
+
1140
+ if ((flags & MCXT_ALLOC_ZERO) != 0)
1141
+ MemSetAligned(ret, 0, size);
1142
+
1143
+ return ret;
1144
+ }
1145
+
1146
+ /*
1147
+ * HandleLogMemoryContextInterrupt
1148
+ * Handle receipt of an interrupt indicating logging of memory
1149
+ * contexts.
1150
+ *
1151
+ * All the actual work is deferred to ProcessLogMemoryContextInterrupt(),
1152
+ * because we cannot safely emit a log message inside the signal handler.
1153
+ */
1154
+
1155
+
1156
+ /*
1157
+ * ProcessLogMemoryContextInterrupt
1158
+ * Perform logging of memory contexts of this backend process.
1159
+ *
1160
+ * Any backend that participates in ProcSignal signaling must arrange
1161
+ * to call this function if we see LogMemoryContextPending set.
1162
+ * It is called from CHECK_FOR_INTERRUPTS(), which is enough because
1163
+ * the target process for logging of memory contexts is a backend.
1164
+ */
843
1165
 
844
1166
 
845
1167
  void *
@@ -849,7 +1171,7 @@ palloc(Size size)
849
1171
  void *ret;
850
1172
  MemoryContext context = CurrentMemoryContext;
851
1173
 
852
- AssertArg(MemoryContextIsValid(context));
1174
+ Assert(MemoryContextIsValid(context));
853
1175
  AssertNotInCriticalSection(context);
854
1176
 
855
1177
  if (!AllocSizeIsValid(size))
@@ -880,7 +1202,7 @@ palloc0(Size size)
880
1202
  void *ret;
881
1203
  MemoryContext context = CurrentMemoryContext;
882
1204
 
883
- AssertArg(MemoryContextIsValid(context));
1205
+ Assert(MemoryContextIsValid(context));
884
1206
  AssertNotInCriticalSection(context);
885
1207
 
886
1208
  if (!AllocSizeIsValid(size))
@@ -908,6 +1230,125 @@ palloc0(Size size)
908
1230
 
909
1231
 
910
1232
 
1233
+ /*
1234
+ * MemoryContextAllocAligned
1235
+ * Allocate 'size' bytes of memory in 'context' aligned to 'alignto'
1236
+ * bytes.
1237
+ *
1238
+ * Currently, we align addresses by requesting additional bytes from the
1239
+ * MemoryContext's standard allocator function and then aligning the returned
1240
+ * address by the required alignment. This means that the given MemoryContext
1241
+ * must support providing us with a chunk of memory that's larger than 'size'.
1242
+ * For allocators such as Slab, that's not going to work, as slab only allows
1243
+ * chunks of the size that's specified when the context is created.
1244
+ *
1245
+ * 'alignto' must be a power of 2.
1246
+ * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1247
+ */
1248
+ void *
1249
+ MemoryContextAllocAligned(MemoryContext context,
1250
+ Size size, Size alignto, int flags)
1251
+ {
1252
+ MemoryChunk *alignedchunk;
1253
+ Size alloc_size;
1254
+ void *unaligned;
1255
+ void *aligned;
1256
+
1257
+ /* wouldn't make much sense to waste that much space */
1258
+ Assert(alignto < (128 * 1024 * 1024));
1259
+
1260
+ /* ensure alignto is a power of 2 */
1261
+ Assert((alignto & (alignto - 1)) == 0);
1262
+
1263
+ /*
1264
+ * If the alignment requirements are less than what we already guarantee
1265
+ * then just use the standard allocation function.
1266
+ */
1267
+ if (unlikely(alignto <= MAXIMUM_ALIGNOF))
1268
+ return MemoryContextAllocExtended(context, size, flags);
1269
+
1270
+ /*
1271
+ * We implement aligned pointers by simply allocating enough memory for
1272
+ * the requested size plus the alignment and an additional "redirection"
1273
+ * MemoryChunk. This additional MemoryChunk is required for operations
1274
+ * such as pfree when used on the pointer returned by this function. We
1275
+ * use this redirection MemoryChunk in order to find the pointer to the
1276
+ * memory that was returned by the MemoryContextAllocExtended call below.
1277
+ * We do that by "borrowing" the block offset field and instead of using
1278
+ * that to find the offset into the owning block, we use it to find the
1279
+ * original allocated address.
1280
+ *
1281
+ * Here we must allocate enough extra memory so that we can still align
1282
+ * the pointer returned by MemoryContextAllocExtended and also have enough
1283
+ * space for the redirection MemoryChunk. Since allocations will already
1284
+ * be at least aligned by MAXIMUM_ALIGNOF, we can subtract that amount
1285
+ * from the allocation size to save a little memory.
1286
+ */
1287
+ alloc_size = size + PallocAlignedExtraBytes(alignto);
1288
+
1289
+ #ifdef MEMORY_CONTEXT_CHECKING
1290
+ /* ensure there's space for a sentinel byte */
1291
+ alloc_size += 1;
1292
+ #endif
1293
+
1294
+ /* perform the actual allocation */
1295
+ unaligned = MemoryContextAllocExtended(context, alloc_size, flags);
1296
+
1297
+ /* set the aligned pointer */
1298
+ aligned = (void *) TYPEALIGN(alignto, (char *) unaligned +
1299
+ sizeof(MemoryChunk));
1300
+
1301
+ alignedchunk = PointerGetMemoryChunk(aligned);
1302
+
1303
+ /*
1304
+ * We set the redirect MemoryChunk so that the block offset calculation is
1305
+ * used to point back to the 'unaligned' allocated chunk. This allows us
1306
+ * to use MemoryChunkGetBlock() to find the unaligned chunk when we need
1307
+ * to perform operations such as pfree() and repalloc().
1308
+ *
1309
+ * We store 'alignto' in the MemoryChunk's 'value' so that we know what
1310
+ * the alignment was set to should we ever be asked to realloc this
1311
+ * pointer.
1312
+ */
1313
+ MemoryChunkSetHdrMask(alignedchunk, unaligned, alignto,
1314
+ MCTX_ALIGNED_REDIRECT_ID);
1315
+
1316
+ /* double check we produced a correctly aligned pointer */
1317
+ Assert((void *) TYPEALIGN(alignto, aligned) == aligned);
1318
+
1319
+ #ifdef MEMORY_CONTEXT_CHECKING
1320
+ alignedchunk->requested_size = size;
1321
+ /* set mark to catch clobber of "unused" space */
1322
+ set_sentinel(aligned, size);
1323
+ #endif
1324
+
1325
+ /* Mark the bytes before the redirection header as noaccess */
1326
+ VALGRIND_MAKE_MEM_NOACCESS(unaligned,
1327
+ (char *) alignedchunk - (char *) unaligned);
1328
+
1329
+ /* Disallow access to the redirection chunk header. */
1330
+ VALGRIND_MAKE_MEM_NOACCESS(alignedchunk, sizeof(MemoryChunk));
1331
+
1332
+ return aligned;
1333
+ }
1334
+
1335
+ /*
1336
+ * palloc_aligned
1337
+ * Allocate 'size' bytes returning a pointer that's aligned to the
1338
+ * 'alignto' boundary.
1339
+ *
1340
+ * Currently, we align addresses by requesting additional bytes from the
1341
+ * MemoryContext's standard allocator function and then aligning the returned
1342
+ * address by the required alignment. This means that the given MemoryContext
1343
+ * must support providing us with a chunk of memory that's larger than 'size'.
1344
+ * For allocators such as Slab, that's not going to work, as slab only allows
1345
+ * chunks of the size that's specified when the context is created.
1346
+ *
1347
+ * 'alignto' must be a power of 2.
1348
+ * 'flags' may be 0 or set the same as MemoryContextAllocExtended().
1349
+ */
1350
+
1351
+
911
1352
  /*
912
1353
  * pfree
913
1354
  * Release an allocated chunk.
@@ -915,10 +1356,17 @@ palloc0(Size size)
915
1356
  void
916
1357
  pfree(void *pointer)
917
1358
  {
1359
+ #ifdef USE_VALGRIND
1360
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
918
1361
  MemoryContext context = GetMemoryChunkContext(pointer);
1362
+ #endif
919
1363
 
920
- context->methods->free_p(context, pointer);
921
- VALGRIND_MEMPOOL_FREE(context, pointer);
1364
+ MCXT_METHOD(pointer, free_p) (pointer);
1365
+
1366
+ #ifdef USE_VALGRIND
1367
+ if (method != MCTX_ALIGNED_REDIRECT_ID)
1368
+ VALGRIND_MEMPOOL_FREE(context, pointer);
1369
+ #endif
922
1370
  }
923
1371
 
924
1372
  /*
@@ -928,7 +1376,12 @@ pfree(void *pointer)
928
1376
  void *
929
1377
  repalloc(void *pointer, Size size)
930
1378
  {
1379
+ #ifdef USE_VALGRIND
1380
+ MemoryContextMethodID method = GetMemoryChunkMethodID(pointer);
1381
+ #endif
1382
+ #if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
931
1383
  MemoryContext context = GetMemoryChunkContext(pointer);
1384
+ #endif
932
1385
  void *ret;
933
1386
 
934
1387
  if (!AllocSizeIsValid(size))
@@ -939,22 +1392,42 @@ repalloc(void *pointer, Size size)
939
1392
  /* isReset must be false already */
940
1393
  Assert(!context->isReset);
941
1394
 
942
- ret = context->methods->realloc(context, pointer, size);
1395
+ ret = MCXT_METHOD(pointer, realloc) (pointer, size);
943
1396
  if (unlikely(ret == NULL))
944
1397
  {
1398
+ MemoryContext cxt = GetMemoryChunkContext(pointer);
1399
+
945
1400
  MemoryContextStats(TopMemoryContext);
946
1401
  ereport(ERROR,
947
1402
  (errcode(ERRCODE_OUT_OF_MEMORY),
948
1403
  errmsg("out of memory"),
949
1404
  errdetail("Failed on request of size %zu in memory context \"%s\".",
950
- size, context->name)));
1405
+ size, cxt->name)));
951
1406
  }
952
1407
 
953
- VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1408
+ #ifdef USE_VALGRIND
1409
+ if (method != MCTX_ALIGNED_REDIRECT_ID)
1410
+ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);
1411
+ #endif
954
1412
 
955
1413
  return ret;
956
1414
  }
957
1415
 
1416
+ /*
1417
+ * repalloc_extended
1418
+ * Adjust the size of a previously allocated chunk,
1419
+ * with HUGE and NO_OOM options.
1420
+ */
1421
+ #if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)
1422
+ #endif
1423
+
1424
+ /*
1425
+ * repalloc0
1426
+ * Adjust the size of a previously allocated chunk and zero out the added
1427
+ * space.
1428
+ */
1429
+
1430
+
958
1431
  /*
959
1432
  * MemoryContextAllocHuge
960
1433
  * Allocate (possibly-expansive) space within the specified context.