pg_query 2.2.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/include/access/amapi.h +45 -1
  6. data/ext/pg_query/include/access/attmap.h +1 -1
  7. data/ext/pg_query/include/access/attnum.h +2 -2
  8. data/ext/pg_query/include/access/clog.h +4 -2
  9. data/ext/pg_query/include/access/commit_ts.h +6 -9
  10. data/ext/pg_query/include/access/detoast.h +1 -11
  11. data/ext/pg_query/include/access/genam.h +15 -12
  12. data/ext/pg_query/include/access/gin.h +2 -2
  13. data/ext/pg_query/include/access/htup.h +1 -1
  14. data/ext/pg_query/include/access/htup_details.h +75 -87
  15. data/ext/pg_query/include/access/itup.h +7 -1
  16. data/ext/pg_query/include/access/parallel.h +2 -2
  17. data/ext/pg_query/include/access/printtup.h +1 -1
  18. data/ext/pg_query/include/access/relation.h +1 -1
  19. data/ext/pg_query/include/access/relscan.h +17 -2
  20. data/ext/pg_query/include/access/rmgr.h +30 -3
  21. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  22. data/ext/pg_query/include/access/sdir.h +1 -1
  23. data/ext/pg_query/include/access/skey.h +1 -1
  24. data/ext/pg_query/include/access/stratnum.h +4 -2
  25. data/ext/pg_query/include/access/sysattr.h +1 -1
  26. data/ext/pg_query/include/access/table.h +2 -1
  27. data/ext/pg_query/include/access/tableam.h +272 -20
  28. data/ext/pg_query/include/access/toast_compression.h +73 -0
  29. data/ext/pg_query/include/access/transam.h +123 -13
  30. data/ext/pg_query/include/access/tupconvert.h +1 -1
  31. data/ext/pg_query/include/access/tupdesc.h +1 -1
  32. data/ext/pg_query/include/access/tupmacs.h +3 -3
  33. data/ext/pg_query/include/access/twophase.h +3 -1
  34. data/ext/pg_query/include/access/xact.h +73 -19
  35. data/ext/pg_query/include/access/xlog.h +60 -155
  36. data/ext/pg_query/include/access/xlog_internal.h +40 -13
  37. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  38. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  39. data/ext/pg_query/include/access/xlogreader.h +145 -39
  40. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  41. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  42. data/ext/pg_query/include/c.h +101 -44
  43. data/ext/pg_query/include/catalog/catalog.h +3 -1
  44. data/ext/pg_query/include/catalog/catversion.h +2 -2
  45. data/ext/pg_query/include/catalog/dependency.h +8 -16
  46. data/ext/pg_query/include/catalog/genbki.h +83 -5
  47. data/ext/pg_query/include/catalog/index.h +18 -3
  48. data/ext/pg_query/include/catalog/indexing.h +12 -324
  49. data/ext/pg_query/include/catalog/namespace.h +4 -2
  50. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  51. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  52. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  53. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  54. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  55. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  56. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  57. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  58. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  59. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  60. data/ext/pg_query/include/catalog/pg_class.h +44 -14
  61. data/ext/pg_query/include/catalog/pg_class_d.h +30 -1
  62. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  63. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  64. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  65. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  66. data/ext/pg_query/include/catalog/pg_control.h +3 -5
  67. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  68. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  69. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  70. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  71. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  72. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  73. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  74. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  75. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  76. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  77. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  78. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  79. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  80. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  81. data/ext/pg_query/include/catalog/pg_operator.h +18 -15
  82. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  83. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  84. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  85. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  86. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  88. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  89. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  90. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  91. data/ext/pg_query/include/catalog/pg_publication.h +50 -7
  92. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  93. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  95. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  96. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  97. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  98. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  99. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  100. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  101. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  102. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  103. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  104. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  105. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  106. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  107. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  108. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  109. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  110. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  111. data/ext/pg_query/include/catalog/pg_type.h +55 -24
  112. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  113. data/ext/pg_query/include/catalog/storage.h +5 -3
  114. data/ext/pg_query/include/commands/async.h +3 -4
  115. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  116. data/ext/pg_query/include/commands/defrem.h +11 -24
  117. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  118. data/ext/pg_query/include/commands/explain.h +1 -1
  119. data/ext/pg_query/include/commands/prepare.h +1 -1
  120. data/ext/pg_query/include/commands/tablespace.h +2 -2
  121. data/ext/pg_query/include/commands/trigger.h +18 -16
  122. data/ext/pg_query/include/commands/user.h +2 -2
  123. data/ext/pg_query/include/commands/vacuum.h +88 -41
  124. data/ext/pg_query/include/commands/variable.h +1 -1
  125. data/ext/pg_query/include/common/file_perm.h +4 -4
  126. data/ext/pg_query/include/common/hashfn.h +1 -1
  127. data/ext/pg_query/include/common/ip.h +1 -7
  128. data/ext/pg_query/include/common/keywords.h +2 -6
  129. data/ext/pg_query/include/common/kwlookup.h +1 -1
  130. data/ext/pg_query/include/common/pg_prng.h +60 -0
  131. data/ext/pg_query/include/common/relpath.h +2 -2
  132. data/ext/pg_query/include/common/string.h +24 -1
  133. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  134. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  135. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  136. data/ext/pg_query/include/executor/execdesc.h +1 -1
  137. data/ext/pg_query/include/executor/executor.h +65 -22
  138. data/ext/pg_query/include/executor/functions.h +17 -3
  139. data/ext/pg_query/include/executor/instrument.h +33 -16
  140. data/ext/pg_query/include/executor/spi.h +41 -3
  141. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  142. data/ext/pg_query/include/executor/tuptable.h +1 -1
  143. data/ext/pg_query/include/fmgr.h +13 -7
  144. data/ext/pg_query/include/funcapi.h +16 -4
  145. data/ext/pg_query/include/getaddrinfo.h +1 -1
  146. data/ext/pg_query/include/jit/jit.h +11 -11
  147. data/ext/pg_query/include/kwlist_d.h +517 -494
  148. data/ext/pg_query/include/lib/dshash.h +112 -0
  149. data/ext/pg_query/include/lib/ilist.h +20 -1
  150. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  151. data/ext/pg_query/include/lib/simplehash.h +140 -15
  152. data/ext/pg_query/include/lib/sort_template.h +432 -0
  153. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  154. data/ext/pg_query/include/libpq/auth.h +6 -4
  155. data/ext/pg_query/include/libpq/crypt.h +5 -4
  156. data/ext/pg_query/include/libpq/hba.h +43 -4
  157. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  158. data/ext/pg_query/include/libpq/libpq.h +30 -20
  159. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  160. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  161. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  162. data/ext/pg_query/include/mb/pg_wchar.h +105 -23
  163. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  164. data/ext/pg_query/include/miscadmin.h +47 -41
  165. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  166. data/ext/pg_query/include/nodes/execnodes.h +270 -78
  167. data/ext/pg_query/include/nodes/extensible.h +4 -2
  168. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  169. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  170. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  171. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  172. data/ext/pg_query/include/nodes/nodes.h +30 -11
  173. data/ext/pg_query/include/nodes/params.h +1 -1
  174. data/ext/pg_query/include/nodes/parsenodes.h +322 -90
  175. data/ext/pg_query/include/nodes/pathnodes.h +243 -66
  176. data/ext/pg_query/include/nodes/pg_list.h +75 -69
  177. data/ext/pg_query/include/nodes/plannodes.h +111 -28
  178. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  179. data/ext/pg_query/include/nodes/print.h +1 -1
  180. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  181. data/ext/pg_query/include/nodes/value.h +58 -39
  182. data/ext/pg_query/include/optimizer/cost.h +9 -2
  183. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  184. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  185. data/ext/pg_query/include/optimizer/optimizer.h +25 -17
  186. data/ext/pg_query/include/optimizer/paths.h +6 -6
  187. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  188. data/ext/pg_query/include/parser/analyze.h +19 -5
  189. data/ext/pg_query/include/parser/gram.h +947 -913
  190. data/ext/pg_query/include/parser/gramparse.h +1 -1
  191. data/ext/pg_query/include/parser/kwlist.h +463 -453
  192. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  193. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  194. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  195. data/ext/pg_query/include/parser/parse_func.h +2 -1
  196. data/ext/pg_query/include/parser/parse_node.h +21 -9
  197. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  198. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  199. data/ext/pg_query/include/parser/parse_type.h +1 -1
  200. data/ext/pg_query/include/parser/parser.h +31 -4
  201. data/ext/pg_query/include/parser/parsetree.h +1 -1
  202. data/ext/pg_query/include/parser/scanner.h +1 -1
  203. data/ext/pg_query/include/parser/scansup.h +2 -5
  204. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  205. data/ext/pg_query/include/pg_config.h +83 -41
  206. data/ext/pg_query/include/pg_config_manual.h +74 -21
  207. data/ext/pg_query/include/pg_getopt.h +6 -6
  208. data/ext/pg_query/include/pg_query.h +5 -4
  209. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +939 -113
  212. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  213. data/ext/pg_query/include/pg_query_outfuncs_defs.c +151 -26
  214. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  215. data/ext/pg_query/include/pg_query_readfuncs_defs.c +173 -30
  216. data/ext/pg_query/include/pg_trace.h +1 -1
  217. data/ext/pg_query/include/pgstat.h +449 -1238
  218. data/ext/pg_query/include/pgtime.h +14 -4
  219. data/ext/pg_query/include/pl_gram.h +126 -128
  220. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  221. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  222. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  223. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  224. data/ext/pg_query/include/plerrcodes.h +9 -1
  225. data/ext/pg_query/include/plpgsql.h +52 -54
  226. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  227. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  228. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  229. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  230. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  231. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  232. data/ext/pg_query/include/port/atomics.h +1 -1
  233. data/ext/pg_query/include/port/pg_bitutils.h +40 -10
  234. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  235. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  236. data/ext/pg_query/include/port.h +71 -46
  237. data/ext/pg_query/include/portability/instr_time.h +1 -1
  238. data/ext/pg_query/include/postgres.h +60 -16
  239. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  240. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  241. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  242. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  243. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  244. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  245. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  246. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  247. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  248. data/ext/pg_query/include/postmaster/startup.h +39 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  250. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  251. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1419 -914
  252. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  253. data/ext/pg_query/include/regex/regex.h +18 -16
  254. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  255. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  256. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  257. data/ext/pg_query/include/replication/origin.h +7 -7
  258. data/ext/pg_query/include/replication/reorderbuffer.h +259 -42
  259. data/ext/pg_query/include/replication/slot.h +22 -11
  260. data/ext/pg_query/include/replication/syncrep.h +5 -5
  261. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  262. data/ext/pg_query/include/replication/walsender.h +8 -8
  263. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  264. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  265. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  266. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  267. data/ext/pg_query/include/storage/backendid.h +3 -3
  268. data/ext/pg_query/include/storage/block.h +4 -10
  269. data/ext/pg_query/include/storage/buf.h +1 -1
  270. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  271. data/ext/pg_query/include/storage/bufpage.h +6 -8
  272. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  273. data/ext/pg_query/include/storage/dsm.h +4 -1
  274. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  275. data/ext/pg_query/include/storage/fd.h +33 -3
  276. data/ext/pg_query/include/storage/fileset.h +40 -0
  277. data/ext/pg_query/include/storage/ipc.h +4 -1
  278. data/ext/pg_query/include/storage/item.h +1 -1
  279. data/ext/pg_query/include/storage/itemid.h +1 -1
  280. data/ext/pg_query/include/storage/itemptr.h +3 -1
  281. data/ext/pg_query/include/storage/large_object.h +2 -2
  282. data/ext/pg_query/include/storage/latch.h +9 -13
  283. data/ext/pg_query/include/storage/lmgr.h +2 -1
  284. data/ext/pg_query/include/storage/lock.h +11 -8
  285. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  286. data/ext/pg_query/include/storage/lwlock.h +5 -32
  287. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  288. data/ext/pg_query/include/storage/off.h +1 -1
  289. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  290. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  291. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  292. data/ext/pg_query/include/storage/predicate.h +4 -4
  293. data/ext/pg_query/include/storage/proc.h +173 -59
  294. data/ext/pg_query/include/storage/procarray.h +98 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  296. data/ext/pg_query/include/storage/procsignal.h +3 -7
  297. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  298. data/ext/pg_query/include/storage/s_lock.h +60 -21
  299. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  300. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  301. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  302. data/ext/pg_query/include/storage/shmem.h +1 -1
  303. data/ext/pg_query/include/storage/sinval.h +3 -3
  304. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  305. data/ext/pg_query/include/storage/smgr.h +10 -8
  306. data/ext/pg_query/include/storage/spin.h +2 -2
  307. data/ext/pg_query/include/storage/standby.h +13 -6
  308. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  309. data/ext/pg_query/include/storage/sync.h +7 -3
  310. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  312. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  313. data/ext/pg_query/include/tcop/dest.h +1 -1
  314. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  315. data/ext/pg_query/include/tcop/pquery.h +1 -1
  316. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  317. data/ext/pg_query/include/tcop/utility.h +7 -3
  318. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  319. data/ext/pg_query/include/utils/acl.h +24 -3
  320. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  321. data/ext/pg_query/include/utils/array.h +7 -2
  322. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  323. data/ext/pg_query/include/utils/backend_status.h +321 -0
  324. data/ext/pg_query/include/utils/builtins.h +10 -11
  325. data/ext/pg_query/include/utils/bytea.h +3 -2
  326. data/ext/pg_query/include/utils/catcache.h +1 -1
  327. data/ext/pg_query/include/utils/date.h +1 -1
  328. data/ext/pg_query/include/utils/datetime.h +8 -7
  329. data/ext/pg_query/include/utils/datum.h +9 -1
  330. data/ext/pg_query/include/utils/dsa.h +1 -1
  331. data/ext/pg_query/include/utils/dynahash.h +4 -3
  332. data/ext/pg_query/include/utils/elog.h +52 -21
  333. data/ext/pg_query/include/utils/errcodes.h +2 -0
  334. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  335. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  336. data/ext/pg_query/include/utils/float.h +7 -7
  337. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  338. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  339. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  340. data/ext/pg_query/include/utils/guc.h +69 -43
  341. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  342. data/ext/pg_query/include/utils/hsearch.h +15 -11
  343. data/ext/pg_query/include/utils/inval.h +4 -1
  344. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  345. data/ext/pg_query/include/utils/memdebug.h +1 -1
  346. data/ext/pg_query/include/utils/memutils.h +8 -3
  347. data/ext/pg_query/include/utils/numeric.h +19 -5
  348. data/ext/pg_query/include/utils/palloc.h +25 -3
  349. data/ext/pg_query/include/utils/partcache.h +1 -1
  350. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  351. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  352. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  353. data/ext/pg_query/include/utils/pidfile.h +1 -1
  354. data/ext/pg_query/include/utils/plancache.h +6 -5
  355. data/ext/pg_query/include/utils/portal.h +10 -12
  356. data/ext/pg_query/include/utils/ps_status.h +1 -1
  357. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  358. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  359. data/ext/pg_query/include/utils/regproc.h +14 -3
  360. data/ext/pg_query/include/utils/rel.h +71 -19
  361. data/ext/pg_query/include/utils/relcache.h +8 -5
  362. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  363. data/ext/pg_query/include/utils/resowner.h +1 -1
  364. data/ext/pg_query/include/utils/rls.h +2 -2
  365. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  366. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  367. data/ext/pg_query/include/utils/snapmgr.h +34 -14
  368. data/ext/pg_query/include/utils/snapshot.h +14 -1
  369. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  370. data/ext/pg_query/include/utils/syscache.h +6 -1
  371. data/ext/pg_query/include/utils/timeout.h +11 -4
  372. data/ext/pg_query/include/utils/timestamp.h +6 -5
  373. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  374. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  375. data/ext/pg_query/include/utils/typcache.h +24 -17
  376. data/ext/pg_query/include/utils/tzparser.h +1 -1
  377. data/ext/pg_query/include/utils/varlena.h +5 -3
  378. data/ext/pg_query/include/utils/wait_event.h +289 -0
  379. data/ext/pg_query/include/utils/xml.h +4 -4
  380. data/ext/pg_query/pg_query.pb-c.c +4302 -2304
  381. data/ext/pg_query/pg_query_deparse.c +1106 -373
  382. data/ext/pg_query/pg_query_fingerprint.c +30 -10
  383. data/ext/pg_query/pg_query_json_plpgsql.c +0 -25
  384. data/ext/pg_query/pg_query_normalize.c +1 -1
  385. data/ext/pg_query/pg_query_outfuncs_json.c +54 -16
  386. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  387. data/ext/pg_query/pg_query_parse.c +1 -1
  388. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  389. data/ext/pg_query/pg_query_scan.c +2 -1
  390. data/ext/pg_query/pg_query_split.c +3 -2
  391. data/ext/pg_query/src_backend_catalog_namespace.c +20 -9
  392. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  393. data/ext/pg_query/src_backend_commands_define.c +11 -1
  394. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  395. data/ext/pg_query/src_backend_nodes_copyfuncs.c +401 -76
  396. data/ext/pg_query/src_backend_nodes_equalfuncs.c +290 -46
  397. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  398. data/ext/pg_query/src_backend_nodes_list.c +74 -11
  399. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  400. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  401. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  402. data/ext/pg_query/src_backend_parser_gram.c +33874 -31261
  403. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  404. data/ext/pg_query/src_backend_parser_scan.c +172 -209
  405. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  406. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  407. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  408. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  409. data/ext/pg_query/src_backend_tcop_postgres.c +62 -23
  410. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  411. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  412. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  413. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  414. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +71 -5
  415. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  416. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  417. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  418. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  419. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  420. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  421. data/ext/pg_query/src_backend_utils_misc_guc.c +206 -45
  422. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  423. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  424. data/ext/pg_query/src_common_encnames.c +1 -1
  425. data/ext/pg_query/src_common_hashfn.c +3 -3
  426. data/ext/pg_query/src_common_keywords.c +15 -2
  427. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  428. data/ext/pg_query/src_common_kwlookup.c +1 -1
  429. data/ext/pg_query/src_common_pg_prng.c +152 -0
  430. data/ext/pg_query/src_common_psprintf.c +1 -1
  431. data/ext/pg_query/src_common_string.c +7 -1
  432. data/ext/pg_query/src_common_stringinfo.c +1 -1
  433. data/ext/pg_query/src_common_wchar.c +701 -109
  434. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +45 -20
  435. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  436. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1233 -1259
  437. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  438. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  441. data/ext/pg_query/src_port_pg_bitutils.c +41 -31
  442. data/ext/pg_query/src_port_pgsleep.c +1 -1
  443. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  444. data/ext/pg_query/src_port_qsort.c +12 -224
  445. data/ext/pg_query/src_port_snprintf.c +37 -13
  446. data/ext/pg_query/src_port_strerror.c +9 -19
  447. data/ext/pg_query/src_port_strnlen.c +1 -1
  448. data/lib/pg_query/filter_columns.rb +1 -1
  449. data/lib/pg_query/fingerprint.rb +5 -1
  450. data/lib/pg_query/node.rb +2 -2
  451. data/lib/pg_query/param_refs.rb +1 -1
  452. data/lib/pg_query/parse.rb +20 -8
  453. data/lib/pg_query/pg_query_pb.rb +1108 -942
  454. data/lib/pg_query/treewalker.rb +6 -0
  455. data/lib/pg_query/truncate.rb +1 -1
  456. data/lib/pg_query/version.rb +1 -1
  457. metadata +27 -17
  458. data/ext/pg_query/include/access/xloginsert.h +0 -64
  459. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  460. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  461. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  462. data/ext/pg_query/include/parser/parse_target.h +0 -46
  463. data/ext/pg_query/pg_query_ruby_freebsd.sym +0 -2
  464. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -659
  465. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  466. data/ext/pg_query/src_port_erand48.c +0 -127
  467. data/ext/pg_query/src_port_random.c +0 -31
