pg_query 2.1.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 (472) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +104 -0
  3. data/README.md +59 -31
  4. data/Rakefile +2 -2
  5. data/ext/pg_query/extconf.rb +8 -2
  6. data/ext/pg_query/include/access/amapi.h +45 -1
  7. data/ext/pg_query/include/access/attmap.h +1 -1
  8. data/ext/pg_query/include/access/attnum.h +2 -2
  9. data/ext/pg_query/include/access/clog.h +4 -2
  10. data/ext/pg_query/include/access/commit_ts.h +6 -9
  11. data/ext/pg_query/include/access/detoast.h +1 -11
  12. data/ext/pg_query/include/access/genam.h +15 -12
  13. data/ext/pg_query/include/access/gin.h +2 -2
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +75 -87
  16. data/ext/pg_query/include/access/itup.h +7 -1
  17. data/ext/pg_query/include/access/parallel.h +2 -2
  18. data/ext/pg_query/include/access/printtup.h +1 -1
  19. data/ext/pg_query/include/access/relation.h +1 -1
  20. data/ext/pg_query/include/access/relscan.h +17 -2
  21. data/ext/pg_query/include/access/rmgr.h +30 -3
  22. data/ext/pg_query/include/access/rmgrlist.h +23 -23
  23. data/ext/pg_query/include/access/sdir.h +1 -1
  24. data/ext/pg_query/include/access/skey.h +1 -1
  25. data/ext/pg_query/include/access/stratnum.h +4 -2
  26. data/ext/pg_query/include/access/sysattr.h +1 -1
  27. data/ext/pg_query/include/access/table.h +2 -1
  28. data/ext/pg_query/include/access/tableam.h +272 -20
  29. data/ext/pg_query/include/access/toast_compression.h +73 -0
  30. data/ext/pg_query/include/access/transam.h +123 -13
  31. data/ext/pg_query/include/access/tupconvert.h +1 -1
  32. data/ext/pg_query/include/access/tupdesc.h +1 -1
  33. data/ext/pg_query/include/access/tupmacs.h +3 -3
  34. data/ext/pg_query/include/access/twophase.h +5 -1
  35. data/ext/pg_query/include/access/xact.h +79 -19
  36. data/ext/pg_query/include/access/xlog.h +60 -155
  37. data/ext/pg_query/include/access/xlog_internal.h +50 -14
  38. data/ext/pg_query/include/access/xlogdefs.h +8 -16
  39. data/ext/pg_query/include/access/xlogprefetcher.h +55 -0
  40. data/ext/pg_query/include/access/xlogreader.h +148 -32
  41. data/ext/pg_query/include/access/xlogrecord.h +18 -9
  42. data/ext/pg_query/include/access/xlogrecovery.h +157 -0
  43. data/ext/pg_query/include/c.h +101 -44
  44. data/ext/pg_query/include/catalog/catalog.h +3 -1
  45. data/ext/pg_query/include/catalog/catversion.h +2 -2
  46. data/ext/pg_query/include/catalog/dependency.h +10 -16
  47. data/ext/pg_query/include/catalog/genbki.h +83 -5
  48. data/ext/pg_query/include/catalog/index.h +18 -3
  49. data/ext/pg_query/include/catalog/indexing.h +12 -324
  50. data/ext/pg_query/include/catalog/namespace.h +4 -2
  51. data/ext/pg_query/include/catalog/objectaccess.h +70 -2
  52. data/ext/pg_query/include/catalog/objectaddress.h +11 -6
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +14 -10
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +2 -1
  55. data/ext/pg_query/include/catalog/pg_am.h +4 -1
  56. data/ext/pg_query/include/catalog/pg_am_d.h +3 -1
  57. data/ext/pg_query/include/catalog/pg_attribute.h +27 -10
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +21 -18
  59. data/ext/pg_query/include/catalog/pg_authid.h +7 -2
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +17 -9
  61. data/ext/pg_query/include/catalog/pg_class.h +45 -15
  62. data/ext/pg_query/include/catalog/pg_class_d.h +31 -2
  63. data/ext/pg_query/include/catalog/pg_collation.h +33 -8
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +20 -3
  65. data/ext/pg_query/include/catalog/pg_constraint.h +38 -12
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +10 -4
  67. data/ext/pg_query/include/catalog/pg_control.h +5 -5
  68. data/ext/pg_query/include/catalog/pg_conversion.h +7 -4
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +4 -1
  70. data/ext/pg_query/include/catalog/pg_depend.h +11 -7
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +3 -1
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +9 -3
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +3 -1
  74. data/ext/pg_query/include/catalog/pg_index.h +17 -7
  75. data/ext/pg_query/include/catalog/pg_index_d.h +20 -17
  76. data/ext/pg_query/include/catalog/pg_language.h +10 -5
  77. data/ext/pg_query/include/catalog/pg_language_d.h +3 -1
  78. data/ext/pg_query/include/catalog/pg_namespace.h +7 -2
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +3 -1
  80. data/ext/pg_query/include/catalog/pg_opclass.h +8 -5
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +3 -1
  82. data/ext/pg_query/include/catalog/pg_operator.h +21 -16
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +37 -1
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +6 -3
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +3 -1
  86. data/ext/pg_query/include/catalog/pg_parameter_acl.h +60 -0
  87. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +34 -0
  88. data/ext/pg_query/include/catalog/pg_partitioned_table.h +20 -9
  89. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +2 -1
  90. data/ext/pg_query/include/catalog/pg_proc.h +20 -11
  91. data/ext/pg_query/include/catalog/pg_proc_d.h +10 -8
  92. data/ext/pg_query/include/catalog/pg_publication.h +50 -4
  93. data/ext/pg_query/include/catalog/pg_publication_d.h +3 -1
  94. data/ext/pg_query/include/catalog/pg_replication_origin.h +6 -1
  95. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +5 -1
  96. data/ext/pg_query/include/catalog/pg_statistic.h +19 -12
  97. data/ext/pg_query/include/catalog/pg_statistic_d.h +2 -1
  98. data/ext/pg_query/include/catalog/pg_statistic_ext.h +19 -5
  99. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +7 -2
  100. data/ext/pg_query/include/catalog/pg_transform.h +8 -5
  101. data/ext/pg_query/include/catalog/pg_transform_d.h +3 -1
  102. data/ext/pg_query/include/catalog/pg_trigger.h +24 -8
  103. data/ext/pg_query/include/catalog/pg_trigger_d.h +4 -1
  104. data/ext/pg_query/include/catalog/pg_ts_config.h +6 -3
  105. data/ext/pg_query/include/catalog/pg_ts_config_d.h +3 -1
  106. data/ext/pg_query/include/catalog/pg_ts_dict.h +8 -3
  107. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +3 -1
  108. data/ext/pg_query/include/catalog/pg_ts_parser.h +6 -3
  109. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +3 -1
  110. data/ext/pg_query/include/catalog/pg_ts_template.h +6 -3
  111. data/ext/pg_query/include/catalog/pg_ts_template_d.h +3 -1
  112. data/ext/pg_query/include/catalog/pg_type.h +56 -24
  113. data/ext/pg_query/include/catalog/pg_type_d.h +70 -31
  114. data/ext/pg_query/include/catalog/storage.h +5 -3
  115. data/ext/pg_query/include/commands/async.h +4 -5
  116. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  117. data/ext/pg_query/include/commands/defrem.h +11 -24
  118. data/ext/pg_query/include/commands/event_trigger.h +2 -2
  119. data/ext/pg_query/include/commands/explain.h +1 -1
  120. data/ext/pg_query/include/commands/prepare.h +1 -1
  121. data/ext/pg_query/include/commands/tablespace.h +3 -1
  122. data/ext/pg_query/include/commands/trigger.h +27 -17
  123. data/ext/pg_query/include/commands/user.h +2 -2
  124. data/ext/pg_query/include/commands/vacuum.h +88 -41
  125. data/ext/pg_query/include/commands/variable.h +1 -1
  126. data/ext/pg_query/include/common/file_perm.h +4 -4
  127. data/ext/pg_query/include/common/hashfn.h +1 -1
  128. data/ext/pg_query/include/common/ip.h +1 -7
  129. data/ext/pg_query/include/common/keywords.h +2 -6
  130. data/ext/pg_query/include/common/kwlookup.h +1 -1
  131. data/ext/pg_query/include/common/pg_prng.h +60 -0
  132. data/ext/pg_query/include/common/relpath.h +2 -2
  133. data/ext/pg_query/include/common/string.h +24 -1
  134. data/ext/pg_query/include/common/unicode_combining_table.h +114 -2
  135. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +125 -0
  136. data/ext/pg_query/include/datatype/timestamp.h +40 -1
  137. data/ext/pg_query/include/executor/execdesc.h +1 -1
  138. data/ext/pg_query/include/executor/executor.h +65 -22
  139. data/ext/pg_query/include/executor/functions.h +17 -3
  140. data/ext/pg_query/include/executor/instrument.h +33 -16
  141. data/ext/pg_query/include/executor/spi.h +41 -3
  142. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  143. data/ext/pg_query/include/executor/tuptable.h +1 -1
  144. data/ext/pg_query/include/fmgr.h +13 -7
  145. data/ext/pg_query/include/funcapi.h +16 -4
  146. data/ext/pg_query/include/getaddrinfo.h +1 -1
  147. data/ext/pg_query/include/jit/jit.h +11 -11
  148. data/ext/pg_query/include/kwlist_d.h +517 -494
  149. data/ext/pg_query/include/lib/dshash.h +112 -0
  150. data/ext/pg_query/include/lib/ilist.h +20 -1
  151. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  152. data/ext/pg_query/include/lib/simplehash.h +150 -25
  153. data/ext/pg_query/include/lib/sort_template.h +432 -0
  154. data/ext/pg_query/include/lib/stringinfo.h +1 -1
  155. data/ext/pg_query/include/libpq/auth.h +6 -4
  156. data/ext/pg_query/include/libpq/crypt.h +5 -4
  157. data/ext/pg_query/include/libpq/hba.h +43 -4
  158. data/ext/pg_query/include/libpq/libpq-be.h +23 -6
  159. data/ext/pg_query/include/libpq/libpq.h +31 -20
  160. data/ext/pg_query/include/libpq/pqcomm.h +17 -31
  161. data/ext/pg_query/include/libpq/pqformat.h +1 -1
  162. data/ext/pg_query/include/libpq/pqsignal.h +4 -4
  163. data/ext/pg_query/include/mb/pg_wchar.h +106 -23
  164. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  165. data/ext/pg_query/include/miscadmin.h +71 -52
  166. data/ext/pg_query/include/nodes/bitmapset.h +1 -1
  167. data/ext/pg_query/include/nodes/execnodes.h +272 -80
  168. data/ext/pg_query/include/nodes/extensible.h +4 -2
  169. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  170. data/ext/pg_query/include/nodes/makefuncs.h +7 -6
  171. data/ext/pg_query/include/nodes/memnodes.h +5 -3
  172. data/ext/pg_query/include/nodes/nodeFuncs.h +1 -1
  173. data/ext/pg_query/include/nodes/nodes.h +30 -11
  174. data/ext/pg_query/include/nodes/params.h +1 -1
  175. data/ext/pg_query/include/nodes/parsenodes.h +327 -94
  176. data/ext/pg_query/include/nodes/pathnodes.h +245 -67
  177. data/ext/pg_query/include/nodes/pg_list.h +75 -68
  178. data/ext/pg_query/include/nodes/plannodes.h +128 -30
  179. data/ext/pg_query/include/nodes/primnodes.h +99 -47
  180. data/ext/pg_query/include/nodes/print.h +1 -1
  181. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  182. data/ext/pg_query/include/nodes/value.h +58 -39
  183. data/ext/pg_query/include/optimizer/cost.h +9 -2
  184. data/ext/pg_query/include/optimizer/geqo.h +9 -7
  185. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  186. data/ext/pg_query/include/optimizer/optimizer.h +25 -22
  187. data/ext/pg_query/include/optimizer/paths.h +6 -6
  188. data/ext/pg_query/include/optimizer/planmain.h +15 -14
  189. data/ext/pg_query/include/parser/analyze.h +19 -5
  190. data/ext/pg_query/include/parser/gram.h +947 -913
  191. data/ext/pg_query/include/parser/gramparse.h +1 -1
  192. data/ext/pg_query/include/parser/kwlist.h +463 -453
  193. data/ext/pg_query/include/parser/parse_agg.h +2 -7
  194. data/ext/pg_query/include/parser/parse_coerce.h +4 -1
  195. data/ext/pg_query/include/parser/parse_expr.h +2 -3
  196. data/ext/pg_query/include/parser/parse_func.h +2 -1
  197. data/ext/pg_query/include/parser/parse_node.h +21 -9
  198. data/ext/pg_query/include/parser/parse_oper.h +1 -3
  199. data/ext/pg_query/include/parser/parse_relation.h +5 -4
  200. data/ext/pg_query/include/parser/parse_type.h +1 -1
  201. data/ext/pg_query/include/parser/parser.h +31 -4
  202. data/ext/pg_query/include/parser/parsetree.h +1 -1
  203. data/ext/pg_query/include/parser/scanner.h +1 -1
  204. data/ext/pg_query/include/parser/scansup.h +2 -5
  205. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  206. data/ext/pg_query/include/pg_config.h +94 -46
  207. data/ext/pg_query/include/pg_config_manual.h +74 -21
  208. data/ext/pg_query/include/pg_getopt.h +6 -6
  209. data/ext/pg_query/include/pg_query.h +5 -4
  210. data/ext/pg_query/include/pg_query_enum_defs.c +358 -241
  211. data/ext/pg_query/include/pg_query_fingerprint_conds.c +44 -7
  212. data/ext/pg_query/include/pg_query_fingerprint_defs.c +1220 -422
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +43 -13
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +152 -26
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +11 -2
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +174 -30
  217. data/ext/pg_query/include/pg_trace.h +1 -1
  218. data/ext/pg_query/include/pgstat.h +449 -1237
  219. data/ext/pg_query/include/pgtime.h +14 -4
  220. data/ext/pg_query/include/pl_gram.h +126 -128
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +10 -10
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -3
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +54 -56
  225. data/ext/pg_query/include/plerrcodes.h +9 -1
  226. data/ext/pg_query/include/plpgsql.h +52 -54
  227. data/ext/pg_query/include/port/atomics/arch-arm.h +7 -1
  228. data/ext/pg_query/include/port/atomics/arch-ppc.h +1 -1
  229. data/ext/pg_query/include/port/atomics/arch-x86.h +1 -1
  230. data/ext/pg_query/include/port/atomics/fallback.h +1 -1
  231. data/ext/pg_query/include/port/atomics/generic-gcc.h +3 -3
  232. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  233. data/ext/pg_query/include/port/atomics.h +1 -1
  234. data/ext/pg_query/include/port/pg_bitutils.h +88 -12
  235. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  236. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  237. data/ext/pg_query/include/port.h +72 -43
  238. data/ext/pg_query/include/portability/instr_time.h +1 -1
  239. data/ext/pg_query/include/postgres.h +60 -16
  240. data/ext/pg_query/include/postmaster/autovacuum.h +17 -17
  241. data/ext/pg_query/include/postmaster/auxprocess.h +20 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +2 -1
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +2 -2
  244. data/ext/pg_query/include/postmaster/bgwriter.h +5 -5
  245. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  246. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  247. data/ext/pg_query/include/postmaster/pgarch.h +42 -8
  248. data/ext/pg_query/include/postmaster/postmaster.h +18 -17
  249. data/ext/pg_query/include/postmaster/startup.h +39 -0
  250. data/ext/pg_query/include/postmaster/syslogger.h +15 -10
  251. data/ext/pg_query/include/postmaster/walwriter.h +3 -3
  252. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +1422 -916
  253. data/ext/pg_query/include/protobuf/pg_query.pb.h +43678 -32769
  254. data/ext/pg_query/include/regex/regex.h +18 -16
  255. data/ext/pg_query/include/replication/logicallauncher.h +3 -5
  256. data/ext/pg_query/include/replication/logicalproto.h +161 -17
  257. data/ext/pg_query/include/replication/logicalworker.h +1 -1
  258. data/ext/pg_query/include/replication/origin.h +7 -7
  259. data/ext/pg_query/include/replication/reorderbuffer.h +262 -44
  260. data/ext/pg_query/include/replication/slot.h +23 -12
  261. data/ext/pg_query/include/replication/syncrep.h +5 -5
  262. data/ext/pg_query/include/replication/walreceiver.h +145 -13
  263. data/ext/pg_query/include/replication/walsender.h +8 -8
  264. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  265. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -3
  266. data/ext/pg_query/include/rewrite/rewriteManip.h +1 -1
  267. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  268. data/ext/pg_query/include/storage/backendid.h +3 -3
  269. data/ext/pg_query/include/storage/block.h +4 -10
  270. data/ext/pg_query/include/storage/buf.h +1 -1
  271. data/ext/pg_query/include/storage/bufmgr.h +19 -14
  272. data/ext/pg_query/include/storage/bufpage.h +6 -8
  273. data/ext/pg_query/include/storage/condition_variable.h +13 -2
  274. data/ext/pg_query/include/storage/dsm.h +4 -1
  275. data/ext/pg_query/include/storage/dsm_impl.h +3 -2
  276. data/ext/pg_query/include/storage/fd.h +33 -3
  277. data/ext/pg_query/include/storage/fileset.h +40 -0
  278. data/ext/pg_query/include/storage/ipc.h +4 -1
  279. data/ext/pg_query/include/storage/item.h +1 -1
  280. data/ext/pg_query/include/storage/itemid.h +1 -1
  281. data/ext/pg_query/include/storage/itemptr.h +3 -1
  282. data/ext/pg_query/include/storage/large_object.h +2 -2
  283. data/ext/pg_query/include/storage/latch.h +9 -13
  284. data/ext/pg_query/include/storage/lmgr.h +2 -1
  285. data/ext/pg_query/include/storage/lock.h +17 -13
  286. data/ext/pg_query/include/storage/lockdefs.h +2 -2
  287. data/ext/pg_query/include/storage/lwlock.h +6 -32
  288. data/ext/pg_query/include/storage/lwlocknames.h +0 -1
  289. data/ext/pg_query/include/storage/off.h +1 -1
  290. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  291. data/ext/pg_query/include/storage/pg_shmem.h +9 -7
  292. data/ext/pg_query/include/storage/pmsignal.h +15 -4
  293. data/ext/pg_query/include/storage/predicate.h +4 -4
  294. data/ext/pg_query/include/storage/proc.h +183 -55
  295. data/ext/pg_query/include/storage/procarray.h +98 -0
  296. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  297. data/ext/pg_query/include/storage/procsignal.h +3 -7
  298. data/ext/pg_query/include/storage/relfilenode.h +1 -1
  299. data/ext/pg_query/include/storage/s_lock.h +67 -4
  300. data/ext/pg_query/include/storage/sharedfileset.h +3 -11
  301. data/ext/pg_query/include/storage/shm_mq.h +5 -4
  302. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  303. data/ext/pg_query/include/storage/shmem.h +1 -1
  304. data/ext/pg_query/include/storage/sinval.h +3 -3
  305. data/ext/pg_query/include/storage/sinvaladt.h +1 -1
  306. data/ext/pg_query/include/storage/smgr.h +10 -8
  307. data/ext/pg_query/include/storage/spin.h +2 -2
  308. data/ext/pg_query/include/storage/standby.h +13 -6
  309. data/ext/pg_query/include/storage/standbydefs.h +2 -2
  310. data/ext/pg_query/include/storage/sync.h +7 -3
  311. data/ext/pg_query/include/tcop/cmdtag.h +1 -1
  312. data/ext/pg_query/include/tcop/cmdtaglist.h +3 -2
  313. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  314. data/ext/pg_query/include/tcop/dest.h +1 -1
  315. data/ext/pg_query/include/tcop/fastpath.h +1 -2
  316. data/ext/pg_query/include/tcop/pquery.h +7 -1
  317. data/ext/pg_query/include/tcop/tcopprot.h +19 -11
  318. data/ext/pg_query/include/tcop/utility.h +7 -3
  319. data/ext/pg_query/include/tsearch/ts_cache.h +2 -2
  320. data/ext/pg_query/include/utils/acl.h +24 -3
  321. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  322. data/ext/pg_query/include/utils/array.h +7 -2
  323. data/ext/pg_query/include/utils/backend_progress.h +44 -0
  324. data/ext/pg_query/include/utils/backend_status.h +321 -0
  325. data/ext/pg_query/include/utils/builtins.h +11 -11
  326. data/ext/pg_query/include/utils/bytea.h +3 -2
  327. data/ext/pg_query/include/utils/catcache.h +1 -1
  328. data/ext/pg_query/include/utils/date.h +1 -1
  329. data/ext/pg_query/include/utils/datetime.h +8 -7
  330. data/ext/pg_query/include/utils/datum.h +9 -1
  331. data/ext/pg_query/include/utils/dsa.h +1 -1
  332. data/ext/pg_query/include/utils/dynahash.h +4 -3
  333. data/ext/pg_query/include/utils/elog.h +52 -21
  334. data/ext/pg_query/include/utils/errcodes.h +2 -0
  335. data/ext/pg_query/include/utils/expandeddatum.h +1 -1
  336. data/ext/pg_query/include/utils/expandedrecord.h +1 -1
  337. data/ext/pg_query/include/utils/float.h +7 -7
  338. data/ext/pg_query/include/utils/fmgroids.h +1300 -696
  339. data/ext/pg_query/include/utils/fmgrprotos.h +199 -16
  340. data/ext/pg_query/include/utils/fmgrtab.h +6 -5
  341. data/ext/pg_query/include/utils/guc.h +69 -43
  342. data/ext/pg_query/include/utils/guc_tables.h +23 -19
  343. data/ext/pg_query/include/utils/hsearch.h +15 -11
  344. data/ext/pg_query/include/utils/inval.h +5 -1
  345. data/ext/pg_query/include/utils/lsyscache.h +11 -1
  346. data/ext/pg_query/include/utils/memdebug.h +1 -1
  347. data/ext/pg_query/include/utils/memutils.h +8 -3
  348. data/ext/pg_query/include/utils/numeric.h +19 -5
  349. data/ext/pg_query/include/utils/palloc.h +25 -3
  350. data/ext/pg_query/include/utils/partcache.h +1 -1
  351. data/ext/pg_query/include/utils/pg_locale.h +17 -9
  352. data/ext/pg_query/include/utils/pg_lsn.h +1 -1
  353. data/ext/pg_query/include/utils/pgstat_internal.h +784 -0
  354. data/ext/pg_query/include/utils/pidfile.h +1 -1
  355. data/ext/pg_query/include/utils/plancache.h +6 -5
  356. data/ext/pg_query/include/utils/portal.h +12 -1
  357. data/ext/pg_query/include/utils/ps_status.h +1 -1
  358. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  359. data/ext/pg_query/include/utils/queryjumble.h +88 -0
  360. data/ext/pg_query/include/utils/regproc.h +14 -3
  361. data/ext/pg_query/include/utils/rel.h +71 -20
  362. data/ext/pg_query/include/utils/relcache.h +9 -7
  363. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  364. data/ext/pg_query/include/utils/resowner.h +1 -1
  365. data/ext/pg_query/include/utils/rls.h +2 -2
  366. data/ext/pg_query/include/utils/ruleutils.h +4 -1
  367. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  368. data/ext/pg_query/include/utils/snapmgr.h +35 -14
  369. data/ext/pg_query/include/utils/snapshot.h +14 -1
  370. data/ext/pg_query/include/utils/sortsupport.h +117 -2
  371. data/ext/pg_query/include/utils/syscache.h +6 -1
  372. data/ext/pg_query/include/utils/timeout.h +11 -4
  373. data/ext/pg_query/include/utils/timestamp.h +6 -5
  374. data/ext/pg_query/include/utils/tuplesort.h +25 -11
  375. data/ext/pg_query/include/utils/tuplestore.h +2 -2
  376. data/ext/pg_query/include/utils/typcache.h +24 -17
  377. data/ext/pg_query/include/utils/tzparser.h +1 -1
  378. data/ext/pg_query/include/utils/varlena.h +5 -3
  379. data/ext/pg_query/include/utils/wait_event.h +289 -0
  380. data/ext/pg_query/include/utils/xml.h +4 -4
  381. data/ext/pg_query/pg_query.pb-c.c +4318 -2307
  382. data/ext/pg_query/pg_query_deparse.c +1114 -381
  383. data/ext/pg_query/pg_query_fingerprint.c +46 -10
  384. data/ext/pg_query/pg_query_fingerprint.h +3 -1
  385. data/ext/pg_query/pg_query_json_plpgsql.c +55 -12
  386. data/ext/pg_query/pg_query_normalize.c +163 -20
  387. data/ext/pg_query/pg_query_outfuncs.h +1 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +65 -16
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +70 -10
  390. data/ext/pg_query/pg_query_parse.c +1 -1
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +79 -16
  392. data/ext/pg_query/pg_query_readfuncs_protobuf.c +42 -8
  393. data/ext/pg_query/pg_query_ruby.c +1 -1
  394. data/ext/pg_query/pg_query_scan.c +2 -1
  395. data/ext/pg_query/pg_query_split.c +3 -2
  396. data/ext/pg_query/src_backend_catalog_namespace.c +21 -9
  397. data/ext/pg_query/src_backend_catalog_pg_proc.c +4 -1
  398. data/ext/pg_query/src_backend_commands_define.c +11 -1
  399. data/ext/pg_query/src_backend_nodes_bitmapset.c +3 -1
  400. data/ext/pg_query/src_backend_nodes_copyfuncs.c +424 -109
  401. data/ext/pg_query/src_backend_nodes_equalfuncs.c +291 -46
  402. data/ext/pg_query/src_backend_nodes_extensible.c +1 -1
  403. data/ext/pg_query/src_backend_nodes_list.c +86 -11
  404. data/ext/pg_query/src_backend_nodes_makefuncs.c +5 -4
  405. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +55 -12
  406. data/ext/pg_query/src_backend_nodes_value.c +28 -19
  407. data/ext/pg_query/src_backend_parser_gram.c +33890 -31262
  408. data/ext/pg_query/src_backend_parser_parser.c +26 -7
  409. data/ext/pg_query/src_backend_parser_scan.c +644 -441
  410. data/ext/pg_query/src_backend_parser_scansup.c +4 -28
  411. data/ext/pg_query/src_backend_postmaster_postmaster.c +77 -106
  412. data/ext/pg_query/src_backend_storage_ipc_ipc.c +13 -4
  413. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +5 -4
  414. data/ext/pg_query/src_backend_tcop_postgres.c +73 -24
  415. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +140 -0
  416. data/ext/pg_query/src_backend_utils_adt_datum.c +13 -1
  417. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  418. data/ext/pg_query/src_backend_utils_adt_format_type.c +6 -2
  419. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +109 -15
  420. data/ext/pg_query/src_backend_utils_error_assert.c +16 -14
  421. data/ext/pg_query/src_backend_utils_error_elog.c +172 -99
  422. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +12 -17
  423. data/ext/pg_query/src_backend_utils_hash_dynahash.c +40 -10
  424. data/ext/pg_query/src_backend_utils_init_globals.c +5 -5
  425. data/ext/pg_query/src_backend_utils_mb_mbutils.c +55 -66
  426. data/ext/pg_query/src_backend_utils_misc_guc.c +207 -45
  427. data/ext/pg_query/src_backend_utils_mmgr_aset.c +7 -5
  428. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +123 -35
  429. data/ext/pg_query/src_common_encnames.c +1 -1
  430. data/ext/pg_query/src_common_hashfn.c +3 -3
  431. data/ext/pg_query/src_common_keywords.c +15 -2
  432. data/ext/pg_query/src_common_kwlist_d.h +517 -494
  433. data/ext/pg_query/src_common_kwlookup.c +1 -1
  434. data/ext/pg_query/src_common_pg_prng.c +152 -0
  435. data/ext/pg_query/src_common_psprintf.c +1 -1
  436. data/ext/pg_query/src_common_string.c +7 -1
  437. data/ext/pg_query/src_common_stringinfo.c +1 -1
  438. data/ext/pg_query/src_common_wchar.c +712 -109
  439. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +49 -22
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +1 -18
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +1235 -1261
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +10 -10
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +2 -2
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +54 -56
  446. data/ext/pg_query/src_port_pg_bitutils.c +41 -52
  447. data/ext/pg_query/src_port_pgsleep.c +1 -1
  448. data/ext/pg_query/src_port_pgstrcasecmp.c +1 -1
  449. data/ext/pg_query/src_port_qsort.c +12 -224
  450. data/ext/pg_query/src_port_snprintf.c +46 -20
  451. data/ext/pg_query/src_port_strerror.c +9 -19
  452. data/ext/pg_query/src_port_strnlen.c +1 -1
  453. data/lib/pg_query/deparse.rb +7 -1
  454. data/lib/pg_query/filter_columns.rb +6 -4
  455. data/lib/pg_query/fingerprint.rb +18 -3
  456. data/lib/pg_query/node.rb +2 -2
  457. data/lib/pg_query/param_refs.rb +1 -1
  458. data/lib/pg_query/parse.rb +87 -51
  459. data/lib/pg_query/pg_query_pb.rb +1109 -942
  460. data/lib/pg_query/treewalker.rb +6 -0
  461. data/lib/pg_query/truncate.rb +54 -8
  462. data/lib/pg_query/version.rb +1 -1
  463. metadata +29 -18
  464. data/ext/pg_query/include/access/xloginsert.h +0 -64
  465. data/ext/pg_query/include/bootstrap/bootstrap.h +0 -62
  466. data/ext/pg_query/include/parser/parse_clause.h +0 -54
  467. data/ext/pg_query/include/parser/parse_collate.h +0 -27
  468. data/ext/pg_query/include/parser/parse_target.h +0 -46
  469. data/ext/pg_query/src_backend_libpq_pqcomm.c +0 -651
  470. data/ext/pg_query/src_backend_parser_parse_expr.c +0 -313
  471. data/ext/pg_query/src_port_erand48.c +0 -127
  472. data/ext/pg_query/src_port_random.c +0 -31
