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
@@ -10,7 +10,7 @@
10
10
  * pl_handler.c - Handler for the PL/pgSQL
11
11
  * procedural language
12
12
  *
13
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
14
14
  * Portions Copyright (c) 1994, Regents of the University of California
15
15
  *
16
16
  *
@@ -12,7 +12,7 @@
12
12
  * pl_reserved_kwlist_d.h
13
13
  * List of keywords represented as a ScanKeywordList.
14
14
  *
15
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
15
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
16
16
  * Portions Copyright (c) 1994, Regents of the University of California
17
17
  *
18
18
  * NOTES
@@ -89,13 +89,13 @@ static int
89
89
  ReservedPLKeywords_hash_func(const void *key, size_t keylen)
90
90
  {
91
91
  static const int8 h[49] = {
92
- -2, 127, 7, 127, 0, 127, 127, 127,
93
- 18, 5, 127, 27, 127, 0, 127, 127,
94
- 0, 39, 32, 22, 10, 127, 19, -26,
95
- 127, -11, 0, 12, 127, 127, -1, 28,
96
- 20, 0, 23, 127, 0, 14, -8, 127,
97
- 127, 127, 13, 5, 127, -23, 1, 0,
98
- 127,
92
+ 127, 7, 127, 127, -2, 127, 13, 127,
93
+ 127, 5, 0, 23, 0, 2, 127, 0,
94
+ 17, 0, 127, 19, 5, 127, 6, 2,
95
+ -3, 17, 0, 6, 127, 8, 18, 127,
96
+ -6, 3, -5, 0, 127, 0, 0, 11,
97
+ 15, 127, 127, 127, 13, 127, 0, 17,
98
+ 127
99
99
  };
100
100
 
101
101
  const unsigned char *k = (const unsigned char *) key;
@@ -106,8 +106,8 @@ ReservedPLKeywords_hash_func(const void *key, size_t keylen)
106
106
  {
107
107
  unsigned char c = *k++ | 0x20;
108
108
 
109
- a = a * 31 + c;
110
- b = b * 127 + c;
109
+ a = a * 257 + c;
110
+ b = b * 8191 + c;
111
111
  }
112
112
  return h[a % 49] + h[b % 49];
113
113
  }
@@ -23,8 +23,8 @@
23
23
  * - plpgsql_scanner_errposition
24
24
  * - plpgsql_yyerror
25
25
  * - plpgsql_push_back_token
26
- * - plpgsql_token_is_unreserved_keyword
27
26
  * - plpgsql_peek
27
+ * - plpgsql_token_is_unreserved_keyword
28
28
  * - plpgsql_append_source_text
29
29
  * - plpgsql_peek2
30
30
  * - plpgsql_scanner_finish
@@ -38,7 +38,7 @@
38
38
  * lexical scanning for PL/pgSQL
39
39
  *
40
40
  *
41
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
41
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
42
42
  * Portions Copyright (c) 1994, Regents of the University of California
43
43
  *
44
44
  *
@@ -12,7 +12,7 @@
12
12
  * pl_unreserved_kwlist_d.h
13
13
  * List of keywords represented as a ScanKeywordList.
14
14
  *
15
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
15
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
16
16
  * Portions Copyright (c) 1994, Regents of the University of California
17
17
  *
18
18
  * NOTES
@@ -74,6 +74,7 @@ static const char UnreservedPLKeywords_kw_string[] =
74
74
  "is\0"
75
75
  "last\0"
76
76
  "log\0"
77
+ "merge\0"
77
78
  "message\0"
78
79
  "message_text\0"
79
80
  "move\0"
@@ -93,7 +94,6 @@ static const char UnreservedPLKeywords_kw_string[] =
93
94
  "query\0"
94
95
  "raise\0"
95
96
  "relative\0"
96
- "reset\0"
97
97
  "return\0"
98
98
  "returned_sqlstate\0"
99
99
  "reverse\0"
@@ -103,7 +103,6 @@ static const char UnreservedPLKeywords_kw_string[] =
103
103
  "schema\0"
104
104
  "schema_name\0"
105
105
  "scroll\0"
106
- "set\0"
107
106
  "slice\0"
108
107
  "sqlstate\0"
109
108
  "stacked\0"