@@ -3,7 +3,7 @@
3
3
  * plpgsql.h - Definitions for the PL/pgSQL
4
4
  * procedural language
5
5
  *
6
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  *
@@ -64,7 +64,6 @@ typedef enum PLpgSQL_datum_type
64
64
  PLPGSQL_DTYPE_ROW,
65
65
  PLPGSQL_DTYPE_REC,
66
66
  PLPGSQL_DTYPE_RECFIELD,
67
- PLPGSQL_DTYPE_ARRAYELEM,
68
67
  PLPGSQL_DTYPE_PROMISE
69
68
  } PLpgSQL_datum_type;
70
69
 
@@ -128,8 +127,7 @@ typedef enum PLpgSQL_stmt_type
128
127
  PLPGSQL_STMT_PERFORM,
129
128
  PLPGSQL_STMT_CALL,
130
129
  PLPGSQL_STMT_COMMIT,
131
- PLPGSQL_STMT_ROLLBACK,
132
- PLPGSQL_STMT_SET
130
+ PLPGSQL_STMT_ROLLBACK
133
131
  } PLpgSQL_stmt_type;
134
132
 
135
133
  /*
@@ -218,10 +216,10 @@ typedef struct PLpgSQL_type
218
216
  */
219
217
  typedef struct PLpgSQL_expr