@@ -0,0 +1,432 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * sort_template.h
4
+ *
5
+ * A template for a sort algorithm that supports varying degrees of
6
+ * specialization.
7
+ *
8
+ * Copyright (c) 2021-2022, PostgreSQL Global Development Group
9
+ * Portions Copyright (c) 1992-1994, Regents of the University of California
10
+ *
11
+ * Usage notes:
12
+ *
13
+ * To generate functions specialized for a type, the following parameter
14
+ * macros should be #define'd before this file is included.
15
+ *
16
+ * - ST_SORT - the name of a sort function to be generated
17
+ * - ST_ELEMENT_TYPE - type of the referenced elements
18
+ * - ST_DECLARE - if defined the functions and types are declared
19
+ * - ST_DEFINE - if defined the functions and types are defined
20
+ * - ST_SCOPE - scope (e.g. extern, static inline) for functions
21
+ * - ST_CHECK_FOR_INTERRUPTS - if defined the sort is interruptible
22
+ *
23
+ * Instead of ST_ELEMENT_TYPE, ST_ELEMENT_TYPE_VOID can be defined. Then
24
+ * the generated functions will automatically gain an "element_size"
25
+ * parameter. This allows us to generate a traditional qsort function.
26
+ *
27
+ * One of the following macros must be defined, to show how to compare
28
+ * elements. The first two options are arbitrary expressions depending
29
+ * on whether an extra pass-through argument is desired, and the third
30
+ * option should be defined if the sort function should receive a
31
+ * function pointer at runtime.
32
+ *
33
+ * - ST_COMPARE(a, b) - a simple comparison expression
34
+ * - ST_COMPARE(a, b, arg) - variant that takes an extra argument
35
+ * - ST_COMPARE_RUNTIME_POINTER - sort function takes a function pointer
36
+ *
37
+ * To say that the comparator and therefore also sort function should
38
+ * receive an extra pass-through argument, specify the type of the
39
+ * argument.
40
+ *
41
+ * - ST_COMPARE_ARG_TYPE - type of extra argument
42
+ *
43
+ * The prototype of the generated sort function is:
44
+ *
45
+ * void ST_SORT(ST_ELEMENT_TYPE *data, size_t n,
46
+ * [size_t element_size,]
47
+ * [ST_SORT_compare_function compare,]
48
+ * [ST_COMPARE_ARG_TYPE *arg]);
49
+ *
50
+ * ST_SORT_compare_function is a function pointer of the following type:
51
+ *
52
+ * int (*)(const ST_ELEMENT_TYPE *a, const ST_ELEMENT_TYPE *b,
53
+ * [ST_COMPARE_ARG_TYPE *arg])
54
+ *
55
+ * HISTORY
56
+ *
57
+ * Modifications from vanilla NetBSD source:
58
+ * - Add do ... while() macro fix
59
+ * - Remove __inline, _DIAGASSERTs, __P
60
+ * - Remove ill-considered "swap_cnt" switch to insertion sort, in favor
61
+ * of a simple check for presorted input.
62
+ * - Take care to recurse on the smaller partition, to bound stack usage
63
+ * - Convert into a header that can generate specialized functions
64
+ *
65
+ * IDENTIFICATION
66
+ * src/include/lib/sort_template.h
67
+ *
68
+ *-------------------------------------------------------------------------
69
+ */
70
+
71
+ /* $NetBSD: qsort.c,v 1.13 2003/08/07 16:43:42 agc Exp $ */
72
+
73
+ /*-
74
+ * Copyright (c) 1992, 1993
75
+ * The Regents of the University of California. All rights reserved.
76
+ *
77
+ * Redistribution and use in source and binary forms, with or without
78
+ * modification, are permitted provided that the following conditions
79
+ * are met:
80
+ * 1. Redistributions of source code must retain the above copyright
81
+ * notice, this list of conditions and the following disclaimer.
82
+ * 2. Redistributions in binary form must reproduce the above copyright
83
+ * notice, this list of conditions and the following disclaimer in the
84
+ * documentation and/or other materials provided with the distribution.
85
+ * 3. Neither the name of the University nor the names of its contributors
86
+ * may be used to endorse or promote products derived from this software
87
+ * without specific prior written permission.
88
+ *
89
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
90
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
91
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
92
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
93
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
94
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
95
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
96
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
97
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
98
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
99
+ * SUCH DAMAGE.
100
+ */
101
+
102
+ /*
103
+ * Qsort routine based on J. L. Bentley and M. D. McIlroy,
104
+ * "Engineering a sort function",
105
+ * Software--Practice and Experience 23 (1993) 1249-1265.
106
+ *
107
+ * We have modified their original by adding a check for already-sorted
108
+ * input, which seems to be a win per discussions on pgsql-hackers around
109
+ * 2006-03-21.
110
+ *
111
+ * Also, we recurse on the smaller partition and iterate on the larger one,
112
+ * which ensures we cannot recurse more than log(N) levels (since the
113
+ * partition recursed to is surely no more than half of the input). Bentley
114
+ * and McIlroy explicitly rejected doing this on the grounds that it's "not
115
+ * worth the effort", but we have seen crashes in the field due to stack
116
+ * overrun, so that judgment seems wrong.
117
+ */
118
+
119
+ #define ST_MAKE_PREFIX(a) CppConcat(a,_)
120
+ #define ST_MAKE_NAME(a,b) ST_MAKE_NAME_(ST_MAKE_PREFIX(a),b)
121
+ #define ST_MAKE_NAME_(a,b) CppConcat(a,b)
122
+
123
+ /*
124
+ * If the element type is void, we'll also need an element_size argument
125
+ * because we don't know the size.
126
+ */
127
+ #ifdef ST_ELEMENT_TYPE_VOID
128
+ #define ST_ELEMENT_TYPE void
129
+ #define ST_SORT_PROTO_ELEMENT_SIZE , size_t element_size
130
+ #define ST_SORT_INVOKE_ELEMENT_SIZE , element_size
131
+ #else
132
+ #define ST_SORT_PROTO_ELEMENT_SIZE
133
+ #define ST_SORT_INVOKE_ELEMENT_SIZE
134
+ #endif
135
+
136
+ /*
137
+ * If the user wants to be able to pass in compare functions at runtime,
138
+ * we'll need to make that an argument of the sort and med3 functions.
139
+ */
140
+ #ifdef ST_COMPARE_RUNTIME_POINTER
141
+ /*
142
+ * The type of the comparator function pointer that ST_SORT will take, unless
143
+ * you've already declared a type name manually and want to use that instead of
144
+ * having a new one defined.
145
+ */
146
+ #ifndef ST_COMPARATOR_TYPE_NAME
147
+ #define ST_COMPARATOR_TYPE_NAME ST_MAKE_NAME(ST_SORT, compare_function)
148
+ #endif
149
+ #define ST_COMPARE compare
150
+ #ifndef ST_COMPARE_ARG_TYPE
151
+ #define ST_SORT_PROTO_COMPARE , ST_COMPARATOR_TYPE_NAME compare
152
+ #define ST_SORT_INVOKE_COMPARE , compare
153
+ #else
154
+ #define ST_SORT_PROTO_COMPARE , ST_COMPARATOR_TYPE_NAME compare
155
+ #define ST_SORT_INVOKE_COMPARE , compare
156
+ #endif
157
+ #else
158
+ #define ST_SORT_PROTO_COMPARE
159
+ #define ST_SORT_INVOKE_COMPARE
160
+ #endif
161
+
162
+ /*
163
+ * If the user wants to use a compare function or expression that takes an
164
+ * extra argument, we'll need to make that an argument of the sort, compare and
165
+ * med3 functions.
166
+ */
167
+ #ifdef ST_COMPARE_ARG_TYPE
168
+ #define ST_SORT_PROTO_ARG , ST_COMPARE_ARG_TYPE *arg
169
+ #define ST_SORT_INVOKE_ARG , arg
170
+ #else
171
+ #define ST_SORT_PROTO_ARG
172
+ #define ST_SORT_INVOKE_ARG
173
+ #endif
174
+
175
+ #ifdef ST_DECLARE
176
+
177
+ #ifdef ST_COMPARE_RUNTIME_POINTER
178
+ typedef int (*ST_COMPARATOR_TYPE_NAME) (const ST_ELEMENT_TYPE *,
179
+ const ST_ELEMENT_TYPE * ST_SORT_PROTO_ARG);
180
+ #endif
181
+
182
+ /* Declare the sort function. Note optional arguments at end. */
183
+ ST_SCOPE void ST_SORT(ST_ELEMENT_TYPE * first, size_t n
184
+ ST_SORT_PROTO_ELEMENT_SIZE
185
+ ST_SORT_PROTO_COMPARE
186
+ ST_SORT_PROTO_ARG);
187
+
188
+ #endif
189
+
190
+ #ifdef ST_DEFINE
191
+
192
+ /* sort private helper functions */
193
+ #define ST_MED3 ST_MAKE_NAME(ST_SORT, med3)
194
+ #define ST_SWAP ST_MAKE_NAME(ST_SORT, swap)
195
+ #define ST_SWAPN ST_MAKE_NAME(ST_SORT, swapn)
196
+
197
+ /* Users expecting to run very large sorts may need them to be interruptible. */
198
+ #ifdef ST_CHECK_FOR_INTERRUPTS
199
+ #define DO_CHECK_FOR_INTERRUPTS() CHECK_FOR_INTERRUPTS()
200
+ #else
201
+ #define DO_CHECK_FOR_INTERRUPTS()
202
+ #endif
203
+
204
+ /*
205
+ * Create wrapper macros that know how to invoke compare, med3 and sort with
206
+ * the right arguments.
207
+ */
208
+ #ifdef ST_COMPARE_RUNTIME_POINTER
209
+ #define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_) ST_SORT_INVOKE_ARG)
210
+ #elif defined(ST_COMPARE_ARG_TYPE)
211
+ #define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_), arg)
212
+ #else
213
+ #define DO_COMPARE(a_, b_) ST_COMPARE((a_), (b_))
214
+ #endif
215
+ #define DO_MED3(a_, b_, c_) \
216
+ ST_MED3((a_), (b_), (c_) \
217
+ ST_SORT_INVOKE_COMPARE \
218
+ ST_SORT_INVOKE_ARG)
219
+ #define DO_SORT(a_, n_) \
220
+ ST_SORT((a_), (n_) \
221
+ ST_SORT_INVOKE_ELEMENT_SIZE \
222
+ ST_SORT_INVOKE_COMPARE \
223
+ ST_SORT_INVOKE_ARG)
224
+
225
+ /*
226
+ * If we're working with void pointers, we'll use pointer arithmetic based on
227
+ * uint8, and use the runtime element_size to step through the array and swap
228
+ * elements. Otherwise we'll work with ST_ELEMENT_TYPE.
229
+ */
230
+ #ifndef ST_ELEMENT_TYPE_VOID
231
+ #define ST_POINTER_TYPE ST_ELEMENT_TYPE
232
+ #define ST_POINTER_STEP 1
233
+ #define DO_SWAPN(a_, b_, n_) ST_SWAPN((a_), (b_), (n_))
234
+ #define DO_SWAP(a_, b_) ST_SWAP((a_), (b_))
235
+ #else
236
+ #define ST_POINTER_TYPE uint8
237
+ #define ST_POINTER_STEP element_size
238
+ #define DO_SWAPN(a_, b_, n_) ST_SWAPN((a_), (b_), (n_))
239
+ #define DO_SWAP(a_, b_) DO_SWAPN((a_), (b_), element_size)
240
+ #endif
241
+
242
+ /*
243
+ * Find the median of three values. Currently, performance seems to be best
244
+ * if the comparator is inlined here, but the med3 function is not inlined
245
+ * in the qsort function.
246
+ */
247
+ static pg_noinline ST_ELEMENT_TYPE *
248
+ ST_MED3(ST_ELEMENT_TYPE * a,
249
+ ST_ELEMENT_TYPE * b,
250
+ ST_ELEMENT_TYPE * c
251
+ ST_SORT_PROTO_COMPARE
252
+ ST_SORT_PROTO_ARG)
253
+ {
254
+ return DO_COMPARE(a, b) < 0 ?
255
+ (DO_COMPARE(b, c) < 0 ? b : (DO_COMPARE(a, c) < 0 ? c : a))
256
+ : (DO_COMPARE(b, c) > 0 ? b : (DO_COMPARE(a, c) < 0 ? a : c));
257
+ }
258
+
259
+ static inline void
260
+ ST_SWAP(ST_POINTER_TYPE * a, ST_POINTER_TYPE * b)
261
+ {
262
+ ST_POINTER_TYPE tmp = *a;
263
+
264
+ *a = *b;
265
+ *b = tmp;
266
+ }
267
+
268
+ static inline void
269
+ ST_SWAPN(ST_POINTER_TYPE * a, ST_POINTER_TYPE * b, size_t n)
270
+ {
271
+ for (size_t i = 0; i < n; ++i)
272
+ ST_SWAP(&a[i], &b[i]);
273
+ }
274
+
275
+ /*
276
+ * Sort an array.
277
+ */
278
+ ST_SCOPE void
279
+ ST_SORT(ST_ELEMENT_TYPE * data, size_t n
280
+ ST_SORT_PROTO_ELEMENT_SIZE
281
+ ST_SORT_PROTO_COMPARE
282
+ ST_SORT_PROTO_ARG)
283
+ {
284
+ ST_POINTER_TYPE *a = (ST_POINTER_TYPE *) data,
285
+ *pa,
286
+ *pb,
287
+ *pc,
288
+ *pd,
289
+ *pl,
290
+ *pm,
291
+ *pn;
292
+ size_t d1,
293
+ d2;
294
+ int r,
295
+ presorted;
296
+
297
+ loop:
298
+ DO_CHECK_FOR_INTERRUPTS();
299
+ if (n < 7)
300
+ {
301
+ for (pm = a + ST_POINTER_STEP; pm < a + n * ST_POINTER_STEP;
302
+ pm += ST_POINTER_STEP)
303
+ for (pl = pm; pl > a && DO_COMPARE(pl - ST_POINTER_STEP, pl) > 0;
304
+ pl -= ST_POINTER_STEP)
305
+ DO_SWAP(pl, pl - ST_POINTER_STEP);
306
+ return;
307
+ }
308
+ presorted = 1;
309
+ for (pm = a + ST_POINTER_STEP; pm < a + n * ST_POINTER_STEP;
310
+ pm += ST_POINTER_STEP)
311
+ {
312
+ DO_CHECK_FOR_INTERRUPTS();
313
+ if (DO_COMPARE(pm - ST_POINTER_STEP, pm) > 0)
314
+ {
315
+ presorted = 0;
316
+ break;
317
+ }
318
+ }
319
+ if (presorted)
320
+ return;
321
+ pm = a + (n / 2) * ST_POINTER_STEP;
322
+ if (n > 7)
323
+ {
324
+ pl = a;
325
+ pn = a + (n - 1) * ST_POINTER_STEP;
326
+ if (n > 40)
327
+ {
328
+ size_t d = (n / 8) * ST_POINTER_STEP;
329
+
330
+ pl = DO_MED3(pl, pl + d, pl + 2 * d);
331
+ pm = DO_MED3(pm - d, pm, pm + d);
332
+ pn = DO_MED3(pn - 2 * d, pn - d, pn);
333
+ }
334
+ pm = DO_MED3(pl, pm, pn);
335
+ }
336
+ DO_SWAP(a, pm);
337
+ pa = pb = a + ST_POINTER_STEP;
338
+ pc = pd = a + (n - 1) * ST_POINTER_STEP;
339
+ for (;;)
340
+ {
341
+ while (pb <= pc && (r = DO_COMPARE(pb, a)) <= 0)
342
+ {
343
+ if (r == 0)
344
+ {
345
+ DO_SWAP(pa, pb);
346
+ pa += ST_POINTER_STEP;
347
+ }
348
+ pb += ST_POINTER_STEP;
349
+ DO_CHECK_FOR_INTERRUPTS();
350
+ }
351
+ while (pb <= pc && (r = DO_COMPARE(pc, a)) >= 0)
352
+ {
353
+ if (r == 0)
354
+ {
355
+ DO_SWAP(pc, pd);
356
+ pd -= ST_POINTER_STEP;
357
+ }
358
+ pc -= ST_POINTER_STEP;
359
+ DO_CHECK_FOR_INTERRUPTS();
360
+ }
361
+ if (pb > pc)
362
+ break;
363
+ DO_SWAP(pb, pc);
364
+ pb += ST_POINTER_STEP;
365
+ pc -= ST_POINTER_STEP;
366
+ }
367
+ pn = a + n * ST_POINTER_STEP;
368
+ d1 = Min(pa - a, pb - pa);
369
+ DO_SWAPN(a, pb - d1, d1);
370
+ d1 = Min(pd - pc, pn - pd - ST_POINTER_STEP);
371
+ DO_SWAPN(pb, pn - d1, d1);
372
+ d1 = pb - pa;
373
+ d2 = pd - pc;
374
+ if (d1 <= d2)
375
+ {
376
+ /* Recurse on left partition, then iterate on right partition */
377
+ if (d1 > ST_POINTER_STEP)
378
+ DO_SORT(a, d1 / ST_POINTER_STEP);
379
+ if (d2 > ST_POINTER_STEP)
380
+ {
381
+ /* Iterate rather than recurse to save stack space */
382
+ /* DO_SORT(pn - d2, d2 / ST_POINTER_STEP) */
383
+ a = pn - d2;
384
+ n = d2 / ST_POINTER_STEP;
385
+ goto loop;
386
+ }
387
+ }
388
+ else
389
+ {
390
+ /* Recurse on right partition, then iterate on left partition */
391
+ if (d2 > ST_POINTER_STEP)
392
+ DO_SORT(pn - d2, d2 / ST_POINTER_STEP);
393
+ if (d1 > ST_POINTER_STEP)
394
+ {
395
+ /* Iterate rather than recurse to save stack space */
396
+ /* DO_SORT(a, d1 / ST_POINTER_STEP) */
397
+ n = d1 / ST_POINTER_STEP;
398
+ goto loop;
399
+ }
400
+ }
401
+ }
402
+ #endif
403
+
404
+ #undef DO_CHECK_FOR_INTERRUPTS
405
+ #undef DO_COMPARE
406
+ #undef DO_MED3
407
+ #undef DO_SORT
408
+ #undef DO_SWAP
409
+ #undef DO_SWAPN
410
+ #undef ST_CHECK_FOR_INTERRUPTS
411
+ #undef ST_COMPARATOR_TYPE_NAME
412
+ #undef ST_COMPARE
413
+ #undef ST_COMPARE_ARG_TYPE
414
+ #undef ST_COMPARE_RUNTIME_POINTER
415
+ #undef ST_ELEMENT_TYPE
416
+ #undef ST_ELEMENT_TYPE_VOID
417
+ #undef ST_MAKE_NAME
418
+ #undef ST_MAKE_NAME_
419
+ #undef ST_MAKE_PREFIX
420
+ #undef ST_MED3
421
+ #undef ST_POINTER_STEP
422
+ #undef ST_POINTER_TYPE
423
+ #undef ST_SCOPE
424
+ #undef ST_SORT
425
+ #undef ST_SORT_INVOKE_ARG
426
+ #undef ST_SORT_INVOKE_COMPARE
427
+ #undef ST_SORT_INVOKE_ELEMENT_SIZE
428
+ #undef ST_SORT_PROTO_ARG
429
+ #undef ST_SORT_PROTO_COMPARE
430
+ #undef ST_SORT_PROTO_ELEMENT_SIZE
431
+ #undef ST_SWAP
432
+ #undef ST_SWAPN
@@ -8,7 +8,7 @@
8
8
  * (null-terminated text) or arbitrary binary data. All storage is allocated