@@ -160,25 +159,25 @@ static const uint16 UnreservedPLKeywords_kw_offsets[] = {
160
159
  295,
161
160
  300,
162
161
  304,
163
- 312,
164
- 325,
165
- 330,
166
- 335,
167
- 338,
168
- 345,
169
- 350,
170
- 357,
171
- 365,
172
- 376,
173
- 393,
174
- 414,
175
- 434,
176
- 452,
177
- 472,
162
+ 310,
163
+ 318,
164
+ 331,
165
+ 336,
166
+ 341,
167
+ 344,
168
+ 351,
169
+ 356,
170
+ 363,
171
+ 371,
172
+ 382,
173
+ 399,
174
+ 420,
175
+ 440,
176
+ 458,
178
177
  478,
179
178
  484,
180
179
  490,
181
- 499,
180
+ 496,
182
181
  505,
183
182
  512,
184
183
  530,
@@ -189,59 +188,58 @@ static const uint16 UnreservedPLKeywords_kw_offsets[] = {
189
188
  572,
190
189
  584,
191
190
  591,
192
- 595,
193
- 601,
194
- 610,
195
- 618,
196
- 624,
197
- 635,
198
- 640,
199
- 651,
200
- 664,
201
- 682,
191
+ 597,
192
+ 606,
193
+ 614,
194
+ 620,
195
+ 631,
196
+ 636,
197
+ 647,
198
+ 660,
199
+ 678,
202
200
  };
203
201
 
204
- #define UNRESERVEDPLKEYWORDS_NUM_KEYWORDS 83
202
+ #define UNRESERVEDPLKEYWORDS_NUM_KEYWORDS 82
205
203
 
206
204
  static int
207
205
  UnreservedPLKeywords_hash_func(const void *key, size_t keylen)
208
206
  {
209
- static const int16 h[167] = {
210
- 10, 32767, 32767, 57, 32767, 62, 21, 32767,
211
- 54, 18, 32767, 58, 59, -54, 47, 0,
212
- -22, -64, 32767, -22, 33, 44, -5, 32767,
213
- 32767, 43, 57, 102, 32767, -65, 7, 32767,
214
- 13, 32767, -28, 14, 32767, 32767, 82, 32767,
215
- 0, 0, 32767, 8, -43, 0, 19, 8,
216
- 75, -58, 32767, 32767, 0, 22, 29, 32767,
217
- -50, 6, 32767, 0, 30, 32767, 32767, 29,
218
- 0, 104, 32767, 32767, 26, 0, 32767, 32767,
219
- -9, 2, 32767, 50, 39, 38, 39, 80,
220
- 32767, 32767, 32767, 32767, -67, 89, 32767, -40,
221
- 64, 32767, 32767, 26, 10, 27, 32767, 19,
222
- 51, -13, 26, 32767, 32767, 32767, 84, 23,
223
- 0, 66, 12, -5, 32767, 32767, 0, 50,
224
- 141, 72, 45, 32767, 32767, 0, -22, 0,
225
- 32767, 32767, -34, 0, 19, -5, 32767, 32767,
226
- 32767, 0, 37, 13, 32767, 32767, 32767, 32767,
227
- -68, -4, 32767, 32767, 78, 32767, 32767, 0,
228
- 85, 32767, 32767, 32767, -93, 32767, 0, 0,
229
- 32767, 74, 5, 32767, 32767, 71, 0, 32767,
230
- 32767, 0, 32767, 32767, 32767, 46, 70,
207
+ static const int16 h[165] = {
208
+ 58, 0, 26, 32767, 0, 0, 9, 32767,
209
+ 0, 32767, 37, 74, 32767, -7, 32767, 39,
210
+ 58, -5, 32767, 31, 32767, 32767, 75, -23,
211
+ 32767, 0, 32767, 32767, 32767, -14, 32767, 81,
212
+ 32767, 32767, 32767, -36, -9, 32767, 32767, 32767,
213
+ 40, 32767, 54, 10, 11, 43, 32767, 0,
214
+ 52, 105, -22, 15, 32767, -33, 49, -65,
215
+ 48, 32767, 32767, 32767, 25, 49, -47, 37,
216
+ 21, 32767, 32767, -15, 70, 32767, 32767, 64,
217
+ -10, 126, 32767, 51, 0, 36, 32767, -55,
218
+ -22, 32767, 32767, 32767, 32767, 32767, -26, -35,
219
+ 32767, 61, 32767, 32767, 32767, -23, 98, 48,
220
+ 23, 19, 32767, 7, 35, 5, -18, 71,
221
+ 28, 5, 32767, 32767, 32767, 74, 32767, 82,
222
+ 32767, 0, 32767, 32767, 66, 0, 0, 50,
223
+ 32767, 32767, 5, 2, 0, 32767, 55, 32767,
224
+ 32767, 45, 79, 32767, 32767, 73, 22, 0,
225
+ 103, 32767, -20, 72, 32767, 0, 29, 32767,
226
+ 0, 32767, 32767, 0, 50, 28, 32767, -40,
227
+ 32767, 32767, 34, 56, 32767, 32767, 32767, 17,
228
+ -36, 32767, 67, 32767, 0
231
229
  };
232
230
 
233
231
  const unsigned char *k = (const unsigned char *) key;
234
232
  uint32 a = 0;
235
- uint32 b = 1;
233
+ uint32 b = 0;
236
234
 
237
235
  while (keylen--)
238
236
  {
239
237
  unsigned char c = *k++ | 0x20;
240
238
 
241
- a = a * 31 + c;
242
- b = b * 127 + c;
239
+ a = a * 257 + c;
240
+ b = b * 8191 + c;
243
241
  }
244
- return h[a % 167] + h[b % 167];
242
+ return h[a % 165] + h[b % 165];
245
243
  }
246
244
 
247
245
  static const ScanKeywordList UnreservedPLKeywords = {
@@ -1,13 +1,6 @@
1
1
  /*--------------------------------------------------------------------
2
2
  * Symbols referenced in this file:
3
3
  * - pg_popcount64
4
- * - pg_popcount64_choose
5
- * - pg_popcount32
6
- * - pg_popcount32_choose
7
- * - pg_popcount_available
8
- * - pg_popcount32_asm
9
- * - pg_popcount64_asm
10
- * - pg_popcount32_slow
11
4
  * - pg_popcount64_slow
12
5
  *--------------------------------------------------------------------
13
6
  */
@@ -17,7 +10,7 @@
17
10
  * pg_bitutils.c
18
11
  * Miscellaneous functions for bit-wise operations.
19
12
  *
20
- * Copyright (c) 2019-2020, PostgreSQL Global Development Group
13
+ * Copyright (c) 2019-2022, PostgreSQL Global Development Group
21
14
  *
22
15
  * IDENTIFICATION
23
16
  * src/port/pg_bitutils.c
@@ -66,37 +59,21 @@
66
59
  */
67
60
 
68
61
 
69
- /*
70
- * On x86_64, we can use the hardware popcount instruction, but only if
71
- * we can verify that the CPU supports it via the cpuid instruction.
72
- *
73
- * Otherwise, we fall back to __builtin_popcount if the compiler has that,
74
- * or a hand-rolled implementation if not.
75
- */
76
- #ifdef HAVE_X86_64_POPCNTQ
77
- #if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
78
- #define USE_POPCNT_ASM 1
79
- #endif
80
- #endif
81
-
82
62
  static int pg_popcount32_slow(uint32 word);
83
63
  static int pg_popcount64_slow(uint64 word);
84
64
 
85
- #ifdef USE_POPCNT_ASM
65
+ #ifdef TRY_POPCNT_FAST
86
66
  static bool pg_popcount_available(void);
87
67
  static int pg_popcount32_choose(uint32 word);
88
68
  static int pg_popcount64_choose(uint64 word);
89
- static int pg_popcount32_asm(uint32 word);
90
- static int pg_popcount64_asm(uint64 word);
69
+ static int pg_popcount32_fast(uint32 word);
70
+ static int pg_popcount64_fast(uint64 word);
91
71
 
92
72
  int (*pg_popcount32) (uint32 word) = pg_popcount32_choose;
93
73
  int (*pg_popcount64) (uint64 word) = pg_popcount64_choose;
94
- #else
95
- int (*pg_popcount32) (uint32 word) = pg_popcount32_slow;
96
- int (*pg_popcount64) (uint64 word) = pg_popcount64_slow;
97
- #endif /* USE_POPCNT_ASM */
74
+ #endif /* TRY_POPCNT_FAST */
98
75
 
99
- #ifdef USE_POPCNT_ASM
76
+ #ifdef TRY_POPCNT_FAST
100
77
 
101
78
  /*
102
79
  * Return true if CPUID indicates that the POPCNT instruction is available.
@@ -128,8 +105,8 @@ pg_popcount32_choose(uint32 word)
128
105
  {
129
106
  if (pg_popcount_available())
130
107
  {
131
- pg_popcount32 = pg_popcount32_asm;
132
- pg_popcount64 = pg_popcount64_asm;
108
+ pg_popcount32 = pg_popcount32_fast;
109
+ pg_popcount64 = pg_popcount64_fast;
133
110
  }
134
111
  else
135
112
  {
@@ -145,8 +122,8 @@ pg_popcount64_choose(uint64 word)
145
122
  {
146
123
  if (pg_popcount_available())
147
124
  {
148
- pg_popcount32 = pg_popcount32_asm;
149
- pg_popcount64 = pg_popcount64_asm;
125
+ pg_popcount32 = pg_popcount32_fast;
126
+ pg_popcount64 = pg_popcount64_fast;
150
127
  }
151
128
  else
152
129
  {
@@ -158,55 +135,49 @@ pg_popcount64_choose(uint64 word)
158
135
  }
159
136
 
160
137
  /*
161
- * pg_popcount32_asm
138
+ * pg_popcount32_fast
162
139
  * Return the number of 1 bits set in word
163
140
  */
164
141
  static int
165
- pg_popcount32_asm(uint32 word)
142
+ pg_popcount32_fast(uint32 word)
166
143
  {
144
+ #ifdef _MSC_VER
145
+ return __popcnt(word);
146
+ #else
167
147
  uint32 res;
168
148
 
169
149
  __asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc");
170
150
  return (int) res;
151
+ #endif
171
152
  }
172
153
 
173
154
  /*
174
- * pg_popcount64_asm
155
+ * pg_popcount64_fast
175
156
  * Return the number of 1 bits set in word
176
157
  */
177
158
  static int
178
- pg_popcount64_asm(uint64 word)
159
+ pg_popcount64_fast(uint64 word)
179
160
  {
161
+ #ifdef _MSC_VER
162
+ return __popcnt64(word);
163
+ #else
180
164
  uint64 res;
181
165
 
182
166
  __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc");
183
167
  return (int) res;
168
+ #endif
184
169
  }
185
170
 
186
- #endif /* USE_POPCNT_ASM */
171
+ #endif /* TRY_POPCNT_FAST */
187
172
 
188
173
 
189
174
  /*
190
175
  * pg_popcount32_slow
191
176
  * Return the number of 1 bits set in word
192
177
  */
193
- static int
194
- pg_popcount32_slow(uint32 word)
195
- {
196
178
  #ifdef HAVE__BUILTIN_POPCOUNT
197
- return __builtin_popcount(word);
198
179
  #else /* !HAVE__BUILTIN_POPCOUNT */
199
- int result = 0;
200
-
201
- while (word != 0)
202
- {
203
- result += pg_number_of_ones[word & 255];
204
- word >>= 8;
205
- }
206
-
207
- return result;
208
180
  #endif /* HAVE__BUILTIN_POPCOUNT */
209
- }
210
181
 
211
182
  /*
212
183
  * pg_popcount64_slow
@@ -236,6 +207,24 @@ pg_popcount64_slow(uint64 word)
236
207
  #endif /* HAVE__BUILTIN_POPCOUNT */
237
208
  }
238
209
 
210
+ #ifndef TRY_POPCNT_FAST
211
+
212
+ /*
213
+ * When the POPCNT instruction is not available, there's no point in using
214
+ * function pointers to vary the implementation between the fast and slow
215
+ * method. We instead just make these actual external functions when
216
+ * TRY_POPCNT_FAST is not defined. The compiler should be able to inline
217
+ * the slow versions here.
218
+ */
219
+
220
+
221
+ int
222
+ pg_popcount64(uint64 word)
223
+ {
224
+ return pg_popcount64_slow(word);
225
+ }
226
+
227
+ #endif /* !TRY_POPCNT_FAST */
239
228
 
240
229
  /*
241
230
  * pg_popcount
@@ -10,7 +10,7 @@
10
10
  * Portable delay handling.
11
11
  *
12
12
  *
13
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
14
14
  *
15
15
  * src/port/pgsleep.c
16
16
  *
@@ -24,7 +24,7 @@
24
24
  * C library thinks the locale is.
25
25
  *
26
26
  *
27
- * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
27
+ * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
28
28
  *
29
29
  * src/port/pgstrcasecmp.c
30
30
  *
@@ -1,240 +1,28 @@
1
1
  /*--------------------------------------------------------------------
2
2
  * Symbols referenced in this file:
3
- * - pg_qsort
4
- * - pg_qsort
5
- * - swapfunc
6
- * - med3
3
+ * - pg_qsort_strcmp
7
4
  *--------------------------------------------------------------------
8
5
  */
9
6
 
10
7
  /*
11
8
  * qsort.c: standard quicksort algorithm
12
- *
13
- * Modifications from vanilla NetBSD source:
14
- * Add do ... while() macro fix
15
- * Remove __inline, _DIAGASSERTs, __P
16
- * Remove ill-considered "swap_cnt" switch to insertion sort,
17
- * in favor of a simple check for presorted input.
18
- * Take care to recurse on the smaller partition, to bound stack usage.
19
- *
20
- * CAUTION: if you change this file, see also qsort_arg.c, gen_qsort_tuple.pl
21
- *
22
- * src/port/qsort.c
23
- */
24
-
25
- /* $NetBSD: qsort.c,v 1.13 2003/08/07 16:43:42 agc Exp $ */
26
-
27
- /*-
28
- * Copyright (c) 1992, 1993
29
- * The Regents of the University of California. All rights reserved.
30
- *
31
- * Redistribution and use in source and binary forms, with or without
32
- * modification, are permitted provided that the following conditions
33
- * are met:
34
- * 1. Redistributions of source code must retain the above copyright
35
- * notice, this list of conditions and the following disclaimer.
36
- * 2. Redistributions in binary form must reproduce the above copyright
37
- * notice, this list of conditions and the following disclaimer in the
38
- * documentation and/or other materials provided with the distribution.
39
- * 3. Neither the name of the University nor the names of its contributors
40
- * may be used to endorse or promote products derived from this software
41
- * without specific prior written permission.
42
- *
43
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
44
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
47
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53
- * SUCH DAMAGE.
54
9
  */
55
10
 
56
11
  #include "c.h"
57
12
 
58
-
59
- static char *med3(char *a, char *b, char *c,
60
- int (*cmp) (const void *, const void *));
61
- static void swapfunc(char *, char *, size_t, int);
13
+ #define ST_SORT pg_qsort
14
+ #define ST_ELEMENT_TYPE_VOID
15
+ #define ST_COMPARE_RUNTIME_POINTER
16
+ #define ST_SCOPE
17
+ #define ST_DECLARE
18
+ #define ST_DEFINE
19
+ #include "lib/sort_template.h"
62
20
 
63
21
  /*
64
- * Qsort routine based on J. L. Bentley and M. D. McIlroy,
65
- * "Engineering a sort function",
66
- * Software--Practice and Experience 23 (1993) 1249-1265.
67
- *
68
- * We have modified their original by adding a check for already-sorted input,
69
- * which seems to be a win per discussions on pgsql-hackers around 2006-03-21.
70
- *
71
- * Also, we recurse on the smaller partition and iterate on the larger one,
72
- * which ensures we cannot recurse more than log(N) levels (since the
73
- * partition recursed to is surely no more than half of the input). Bentley
74
- * and McIlroy explicitly rejected doing this on the grounds that it's "not
75
- * worth the effort", but we have seen crashes in the field due to stack
76
- * overrun, so that judgment seems wrong.
22
+ * qsort comparator wrapper for strcmp.
77
23
  */
78
-
79
- #define swapcode(TYPE, parmi, parmj, n) \
80
- do { \
81
- size_t i = (n) / sizeof (TYPE); \
82
- TYPE *pi = (TYPE *)(void *)(parmi); \
83
- TYPE *pj = (TYPE *)(void *)(parmj); \
84
- do { \
85
- TYPE t = *pi; \
86
- *pi++ = *pj; \
87
- *pj++ = t; \
88
- } while (--i > 0); \
89
- } while (0)
90
-
91
- #define SWAPINIT(a, es) swaptype = ((char *)(a) - (char *)0) % sizeof(long) || \
92
- (es) % sizeof(long) ? 2 : (es) == sizeof(long)? 0 : 1
93
-
94
- static void
95
- swapfunc(char *a, char *b, size_t n, int swaptype)
24
+ int
25
+ pg_qsort_strcmp(const void *a, const void *b)
96
26
  {
97
- if (swaptype <= 1)
98
- swapcode(long, a, b, n);
99
- else
100
- swapcode(char, a, b, n);
27
+ return strcmp(*(const char *const *) a, *(const char *const *) b);
101
28
  }
102
-
103
- #define swap(a, b) \
104
- if (swaptype == 0) { \
105
- long t = *(long *)(void *)(a); \
106
- *(long *)(void *)(a) = *(long *)(void *)(b); \
107
- *(long *)(void *)(b) = t; \
108
- } else \
109
- swapfunc(a, b, es, swaptype)
110
-
111
- #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)
112
-
113
- static char *
114
- med3(char *a, char *b, char *c, int (*cmp) (const void *, const void *))
115
- {
116
- return cmp(a, b) < 0 ?
117
- (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))
118
- : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));
119
- }
120
-
121
- void
122
- pg_qsort(void *a, size_t n, size_t es, int (*cmp) (const void *, const void *))
123
- {
124
- char *pa,
125
- *pb,
126
- *pc,
127
- *pd,
128
- *pl,
129
- *pm,
130
- *pn;
131
- size_t d1,
132
- d2;
133
- int r,
134
- swaptype,
135
- presorted;
136
-
137
- loop:SWAPINIT(a, es);
138
- if (n < 7)
139
- {
140
- for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
141
- for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
142
- pl -= es)
143
- swap(pl, pl - es);
144
- return;
145
- }
146
- presorted = 1;
147
- for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
148
- {
149
- if (cmp(pm - es, pm) > 0)
150
- {
151
- presorted = 0;
152
- break;
153
- }
154
- }
155
- if (presorted)
156
- return;
157
- pm = (char *) a + (n / 2) * es;
158
- if (n > 7)
159
- {
160
- pl = (char *) a;
161
- pn = (char *) a + (n - 1) * es;
162
- if (n > 40)
163
- {
164
- size_t d = (n / 8) * es;
165
-
166
- pl = med3(pl, pl + d, pl + 2 * d, cmp);
167
- pm = med3(pm - d, pm, pm + d, cmp);
168
- pn = med3(pn - 2 * d, pn - d, pn, cmp);
169
- }
170
- pm = med3(pl, pm, pn, cmp);
171
- }
172
- swap(a, pm);
173
- pa = pb = (char *) a + es;
174
- pc = pd = (char *) a + (n - 1) * es;
175
- for (;;)
176
- {
177
- while (pb <= pc && (r = cmp(pb, a)) <= 0)
178
- {
179
- if (r == 0)
180
- {
181
- swap(pa, pb);
182
- pa += es;
183
- }
184
- pb += es;
185
- }
186
- while (pb <= pc && (r = cmp(pc, a)) >= 0)
187
- {
188
- if (r == 0)
189
- {
190
- swap(pc, pd);
191
- pd -= es;
192
- }
193
- pc -= es;
194
- }
195
- if (pb > pc)
196
- break;
197
- swap(pb, pc);
198
- pb += es;
199
- pc -= es;
200
- }
201
- pn = (char *) a + n * es;
202
- d1 = Min(pa - (char *) a, pb - pa);
203
- vecswap(a, pb - d1, d1);
204
- d1 = Min(pd - pc, pn - pd - es);
205
- vecswap(pb, pn - d1, d1);
206
- d1 = pb - pa;
207
- d2 = pd - pc;
208
- if (d1 <= d2)
209
- {
210
- /* Recurse on left partition, then iterate on right partition */
211
- if (d1 > es)
212
- pg_qsort(a, d1 / es, es, cmp);
213
- if (d2 > es)
214
- {
215
- /* Iterate rather than recurse to save stack space */
216
- /* pg_qsort(pn - d2, d2 / es, es, cmp); */
217
- a = pn - d2;
218
- n = d2 / es;
219
- goto loop;
220
- }
221
- }
222
- else
223
- {
224
- /* Recurse on right partition, then iterate on left partition */
225
- if (d2 > es)
226
- pg_qsort(pn - d2, d2 / es, es, cmp);
227
- if (d1 > es)
228
- {
229
- /* Iterate rather than recurse to save stack space */
230
- /* pg_qsort(a, d1 / es, es, cmp); */
231
- n = d1 / es;
232
- goto loop;
233
- }
234
- }
235
- }
236
-
237
- /*
238
- * qsort comparator wrapper for strcmp.
239
- */
240
-