220
218
  {
221
- char *query;
222
- SPIPlanPtr plan;
219
+ char *query; /* query string, verbatim from function body */
220
+ RawParseMode parseMode; /* raw_parser() mode to use */
221
+ SPIPlanPtr plan; /* plan, or NULL if not made yet */
223
222
  Bitmapset *paramnos; /* all dnos referenced by this query */
224
- int rwparam; /* dno of read/write param, or -1 if none */
225
223
 
226
224
  /* function containing this expr (not set until we first parse query) */
227
225
  struct PLpgSQL_function *func;
@@ -235,6 +233,17 @@ typedef struct PLpgSQL_expr
235
233
  int32 expr_simple_typmod; /* result typmod, if simple */
236
234
  bool expr_simple_mutable; /* true if simple expr is mutable */
237
235
 
236
+ /*
237
+ * These fields are used to optimize assignments to expanded-datum
238
+ * variables. If this expression is the source of an assignment to a
239
+ * simple variable, target_param holds that variable's dno; else it's -1.
240
+ * If we match a Param within expr_simple_expr to such a variable, that
241
+ * Param's address is stored in expr_rw_param; then expression code
242
+ * generation will allow the value for that Param to be passed read/write.
243
+ */
244
+ int target_param; /* dno of assign target, or -1 if none */
245
+ Param *expr_rw_param; /* read/write Param within expr, if any */
246
+
238
247
  /*
239
248
  * If the expression was ever determined to be simple, we remember its
240
249
  * CachedPlanSource and CachedPlan here. If expr_simple_plan_lxid matches
@@ -260,7 +269,7 @@ typedef struct PLpgSQL_expr
260
269
  * Generic datum array item
261
270
  *
262
271
  * PLpgSQL_datum is the common supertype for PLpgSQL_var, PLpgSQL_row,
263
- * PLpgSQL_rec, PLpgSQL_recfield, and PLpgSQL_arrayelem.
272
+ * PLpgSQL_rec, and PLpgSQL_recfield.
264
273
  */
265
274
  typedef struct PLpgSQL_datum
266
275
  {
@@ -421,30 +430,6 @@ typedef struct PLpgSQL_recfield
421
430
  /* if rectupledescid == INVALID_TUPLEDESC_IDENTIFIER, finfo isn't valid */
422
431
  } PLpgSQL_recfield;
423
432
 
424
- /*
425
- * Element of array variable
426
- */
427
- typedef struct PLpgSQL_arrayelem
428
- {
429
- PLpgSQL_datum_type dtype;
430
- int dno;
431
- /* end of PLpgSQL_datum fields */
432
-
433
- PLpgSQL_expr *subscript;
434
- int arrayparentno; /* dno of parent array variable */
435
-
436
- /* Remaining fields are cached info about the array variable's type */
437
- Oid parenttypoid; /* type of array variable; 0 if not yet set */
438
- int32 parenttypmod; /* typmod of array variable */
439
- Oid arraytypoid; /* OID of actual array type */
440
- int32 arraytypmod; /* typmod of array (and its elements too) */
441
- int16 arraytyplen; /* typlen of array type */
442
- Oid elemtypoid; /* OID of array element type */
443
- int16 elemtyplen; /* typlen of element type */
444
- bool elemtypbyval; /* element type is pass-by-value? */
445
- char elemtypalign; /* typalign of element type */
446
- } PLpgSQL_arrayelem;
447
-
448
433
  /*
449
434
  * Item in the compilers namespace tree
450
435
  */
@@ -580,17 +565,6 @@ typedef struct PLpgSQL_stmt_rollback
580
565
  bool chain;
581
566
  } PLpgSQL_stmt_rollback;