9
9
  * with palloc() (falling back to malloc in frontend code).
10
10
  *
11
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
11
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
12
12
  * Portions Copyright (c) 1994, Regents of the University of California
13
13
  *
14
14
  * src/include/lib/stringinfo.h
@@ -4,7 +4,7 @@
4
4
  * Definitions for network authentication routines
5
5
  *
6
6
  *
7
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
8
  * Portions Copyright (c) 1994, Regents of the University of California
9
9
  *
10
10
  * src/include/libpq/auth.h
@@ -16,11 +16,13 @@
16
16
 
17
17
  #include "libpq/libpq-be.h"
18
18
 
19
- extern char *pg_krb_server_keyfile;
20
- extern bool pg_krb_caseins_users;
21
- extern char *pg_krb_realm;
19
+ extern PGDLLIMPORT char *pg_krb_server_keyfile;
20
+ extern PGDLLIMPORT bool pg_krb_caseins_users;
21
+ extern PGDLLIMPORT char *pg_krb_realm;
22
22
 
23
23
  extern void ClientAuthentication(Port *port);
24
+ extern void sendAuthRequest(Port *port, AuthRequest areq, const char *extradata,
25
+ int extralen);
24
26
 
25
27
  /* Hook for plugins to get control in ClientAuthentication() */