582
567
 
583
- /*
584
- * SET statement
585
- */
586
- typedef struct PLpgSQL_stmt_set
587
- {
588
- PLpgSQL_stmt_type cmd_type;
589
- int lineno;
590
- unsigned int stmtid;
591
- PLpgSQL_expr *expr;
592
- } PLpgSQL_stmt_set;
593
-
594
568
  /*
595
569
  * GET DIAGNOSTICS item
596
570
  */
@@ -919,10 +893,10 @@ typedef struct PLpgSQL_stmt_execsql
919
893
  int lineno;
920
894
  unsigned int stmtid;
921
895
  PLpgSQL_expr *sqlstmt;
922
- bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? */
896
+ bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE/MERGE? */
897
+ bool mod_stmt_set; /* is mod_stmt valid yet? */
923
898
  bool into; /* INTO supplied? */
924
899
  bool strict; /* INTO STRICT flag */
925
- bool mod_stmt_set; /* is mod_stmt valid yet? */
926
900
  PLpgSQL_variable *target; /* INTO target (record or row) */
927
901
  } PLpgSQL_stmt_execsql;
928
902
 
@@ -1023,9 +997,6 @@ typedef struct PLpgSQL_function
1023
997
  int extra_warnings;
1024
998
  int extra_errors;
1025
999
 