26
28
  typedef void (*ClientAuthentication_hook_type) (Port *, int);
@@ -3,7 +3,7 @@
3
3
  * crypt.h
4
4
  * Interface to libpq/crypt.c
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/libpq/crypt.h
@@ -35,12 +35,13 @@ extern PasswordType get_password_type(const char *shadow_pass);
35
35
  extern char *encrypt_password(PasswordType target_type, const char *role,
36
36
  const char *password);
37
37
 
38
- extern char *get_role_password(const char *role, char **logdetail);
38
+ extern char *get_role_password(const char *role, const char **logdetail);
39
39
 
40
40
  extern int md5_crypt_verify(const char *role, const char *shadow_pass,
41
41
  const char *client_pass, const char *md5_salt,
42
- int md5_salt_len, char **logdetail);
42
+ int md5_salt_len, const char **logdetail);
43
43
  extern int plain_crypt_verify(const char *role, const char *shadow_pass,
44
- const char *client_pass, char **logdetail);
44
+ const char *client_pass,
45
+ const char **logdetail);
45
46
 
46
47
  #endif
@@ -71,6 +71,12 @@ typedef enum ClientCertMode
71
71
  clientCertFull
72
72
  } ClientCertMode;
73
73
 
74
+ typedef enum ClientCertName
75
+ {
76
+ clientCertCN,
77
+ clientCertDN
78
+ } ClientCertName;
79
+
74
80
  typedef struct HbaLine