1026
- /* count of statements inside function */
1027
- unsigned int nstatements;
1028
-
1029
1000
  /* the datums representing the function's local variables */
1030
1001
  int ndatums;
1031
1002
  PLpgSQL_datum **datums;
@@ -1034,6 +1005,10 @@ typedef struct PLpgSQL_function
1034
1005
  /* function body parsetree */
1035
1006
  PLpgSQL_stmt_block *action;
1036
1007
 
1008
+ /* data derived while parsing body */
1009
+ unsigned int nstatements; /* counter for assigning stmtids */
1010
+ bool requires_procedure_resowner; /* contains CALL or DO? */
1011
+
1037
1012
  /* these fields change when the function is used */
1038
1013
  struct PLpgSQL_execstate *cur_estate;
1039
1014
  unsigned long use_count;
@@ -1095,6 +1070,9 @@ typedef struct PLpgSQL_execstate
1095
1070
  EState *simple_eval_estate;
1096
1071
  ResourceOwner simple_eval_resowner;
1097
1072
 
1073
+ /* if running nonatomic procedure or DO block, resowner to use for CALL */
1074
+ ResourceOwner procedure_resowner;
1075
+
1098
1076
  /* lookup table to use for executing type casts */
1099
1077
  HTAB *cast_hash;
1100
1078
  MemoryContext cast_hash_context;
@@ -1110,6 +1088,7 @@ typedef struct PLpgSQL_execstate
1110
1088
 
1111
1089
  /* status information for error context reporting */
1112
1090
  PLpgSQL_stmt *err_stmt; /* current stmt */
1091
+ PLpgSQL_variable *err_var; /* current variable, if in a DECLARE section */
1113
1092
  const char *err_text; /* additional state info */
1114
1093
 
1115
1094
  void *plugin_info; /* reserved for use by optional plugin */
@@ -1121,8 +1100,6 @@ typedef struct PLpgSQL_execstate
1121
1100
  * variable "PLpgSQL_plugin" and set it to point to a PLpgSQL_plugin struct.
1122
1101
  * Typically the struct could just be static data in the plugin library.
1123
1102
  * We expect that a plugin would do this at library load time (_PG_init()).
1124
- * It must also be careful to set the rendezvous variable back to NULL
1125
- * if it is unloaded (_PG_fini()).
1126
1103
  *
1127
1104
  * This structure is basically a collection of function pointers --- at
1128
1105
  * various interesting points in pl_exec.c, we call these functions
@@ -1141,9 +1118,17 @@ typedef struct PLpgSQL_execstate
1141
1118
  * statement.
1142
1119
  *
1143
1120
  * Also, immediately before any call to func_setup, PL/pgSQL fills in the
1144
- * error_callback and assign_expr fields with pointers to its own
1145
- * plpgsql_exec_error_callback and exec_assign_expr functions. This is
1146
- * a somewhat ad-hoc expedient to simplify life for debugger plugins.
1121
+ * remaining fields with pointers to some of its own functions, allowing the
1122
+ * plugin to invoke those functions conveniently. The exposed functions are:
1123
+ * plpgsql_exec_error_callback
1124
+ * exec_assign_expr
1125
+ * exec_assign_value
1126
+ * exec_eval_datum
1127
+ * exec_cast_value
1128
+ * (plpgsql_exec_error_callback is not actually meant to be called by the
1129
+ * plugin, but rather to allow it to identify PL/pgSQL error context stack
1130
+ * frames. The others are useful for debugger-like plugins to examine and
1131
+ * set variables.)
1147
1132
  */
1148
1133
  typedef struct PLpgSQL_plugin