75
81
  {
76
82
  int linenumber;
@@ -79,11 +85,12 @@ typedef struct HbaLine
79
85
  List *databases;
80
86
  List *roles;
81
87
  struct sockaddr_storage addr;
88
+ int addrlen; /* zero if we don't have a valid addr */
82
89
  struct sockaddr_storage mask;
90
+ int masklen; /* zero if we don't have a valid mask */
83
91
  IPCompareMethod ip_cmp_method;
84
92
  char *hostname;
85
93
  UserAuth auth_method;
86
-
87
94
  char *usermap;
88
95
  char *pamservice;
89
96
  bool pam_use_hostname;
@@ -100,6 +107,7 @@ typedef struct HbaLine
100
107
  char *ldapprefix;
101
108
  char *ldapsuffix;
102
109
  ClientCertMode clientcert;
110
+ ClientCertName clientcertname;
103
111
  char *krb_realm;
104
112
  bool include_realm;
105
113
  bool compat_realm;
@@ -112,8 +120,6 @@ typedef struct HbaLine
112
120
  char *radiusidentifiers_s;
113
121
  List *radiusports;
114
122
  char *radiusports_s;
115
- int addrlen; /* zero if we don't have a valid addr */
116
- int masklen; /* zero if we don't have a valid mask */
117
123
  } HbaLine;