1149
1134
  {
@@ -1156,8 +1141,20 @@ typedef struct PLpgSQL_plugin
1156
1141
 
1157
1142
  /* Function pointers set by PL/pgSQL itself */
1158
1143
  void (*error_callback) (void *arg);
1159
- void (*assign_expr) (PLpgSQL_execstate *estate, PLpgSQL_datum *target,
1144
+ void (*assign_expr) (PLpgSQL_execstate *estate,
1145
+ PLpgSQL_datum *target,
1160
1146
  PLpgSQL_expr *expr);
1147
+ void (*assign_value) (PLpgSQL_execstate *estate,
1148
+ PLpgSQL_datum *target,
1149
+ Datum value, bool isNull,
1150
+ Oid valtype, int32 valtypmod);
1151
+ void (*eval_datum) (PLpgSQL_execstate *estate, PLpgSQL_datum *datum,
1152
+ Oid *typeId, int32 *typetypmod,
1153
+ Datum *value, bool *isnull);
1154
+ Datum (*cast_value) (PLpgSQL_execstate *estate,
1155
+ Datum value, bool *isnull,
1156
+ Oid valtype, int32 valtypmod,
1157
+ Oid reqtype, int32 reqtypmod);
1161
1158
  } PLpgSQL_plugin;
1162
1159
 
1163
1160
  /*
@@ -1281,6 +1278,7 @@ extern Datum plpgsql_exec_function(PLpgSQL_function *func,
1281
1278
  FunctionCallInfo fcinfo,
1282
1279
  EState *simple_eval_estate,
1283
1280
  ResourceOwner simple_eval_resowner,
1281
+ ResourceOwner procedure_resowner,
1284
1282
  bool atomic);
1285
1283
  extern HeapTuple plpgsql_exec_trigger(PLpgSQL_function *func,
1286
1284
  TriggerData *trigdata);
@@ -3,7 +3,7 @@
3
3
  * arch-arm.h
4
4
  * Atomic operations considerations specific to ARM
5
5
  *
6
- * Portions Copyright (c) 2013-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 2013-2022, PostgreSQL Global Development Group
7
7
  *
8
8
  * NOTES:
9
9
  *
@@ -23,4 +23,10 @@
23
23
  */
24
24
  #if !defined(__aarch64__) && !defined(__aarch64)
25
25
  #define PG_DISABLE_64_BIT_ATOMICS
26
+ #else
27
+ /*
28
+ * Architecture Reference Manual for ARMv8 states aligned read/write to/from
29
+ * general purpose register is atomic.
30
+ */
31
+ #define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY
26
32
  #endif /* __aarch64__ || __aarch64 */
@@ -3,7 +3,7 @@
3
3
  * arch-ppc.h
4
4
  * Atomic operations considerations specific to PowerPC
5
5
  *
6
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * NOTES:
@@ -7,7 +7,7 @@
7
7
  * support for xadd and cmpxchg. Given that the 386 isn't supported anywhere
8
8
  * anymore that's not much of a restriction luckily.
9
9
  *
10
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
10
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
11
11
  * Portions Copyright (c) 1994, Regents of the University of California
12
12
  *
13
13
  * NOTES:
@@ -4,7 +4,7 @@
4
4
  * Fallback for platforms without spinlock and/or atomics support. Slower
5
5
  * than native atomics support, but not unusably slow.
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/port/atomics/fallback.h
@@ -3,16 +3,16 @@
3
3
  * generic-gcc.h
4
4
  * Atomic operations, implemented using gcc (or compatible) intrinsics.
5
5
  *
6
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * NOTES:
10
10
  *
11
11
  * Documentation:
12
12
  * * Legacy __sync Built-in Functions for Atomic Memory Access
13
- * http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fsync-Builtins.html
13
+ * https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fsync-Builtins.html
14
14
  * * Built-in functions for memory model aware atomic operations
15
- * http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html
15
+ * https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html
16
16
  *
17
17
  * src/include/port/atomics/generic-gcc.h
18
18
  *
@@ -4,7 +4,7 @@
4
4
  * Implement higher level operations based on some lower level atomic
5
5
  * operations.
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/port/atomics/generic.h
@@ -28,7 +28,7 @@
28
28
  * For an introduction to using memory barriers within the PostgreSQL backend,
29
29
  * see src/backend/storage/lmgr/README.barrier
30
30
  *
31
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
31
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
32
32
  * Portions Copyright (c) 1994, Regents of the University of California
33
33
  *
34
34
  * src/include/port/atomics.h
@@ -4,7 +4,7 @@
4
4
  * Miscellaneous functions for bit-wise operations.
5
5
  *
6
6
  *
7
- * Copyright (c) 2019-2020, PostgreSQL Global Development Group
7
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
8
8
  *
9
9
  * src/include/port/pg_bitutils.h
10
10
  *
@@ -13,15 +13,9 @@
13
13
  #ifndef PG_BITUTILS_H
14
14
  #define PG_BITUTILS_H
15
15
 
16
- #ifndef FRONTEND
17
16
  extern PGDLLIMPORT const uint8 pg_leftmost_one_pos[256];
18
17
  extern PGDLLIMPORT const uint8 pg_rightmost_one_pos[256];
19
18
  extern PGDLLIMPORT const uint8 pg_number_of_ones[256];
20
- #else
21
- extern const uint8 pg_leftmost_one_pos[256];
22
- extern const uint8 pg_rightmost_one_pos[256];
23
- extern const uint8 pg_number_of_ones[256];
24
- #endif
25
19
 
26
20
  /*
27
21
  * pg_leftmost_one_pos32
@@ -253,20 +247,56 @@ pg_ceil_log2_64(uint64 num)
253
247
  return pg_leftmost_one_pos64(num - 1) + 1;
254
248
  }
255
249
 
256
- /* Count the number of one-bits in a uint32 or uint64 */
250
+ /*
251
+ * With MSVC on x86_64 builds, try using native popcnt instructions via the
252
+ * __popcnt and __popcnt64 intrinsics. These don't work the same as GCC's
253
+ * __builtin_popcount* intrinsic functions as they always emit popcnt
254
+ * instructions.
255
+ */
256
+ #if defined(_MSC_VER) && defined(_M_AMD64)
257
+ #define HAVE_X86_64_POPCNTQ
258
+ #endif
259
+
260
+ /*
261
+ * On x86_64, we can use the hardware popcount instruction, but only if
262
+ * we can verify that the CPU supports it via the cpuid instruction.
263
+ *
264
+ * Otherwise, we fall back to a hand-rolled implementation.
265
+ */
266
+ #ifdef HAVE_X86_64_POPCNTQ
267
+ #if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
268
+ #define TRY_POPCNT_FAST 1
269
+ #endif
270
+ #endif
271
+
272
+ #ifdef TRY_POPCNT_FAST
273
+ /* Attempt to use the POPCNT instruction, but perform a runtime check first */
257
274
  extern int (*pg_popcount32) (uint32 word);
258
275
  extern int (*pg_popcount64) (uint64 word);
259
276
 
277
+ #else
278
+ /* Use a portable implementation -- no need for a function pointer. */
279
+ extern int pg_popcount32(uint32 word);
280
+ extern int pg_popcount64(uint64 word);
281
+
282
+ #endif /* TRY_POPCNT_FAST */
283
+
260
284
  /* Count the number of one-bits in a byte array */
261
285
  extern uint64 pg_popcount(const char *buf, int bytes);
262
286
 
263
287
  /*
264
- * Rotate the bits of "word" to the right by n bits.
288
+ * Rotate the bits of "word" to the right/left by n bits.
265
289
  */
266
290
  static inline uint32
267
291
  pg_rotate_right32(uint32 word, int n)
268
292
  {
269
- return (word >> n) | (word << (sizeof(word) * BITS_PER_BYTE - n));
293
+ return (word >> n) | (word << (32 - n));
294
+ }
295
+
296
+ static inline uint32
297
+ pg_rotate_left32(uint32 word, int n)
298
+ {
299
+ return (word << n) | (word >> (32 - n));
270
300
  }
271
301
 
272
302
  #endif /* PG_BITUTILS_H */
@@ -11,7 +11,7 @@
11
11
  * return the same. Use caution when using these wrapper macros with signed
12
12
  * integers.
13
13
  *
14
- * Copyright (c) 2015-2020, PostgreSQL Global Development Group
14
+ * Copyright (c) 2015-2022, PostgreSQL Global Development Group
15
15
  *
16
16
  * src/include/port/pg_bswap.h
17
17
  *
@@ -23,7 +23,7 @@
23
23
  * EQ_CRC32C(c1, c2)
24
24
  * Check for equality of two CRCs.
25
25
  *
26
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
26
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
27
27
  * Portions Copyright (c) 1994, Regents of the University of California
28
28
  *
29
29
  * src/include/port/pg_crc32c.h
@@ -3,7 +3,7 @@
3
3
  * port.h
4
4
  * Header for src/port/ compatibility functions.
5
5
  *
6
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
6
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
7
  * Portions Copyright (c) 1994, Regents of the University of California
8
8
  *
9
9
  * src/include/port.h
@@ -14,8 +14,6 @@
14
14
  #define PG_PORT_H
15
15
 
16
16
  #include <ctype.h>
17
- #include <netdb.h>
18
- #include <pwd.h>
19
17
 
20
18
  /*
21
19
  * Windows has enough specialized port stuff that we push most of it off
@@ -37,6 +35,11 @@ typedef SOCKET pgsocket;
37
35
  #define PGINVALID_SOCKET INVALID_SOCKET
38
36
  #endif
39
37
 
38
+ /* if platform lacks socklen_t, we assume this will work */
39
+ #ifndef HAVE_SOCKLEN_T
40
+ typedef unsigned int socklen_t;
41
+ #endif
42
+
40
43
  /* non-blocking */
41
44
  extern bool pg_set_noblock(pgsocket sock);
42
45
  extern bool pg_set_block(pgsocket sock);
@@ -75,34 +78,62 @@ extern void get_parent_directory(char *path);
75
78
  extern char **pgfnames(const char *path);
76
79
  extern void pgfnames_cleanup(char **filenames);
77
80
 
78
- /*
79
- * is_absolute_path
80
- *
81
- * By making this a macro we avoid needing to include path.c in libpq.
82
- */
83
- #ifndef WIN32
84
- #define IS_DIR_SEP(ch) ((ch) == '/')
85
-
86
- #define is_absolute_path(filename) \
81
+ #define IS_NONWINDOWS_DIR_SEP(ch) ((ch) == '/')
82
+ #define is_nonwindows_absolute_path(filename) \
87
83
  ( \
88
- IS_DIR_SEP((filename)[0]) \
84
+ IS_NONWINDOWS_DIR_SEP((filename)[0]) \
89
85
  )
90
- #else
91
- #define IS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\')
92
86
 
87
+ #define IS_WINDOWS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\')
93
88
  /* See path_is_relative_and_below_cwd() for how we handle 'E:abc'. */
94
- #define is_absolute_path(filename) \
89
+ #define is_windows_absolute_path(filename) \
95
90
  ( \
96
- IS_DIR_SEP((filename)[0]) || \
91
+ IS_WINDOWS_DIR_SEP((filename)[0]) || \
97
92
  (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \
98
- IS_DIR_SEP((filename)[2])) \
93
+ IS_WINDOWS_DIR_SEP((filename)[2])) \
99
94
  )
95
+
96
+ /*
97
+ * is_absolute_path and IS_DIR_SEP
98
+ *
99
+ * By using macros here we avoid needing to include path.c in libpq.
100
+ */
101
+ #ifndef WIN32
102
+ #define IS_DIR_SEP(ch) IS_NONWINDOWS_DIR_SEP(ch)
103
+ #define is_absolute_path(filename) is_nonwindows_absolute_path(filename)
104
+ #else
105
+ #define IS_DIR_SEP(ch) IS_WINDOWS_DIR_SEP(ch)
106
+ #define is_absolute_path(filename) is_windows_absolute_path(filename)
100
107
  #endif
101
108
 
109
+ /*
110
+ * This macro provides a centralized list of all errnos that identify
111
+ * hard failure of a previously-established network connection.
112
+ * The macro is intended to be used in a switch statement, in the form
113
+ * "case ALL_CONNECTION_FAILURE_ERRNOS:".
114
+ *
115
+ * Note: this groups EPIPE and ECONNRESET, which we take to indicate a
116
+ * probable server crash, with other errors that indicate loss of network
117
+ * connectivity without proving much about the server's state. Places that
118
+ * are actually reporting errors typically single out EPIPE and ECONNRESET,
119
+ * while allowing the network failures to be reported generically.
120
+ */
121
+ #define ALL_CONNECTION_FAILURE_ERRNOS \
122
+ EPIPE: \
123
+ case ECONNRESET: \
124
+ case ECONNABORTED: \
125
+ case EHOSTDOWN: \
126
+ case EHOSTUNREACH: \
127
+ case ENETDOWN: \
128
+ case ENETRESET: \
129
+ case ENETUNREACH: \
130
+ case ETIMEDOUT
131
+
102
132
  /* Portable locale initialization (in exec.c) */
103
133
  extern void set_pglocale_pgservice(const char *argv0, const char *app);
104
134
 
105
135
  /* Portable way to find and execute binaries (in exec.c) */
136
+ extern int validate_exec(const char *path);
106
137
  extern int find_my_exec(const char *argv0, char *retpath);
107
138
  extern int find_other_exec(const char *argv0, const char *target,
108
139
  const char *versionstr, char *retpath);