118
124
 
119
125
  typedef struct IdentLine
@@ -126,15 +132,48 @@ typedef struct IdentLine
126
132
  regex_t re;
127
133
  } IdentLine;
128
134
 
135
+ /*
136
+ * A single string token lexed from an authentication configuration file
137
+ * (pg_ident.conf or pg_hba.conf), together with whether the token has
138
+ * been quoted.
139
+ */
140
+ typedef struct AuthToken
141
+ {
142
+ char *string;
143
+ bool quoted;
144
+ } AuthToken;
145
+
146
+ /*
147
+ * TokenizedAuthLine represents one line lexed from an authentication
148
+ * configuration file. Each item in the "fields" list is a sub-list of
149
+ * AuthTokens. We don't emit a TokenizedAuthLine for empty or all-comment
150
+ * lines, so "fields" is never NIL (nor are any of its sub-lists).
151
+ *
152
+ * Exception: if an error occurs during tokenization, we might have
153
+ * fields == NIL, in which case err_msg != NULL.
154
+ */
155
+ typedef struct TokenizedAuthLine
156
+ {
157
+ List *fields; /* List of lists of AuthTokens */
158
+ int line_num; /* Line number */
159
+ char *raw_line; /* Raw line text */
160
+ char *err_msg; /* Error message if any */
161
+ } TokenizedAuthLine;
162
+
129
163
  /* kluge to avoid including libpq/libpq-be.h here */