@@ -111,6 +142,11 @@ extern char *pipe_read_line(char *cmd, char *line, int maxsize);
111
142
  /* Doesn't belong here, but this is used with find_other_exec(), so... */
112
143
  #define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"
113
144
 
145
+ #ifdef EXEC_BACKEND
146
+ /* Disable ASLR before exec, for developer builds only (in exec.c) */
147
+ extern int pg_disable_aslr(void);
148
+ #endif
149
+
114
150
 
115
151
  #if defined(WIN32) || defined(__CYGWIN__)
116
152
  #define EXE ".exe"
@@ -213,10 +249,6 @@ extern char *pg_strerror_r(int errnum, char *buf, size_t buflen);
213
249
  /* Wrap strsignal(), or provide our own version if necessary */
214
250
  extern const char *pg_strsignal(int signum);
215
251
 
216
- /* Portable prompt handling */
217
- extern void simple_prompt(const char *prompt, char *destination, size_t destlen,
218
- bool echo);
219
-
220
252
  extern int pclose_check(FILE *stream);
221
253
 
222
254
  /* Global variable holding time zone information. */
@@ -271,6 +303,7 @@ extern bool rmtree(const char *path, bool rmtopdir);
271
303
  * passing of other special options.
272
304
  */
273
305
  #define O_DIRECT 0x80000000
306
+ extern HANDLE pgwin32_open_handle(const char *, int, bool);
274
307
  extern int pgwin32_open(const char *, int,...);
275
308
  extern FILE *pgwin32_fopen(const char *, const char *);
276
309
  #define open(a,b,c) pgwin32_open(a,b,c)
@@ -337,11 +370,6 @@ extern int gettimeofday(struct timeval *tp, struct timezone *tzp);
337
370
  #define pgoff_t off_t
338
371
  #endif
339
372
 
340
- extern double pg_erand48(unsigned short xseed[3]);
341
- extern long pg_lrand48(void);
342
- extern long pg_jrand48(unsigned short xseed[3]);
343
- extern void pg_srand48(long seed);
344
-
345
373
  #ifndef HAVE_FLS
346
374
  extern int fls(int mask);
347
375
  #endif
@@ -413,6 +441,8 @@ extern ssize_t pg_pread(int fd, void *buf, size_t nbyte, off_t offset);
413
441
  extern ssize_t pg_pwrite(int fd, const void *buf, size_t nbyte, off_t offset);
414
442
  #endif
415
443
 
444
+ /* For pg_pwritev() and pg_preadv(), see port/pg_iovec.h. */
445
+
416
446
  #if !HAVE_DECL_STRLCAT
417
447
  extern size_t strlcat(char *dst, const char *src, size_t siz);
418
448
  #endif
@@ -425,20 +455,12 @@ extern size_t strlcpy(char *dst, const char *src, size_t siz);
425
455
  extern size_t strnlen(const char *str, size_t maxlen);
426
456
  #endif
427
457
 
428
- #if !defined(HAVE_RANDOM)
429
- extern long random(void);
430
- #endif
431
-
432
458
  #ifndef HAVE_SETENV
433
- extern int setenv(const char *name, const char *value, int overwrite);
459
+ extern int setenv(const char *name, const char *value, int overwrite);
434
460
  #endif
435
461
 
436
462
  #ifndef HAVE_UNSETENV
437
- extern void unsetenv(const char *name);
438
- #endif
439
-
440
- #ifndef HAVE_SRANDOM
441
- extern void srandom(unsigned int seed);
463
+ extern int unsetenv(const char *name);
442
464
  #endif
443
465
 
444
466
  #ifndef HAVE_DLOPEN
@@ -464,18 +486,12 @@ extern char *dlerror(void);
464
486
  #define RTLD_GLOBAL 0
465
487
  #endif
466
488
 
467
- /* thread.h */
489
+ /* thread.c */
468
490
  #ifndef WIN32
469
- extern int pqGetpwuid(uid_t uid, struct passwd *resultbuf, char *buffer,
470
- size_t buflen, struct passwd **result);
491
+ extern bool pg_get_user_name(uid_t user_id, char *buffer, size_t buflen);
492
+ extern bool pg_get_user_home_dir(uid_t user_id, char *buffer, size_t buflen);
471
493
  #endif
472
494
 
473
- extern int pqGethostbyname(const char *name,
474
- struct hostent *resultbuf,
475
- char *buffer, size_t buflen,
476
- struct hostent **result,
477
- int *herrno);
478
-
479
495
  extern void pg_qsort(void *base, size_t nel, size_t elsize,
480
496
  int (*cmp) (const void *, const void *));
481
497
  extern int pg_qsort_strcmp(const void *a, const void *b);
@@ -487,6 +503,14 @@ typedef int (*qsort_arg_comparator) (const void *a, const void *b, void *arg);
487
503
  extern void qsort_arg(void *base, size_t nel, size_t elsize,
488
504
  qsort_arg_comparator cmp, void *arg);
489
505
 
506
+ extern void qsort_interruptible(void *base, size_t nel, size_t elsize,
507
+ qsort_arg_comparator cmp, void *arg);
508
+
509
+ extern void *bsearch_arg(const void *key, const void *base,
510
+ size_t nmemb, size_t size,
511
+ int (*compar) (const void *, const void *, void *),
512
+ void *arg);
513
+
490
514
  /* port/chklocale.c */
491
515
  extern int pg_get_encoding_from_locale(const char *ctype, bool write_message);
492
516
 
@@ -499,6 +523,7 @@ extern char *pg_inet_net_ntop(int af, const void *src, int bits,
499
523
  char *dst, size_t size);
500
524
 
501
525
  /* port/pg_strong_random.c */
526
+ extern void pg_strong_random_init(void);
502
527
  extern bool pg_strong_random(void *buf, size_t len);
503
528
 
504
529
  /*
@@ -46,7 +46,7 @@
46
46
  * Beware of multiple evaluations of the macro arguments.
47
47
  *
48
48
  *
49
- * Copyright (c) 2001-2020, PostgreSQL Global Development Group
49
+ * Copyright (c) 2001-2022, PostgreSQL Global Development Group
50
50
  *
51
51
  * src/include/portability/instr_time.h
52
52
  *