130
164
  typedef struct Port hbaPort;
131
165
 
132
166
  extern bool load_hba(void);
133
167
  extern bool load_ident(void);
168
+ extern const char *hba_authname(UserAuth auth_method);
134
169
  extern void hba_getauthmethod(hbaPort *port);
135
170
  extern int check_usermap(const char *usermap_name,
136
171
  const char *pg_role, const char *auth_user,
137
- bool case_sensitive);
172
+ bool case_insensitive);
173
+ extern HbaLine *parse_hba_line(TokenizedAuthLine *tok_line, int elevel);
174
+ extern IdentLine *parse_ident_line(TokenizedAuthLine *tok_line, int elevel);
138
175
  extern bool pg_isblank(const char c);
176
+ extern MemoryContext tokenize_auth_file(const char *filename, FILE *file,
177
+ List **tok_lines, int elevel);
139
178
 
140
179
  #endif /* HBA_H */
@@ -8,7 +8,7 @@
8
8
  * Structs that need to be client-visible are in pqcomm.h.
9
9
  *
10
10
  *
11
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
11
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
12
12
  * Portions Copyright (c) 1994, Regents of the University of California
13
13
  *
14
14
  * src/include/libpq/libpq-be.h
@@ -70,8 +70,12 @@ typedef struct
70
70
 
71
71
  typedef enum CAC_state
72
72
  {
73
- CAC_OK, CAC_STARTUP, CAC_SHUTDOWN, CAC_RECOVERY, CAC_TOOMANY,
74
- CAC_SUPERUSER
73
+ CAC_OK,
74
+ CAC_STARTUP,
75
+ CAC_SHUTDOWN,
76
+ CAC_RECOVERY,
77
+ CAC_NOTCONSISTENT,
78
+ CAC_TOOMANY
75
79
  } CAC_state;
76
80
 
77
81
 
@@ -154,6 +158,19 @@ typedef struct Port
154
158
  */
155
159
  HbaLine *hba;
156
160
 
161
+ /*
162
+ * Authenticated identity. The meaning of this identifier is dependent on
163
+ * hba->auth_method; it is the identity (if any) that the user presented
164
+ * during the authentication cycle, before they were assigned a database
165
+ * role. (It is effectively the "SYSTEM-USERNAME" of a pg_ident usermap
166
+ * -- though the exact string in use may be different, depending on pg_hba
167
+ * options.)
168
+ *
169
+ * authn_id is NULL if the user has not actually been authenticated, for
170
+ * example if the "trust" auth method is in use.
171
+ */
172
+ const char *authn_id;
173
+
157
174
  /*
158
175
  * TCP keepalive and user timeout settings.
159
176
  *
@@ -190,11 +207,12 @@ typedef struct Port
190
207
  */
191
208
  bool ssl_in_use;
192
209
  char *peer_cn;
210
+ char *peer_dn;
193
211
  bool peer_cert_valid;
194
212
 
195
213
  /*
196
214
  * OpenSSL structures. (Keep these last so that the locations of other
197
- * fields are the same whether or not you build with OpenSSL.)
215
+ * fields are the same whether or not you build with SSL enabled.)
198
216
  */
199
217
  #ifdef USE_OPENSSL
200
218
  SSL *ssl;
@@ -266,7 +284,6 @@ extern ssize_t be_tls_write(Port *port, void *ptr, size_t len, int *waitfor);
266
284
  * Return information about the SSL connection.
267
285
  */
268
286
  extern int be_tls_get_cipher_bits(Port *port);
269
- extern bool be_tls_get_compression(Port *port);
270
287
  extern const char *be_tls_get_version(Port *port);
271
288
  extern const char *be_tls_get_cipher(Port *port);
272
289
  extern void be_tls_get_peer_subject_name(Port *port, char *ptr, size_t len);
@@ -309,7 +326,7 @@ extern ssize_t be_gssapi_read(Port *port, void *ptr, size_t len);
309
326
  extern ssize_t be_gssapi_write(Port *port, void *ptr, size_t len);
310
327
  #endif /* ENABLE_GSS */
311
328
 
312
- extern ProtocolVersion FrontendProtocol;
329
+ extern PGDLLIMPORT ProtocolVersion FrontendProtocol;
313
330
 
314
331
  /* TCP keepalives configuration. These are no-ops on an AF_UNIX socket. */
315
332