pg_query 4.2.3 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +6 -8
  4. data/Rakefile +3 -3
  5. data/ext/pg_query/extconf.rb +1 -3
  6. data/ext/pg_query/include/access/amapi.h +3 -1
  7. data/ext/pg_query/include/access/attmap.h +5 -3
  8. data/ext/pg_query/include/access/attnum.h +1 -1
  9. data/ext/pg_query/include/access/clog.h +1 -1
  10. data/ext/pg_query/include/access/commit_ts.h +1 -1
  11. data/ext/pg_query/include/access/detoast.h +1 -1
  12. data/ext/pg_query/include/access/genam.h +7 -5
  13. data/ext/pg_query/include/access/gin.h +16 -3
  14. data/ext/pg_query/include/access/htup.h +1 -1
  15. data/ext/pg_query/include/access/htup_details.h +6 -2
  16. data/ext/pg_query/include/access/itup.h +61 -58
  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 +1 -1
  21. data/ext/pg_query/include/access/rmgrlist.h +2 -2
  22. data/ext/pg_query/include/access/sdir.h +12 -3
  23. data/ext/pg_query/include/access/skey.h +1 -1
  24. data/ext/pg_query/include/access/stratnum.h +1 -1
  25. data/ext/pg_query/include/access/sysattr.h +1 -1
  26. data/ext/pg_query/include/access/table.h +1 -1
  27. data/ext/pg_query/include/access/tableam.h +68 -45
  28. data/ext/pg_query/include/access/toast_compression.h +1 -1
  29. data/ext/pg_query/include/access/transam.h +1 -1
  30. data/ext/pg_query/include/access/tsmapi.h +82 -0
  31. data/ext/pg_query/include/access/tupconvert.h +5 -2
  32. data/ext/pg_query/include/access/tupdesc.h +2 -2
  33. data/ext/pg_query/include/access/tupmacs.h +58 -98
  34. data/ext/pg_query/include/access/twophase.h +2 -2
  35. data/ext/pg_query/include/access/xact.h +25 -18
  36. data/ext/pg_query/include/access/xlog.h +15 -16
  37. data/ext/pg_query/include/access/xlog_internal.h +100 -62
  38. data/ext/pg_query/include/access/xlogbackup.h +41 -0
  39. data/ext/pg_query/include/access/xlogdefs.h +6 -25
  40. data/ext/pg_query/include/access/xlogprefetcher.h +1 -1
  41. data/ext/pg_query/include/access/xlogreader.h +7 -6
  42. data/ext/pg_query/include/access/xlogrecord.h +17 -5
  43. data/ext/pg_query/include/access/xlogrecovery.h +4 -3
  44. data/ext/pg_query/include/archive/archive_module.h +59 -0
  45. data/ext/pg_query/include/c.h +144 -156
  46. data/ext/pg_query/include/catalog/catalog.h +4 -3
  47. data/ext/pg_query/include/catalog/catversion.h +6 -2
  48. data/ext/pg_query/include/catalog/dependency.h +5 -4
  49. data/ext/pg_query/include/catalog/genbki.h +7 -6
  50. data/ext/pg_query/include/catalog/index.h +4 -4
  51. data/ext/pg_query/include/catalog/indexing.h +1 -1
  52. data/ext/pg_query/include/catalog/namespace.h +2 -2
  53. data/ext/pg_query/include/catalog/objectaccess.h +10 -8
  54. data/ext/pg_query/include/catalog/objectaddress.h +3 -3
  55. data/ext/pg_query/include/catalog/pg_aggregate.h +1 -1
  56. data/ext/pg_query/include/catalog/pg_aggregate_d.h +1 -1
  57. data/ext/pg_query/include/catalog/pg_am.h +1 -1
  58. data/ext/pg_query/include/catalog/pg_am_d.h +1 -1
  59. data/ext/pg_query/include/catalog/pg_attribute.h +19 -17
  60. data/ext/pg_query/include/catalog/pg_attribute_d.h +19 -19
  61. data/ext/pg_query/include/catalog/pg_authid.h +1 -1
  62. data/ext/pg_query/include/catalog/pg_authid_d.h +3 -1
  63. data/ext/pg_query/include/catalog/pg_class.h +1 -1
  64. data/ext/pg_query/include/catalog/pg_class_d.h +1 -1
  65. data/ext/pg_query/include/catalog/pg_collation.h +3 -1
  66. data/ext/pg_query/include/catalog/pg_collation_d.h +4 -3
  67. data/ext/pg_query/include/catalog/pg_constraint.h +2 -2
  68. data/ext/pg_query/include/catalog/pg_constraint_d.h +1 -1
  69. data/ext/pg_query/include/catalog/pg_control.h +9 -1
  70. data/ext/pg_query/include/catalog/pg_conversion.h +2 -2
  71. data/ext/pg_query/include/catalog/pg_conversion_d.h +1 -1
  72. data/ext/pg_query/include/catalog/pg_database.h +124 -0
  73. data/ext/pg_query/include/catalog/pg_database_d.h +52 -0
  74. data/ext/pg_query/include/catalog/pg_depend.h +1 -1
  75. data/ext/pg_query/include/catalog/pg_depend_d.h +1 -1
  76. data/ext/pg_query/include/catalog/pg_event_trigger.h +1 -1
  77. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +1 -1
  78. data/ext/pg_query/include/catalog/pg_index.h +1 -1
  79. data/ext/pg_query/include/catalog/pg_index_d.h +1 -1
  80. data/ext/pg_query/include/catalog/pg_language.h +1 -1
  81. data/ext/pg_query/include/catalog/pg_language_d.h +1 -1
  82. data/ext/pg_query/include/catalog/pg_namespace.h +1 -1
  83. data/ext/pg_query/include/catalog/pg_namespace_d.h +1 -1
  84. data/ext/pg_query/include/catalog/pg_opclass.h +1 -1
  85. data/ext/pg_query/include/catalog/pg_opclass_d.h +1 -1
  86. data/ext/pg_query/include/catalog/pg_operator.h +1 -1
  87. data/ext/pg_query/include/catalog/pg_operator_d.h +1 -1
  88. data/ext/pg_query/include/catalog/pg_opfamily.h +3 -2
  89. data/ext/pg_query/include/catalog/pg_opfamily_d.h +4 -2
  90. data/ext/pg_query/include/catalog/pg_partitioned_table.h +1 -1
  91. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +1 -1
  92. data/ext/pg_query/include/catalog/pg_proc.h +1 -1
  93. data/ext/pg_query/include/catalog/pg_proc_d.h +1 -1
  94. data/ext/pg_query/include/catalog/pg_publication.h +2 -5
  95. data/ext/pg_query/include/catalog/pg_publication_d.h +1 -1
  96. data/ext/pg_query/include/catalog/pg_replication_origin.h +1 -1
  97. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +1 -1
  98. data/ext/pg_query/include/catalog/pg_statistic.h +1 -1
  99. data/ext/pg_query/include/catalog/pg_statistic_d.h +1 -1
  100. data/ext/pg_query/include/catalog/pg_statistic_ext.h +1 -1
  101. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +1 -1
  102. data/ext/pg_query/include/catalog/pg_transform.h +1 -1
  103. data/ext/pg_query/include/catalog/pg_transform_d.h +1 -1
  104. data/ext/pg_query/include/catalog/pg_trigger.h +1 -1
  105. data/ext/pg_query/include/catalog/pg_trigger_d.h +1 -1
  106. data/ext/pg_query/include/catalog/pg_ts_config.h +1 -1
  107. data/ext/pg_query/include/catalog/pg_ts_config_d.h +1 -1
  108. data/ext/pg_query/include/catalog/pg_ts_dict.h +1 -1
  109. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +1 -1
  110. data/ext/pg_query/include/catalog/pg_ts_parser.h +1 -1
  111. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +1 -1
  112. data/ext/pg_query/include/catalog/pg_ts_template.h +1 -1
  113. data/ext/pg_query/include/catalog/pg_ts_template_d.h +1 -1
  114. data/ext/pg_query/include/catalog/pg_type.h +1 -1
  115. data/ext/pg_query/include/catalog/pg_type_d.h +1 -1
  116. data/ext/pg_query/include/catalog/storage.h +6 -6
  117. data/ext/pg_query/include/commands/async.h +1 -1
  118. data/ext/pg_query/include/commands/dbcommands.h +2 -1
  119. data/ext/pg_query/include/commands/defrem.h +2 -1
  120. data/ext/pg_query/include/commands/event_trigger.h +1 -1
  121. data/ext/pg_query/include/commands/explain.h +3 -1
  122. data/ext/pg_query/include/commands/prepare.h +1 -1
  123. data/ext/pg_query/include/commands/tablespace.h +4 -4
  124. data/ext/pg_query/include/commands/trigger.h +15 -14
  125. data/ext/pg_query/include/commands/user.h +9 -3
  126. data/ext/pg_query/include/commands/vacuum.h +60 -14
  127. data/ext/pg_query/include/common/cryptohash.h +39 -0
  128. data/ext/pg_query/include/common/file_perm.h +1 -1
  129. data/ext/pg_query/include/common/hashfn.h +1 -1
  130. data/ext/pg_query/include/common/int.h +437 -0
  131. data/ext/pg_query/include/common/ip.h +4 -2
  132. data/ext/pg_query/include/common/keywords.h +1 -1
  133. data/ext/pg_query/include/common/kwlookup.h +2 -2
  134. data/ext/pg_query/include/common/pg_prng.h +3 -2
  135. data/ext/pg_query/include/common/relpath.h +20 -13
  136. data/ext/pg_query/include/common/scram-common.h +70 -0
  137. data/ext/pg_query/include/common/sha2.h +32 -0
  138. data/ext/pg_query/include/common/string.h +5 -3
  139. data/ext/pg_query/include/common/unicode_east_asian_fw_table.h +10 -10
  140. data/ext/pg_query/include/common/{unicode_combining_table.h → unicode_nonspacing_table.h} +31 -13
  141. data/ext/pg_query/include/copyfuncs.funcs.c +5013 -0
  142. data/ext/pg_query/include/copyfuncs.switch.c +938 -0
  143. data/ext/pg_query/include/datatype/timestamp.h +11 -4
  144. data/ext/pg_query/include/equalfuncs.funcs.c +3097 -0
  145. data/ext/pg_query/include/equalfuncs.switch.c +785 -0
  146. data/ext/pg_query/include/executor/execdesc.h +1 -1
  147. data/ext/pg_query/include/executor/executor.h +34 -17
  148. data/ext/pg_query/include/executor/functions.h +1 -1
  149. data/ext/pg_query/include/executor/instrument.h +1 -1
  150. data/ext/pg_query/include/executor/spi.h +2 -2
  151. data/ext/pg_query/include/executor/tablefunc.h +1 -1
  152. data/ext/pg_query/include/executor/tuptable.h +18 -11
  153. data/ext/pg_query/include/fmgr.h +21 -2
  154. data/ext/pg_query/include/foreign/fdwapi.h +294 -0
  155. data/ext/pg_query/include/funcapi.h +12 -12
  156. data/ext/pg_query/include/gram.h +1127 -0
  157. data/ext/pg_query/include/{parser/gramparse.h → gramparse.h} +4 -4
  158. data/ext/pg_query/include/jit/jit.h +2 -2
  159. data/ext/pg_query/include/kwlist_d.h +534 -510
  160. data/ext/pg_query/include/lib/dshash.h +4 -1
  161. data/ext/pg_query/include/lib/ilist.h +435 -22
  162. data/ext/pg_query/include/lib/pairingheap.h +1 -1
  163. data/ext/pg_query/include/lib/simplehash.h +9 -9
  164. data/ext/pg_query/include/lib/sort_template.h +1 -1
  165. data/ext/pg_query/include/lib/stringinfo.h +3 -3
  166. data/ext/pg_query/include/libpq/auth.h +8 -2
  167. data/ext/pg_query/include/libpq/crypt.h +1 -1
  168. data/ext/pg_query/include/libpq/hba.h +24 -17
  169. data/ext/pg_query/include/libpq/libpq-be.h +36 -25
  170. data/ext/pg_query/include/libpq/libpq.h +1 -1
  171. data/ext/pg_query/include/libpq/pqcomm.h +10 -41
  172. data/ext/pg_query/include/libpq/pqformat.h +2 -2
  173. data/ext/pg_query/include/libpq/pqsignal.h +22 -10
  174. data/ext/pg_query/include/libpq/sasl.h +136 -0
  175. data/ext/pg_query/include/libpq/scram.h +37 -0
  176. data/ext/pg_query/include/mb/pg_wchar.h +35 -18
  177. data/ext/pg_query/include/mb/stringinfo_mb.h +1 -1
  178. data/ext/pg_query/include/miscadmin.h +26 -14
  179. data/ext/pg_query/include/nodes/bitmapset.h +11 -7
  180. data/ext/pg_query/include/nodes/execnodes.h +83 -30
  181. data/ext/pg_query/include/nodes/extensible.h +5 -3
  182. data/ext/pg_query/include/nodes/lockoptions.h +1 -1
  183. data/ext/pg_query/include/nodes/makefuncs.h +14 -2
  184. data/ext/pg_query/include/nodes/memnodes.h +7 -4
  185. data/ext/pg_query/include/nodes/miscnodes.h +56 -0
  186. data/ext/pg_query/include/nodes/nodeFuncs.h +89 -29
  187. data/ext/pg_query/include/nodes/nodes.h +95 -510
  188. data/ext/pg_query/include/nodes/nodetags.h +471 -0
  189. data/ext/pg_query/include/nodes/params.h +3 -3
  190. data/ext/pg_query/include/nodes/parsenodes.h +377 -139
  191. data/ext/pg_query/include/nodes/pathnodes.h +1090 -440
  192. data/ext/pg_query/include/nodes/pg_list.h +30 -7
  193. data/ext/pg_query/include/nodes/plannodes.h +367 -124
  194. data/ext/pg_query/include/nodes/primnodes.h +670 -222
  195. data/ext/pg_query/include/nodes/print.h +1 -1
  196. data/ext/pg_query/include/{utils → nodes}/queryjumble.h +5 -7
  197. data/ext/pg_query/include/nodes/replnodes.h +111 -0
  198. data/ext/pg_query/include/nodes/supportnodes.h +346 -0
  199. data/ext/pg_query/include/nodes/tidbitmap.h +1 -1
  200. data/ext/pg_query/include/nodes/value.h +12 -2
  201. data/ext/pg_query/include/optimizer/cost.h +6 -4
  202. data/ext/pg_query/include/optimizer/geqo.h +1 -1
  203. data/ext/pg_query/include/optimizer/geqo_gene.h +1 -1
  204. data/ext/pg_query/include/optimizer/optimizer.h +8 -8
  205. data/ext/pg_query/include/optimizer/paths.h +16 -7
  206. data/ext/pg_query/include/optimizer/planmain.h +3 -6
  207. data/ext/pg_query/include/parser/analyze.h +4 -3
  208. data/ext/pg_query/include/parser/kwlist.h +12 -1
  209. data/ext/pg_query/include/parser/parse_agg.h +4 -2
  210. data/ext/pg_query/include/parser/parse_coerce.h +3 -1
  211. data/ext/pg_query/include/parser/parse_expr.h +1 -1
  212. data/ext/pg_query/include/parser/parse_func.h +1 -1
  213. data/ext/pg_query/include/parser/parse_node.h +22 -4
  214. data/ext/pg_query/include/parser/parse_oper.h +3 -3
  215. data/ext/pg_query/include/parser/parse_relation.h +8 -3
  216. data/ext/pg_query/include/parser/parse_type.h +4 -3
  217. data/ext/pg_query/include/parser/parser.h +1 -1
  218. data/ext/pg_query/include/parser/parsetree.h +1 -1
  219. data/ext/pg_query/include/parser/scanner.h +2 -2
  220. data/ext/pg_query/include/parser/scansup.h +1 -1
  221. data/ext/pg_query/include/partitioning/partdefs.h +1 -1
  222. data/ext/pg_query/include/pg_config.h +21 -216
  223. data/ext/pg_query/include/pg_config_manual.h +8 -46
  224. data/ext/pg_query/include/pg_getopt.h +1 -1
  225. data/ext/pg_query/include/pg_query.h +27 -3
  226. data/ext/pg_query/include/pg_query_enum_defs.c +311 -149
  227. data/ext/pg_query/include/pg_query_fingerprint_conds.c +545 -489
  228. data/ext/pg_query/include/pg_query_fingerprint_defs.c +5092 -4432
  229. data/ext/pg_query/include/pg_query_outfuncs_conds.c +385 -343
  230. data/ext/pg_query/include/pg_query_outfuncs_defs.c +1294 -1161
  231. data/ext/pg_query/include/pg_query_readfuncs_conds.c +137 -123
  232. data/ext/pg_query/include/pg_query_readfuncs_defs.c +1657 -1496
  233. data/ext/pg_query/include/pg_trace.h +1 -1
  234. data/ext/pg_query/include/pgstat.h +172 -93
  235. data/ext/pg_query/include/pgtime.h +3 -3
  236. data/ext/pg_query/include/pl_gram.h +64 -62
  237. data/ext/pg_query/include/pl_reserved_kwlist.h +1 -1
  238. data/ext/pg_query/include/pl_reserved_kwlist_d.h +1 -1
  239. data/ext/pg_query/include/pl_unreserved_kwlist.h +2 -1
  240. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +48 -46
  241. data/ext/pg_query/include/plpgsql.h +17 -22
  242. data/ext/pg_query/include/port/atomics/arch-arm.h +3 -3
  243. data/ext/pg_query/include/port/atomics/arch-ppc.h +21 -21
  244. data/ext/pg_query/include/port/atomics/arch-x86.h +2 -2
  245. data/ext/pg_query/include/port/atomics/fallback.h +3 -3
  246. data/ext/pg_query/include/port/atomics/generic-gcc.h +1 -1
  247. data/ext/pg_query/include/port/atomics/generic.h +1 -1
  248. data/ext/pg_query/include/port/atomics.h +2 -7
  249. data/ext/pg_query/include/port/pg_bitutils.h +62 -25
  250. data/ext/pg_query/include/port/pg_bswap.h +1 -1
  251. data/ext/pg_query/include/port/pg_crc32c.h +1 -1
  252. data/ext/pg_query/include/port/simd.h +375 -0
  253. data/ext/pg_query/include/port.h +42 -75
  254. data/ext/pg_query/include/portability/instr_time.h +81 -140
  255. data/ext/pg_query/include/postgres.h +205 -434
  256. data/ext/pg_query/include/postgres_ext.h +0 -1
  257. data/ext/pg_query/include/postmaster/autovacuum.h +1 -4
  258. data/ext/pg_query/include/postmaster/auxprocess.h +1 -1
  259. data/ext/pg_query/include/postmaster/bgworker.h +2 -2
  260. data/ext/pg_query/include/postmaster/bgworker_internals.h +1 -1
  261. data/ext/pg_query/include/postmaster/bgwriter.h +2 -2
  262. data/ext/pg_query/include/postmaster/fork_process.h +1 -1
  263. data/ext/pg_query/include/postmaster/interrupt.h +1 -1
  264. data/ext/pg_query/include/postmaster/pgarch.h +1 -38
  265. data/ext/pg_query/include/postmaster/postmaster.h +5 -2
  266. data/ext/pg_query/include/postmaster/startup.h +3 -1
  267. data/ext/pg_query/include/postmaster/syslogger.h +2 -2
  268. data/ext/pg_query/include/postmaster/walwriter.h +3 -1
  269. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +6186 -5585
  270. data/ext/pg_query/include/protobuf/pg_query.pb.h +112443 -91222
  271. data/ext/pg_query/include/regex/regex.h +9 -6
  272. data/ext/pg_query/include/replication/logicallauncher.h +6 -1
  273. data/ext/pg_query/include/replication/logicalproto.h +30 -10
  274. data/ext/pg_query/include/replication/logicalworker.h +14 -1
  275. data/ext/pg_query/include/replication/origin.h +4 -4
  276. data/ext/pg_query/include/replication/reorderbuffer.h +113 -45
  277. data/ext/pg_query/include/replication/slot.h +25 -6
  278. data/ext/pg_query/include/replication/syncrep.h +2 -8
  279. data/ext/pg_query/include/replication/walreceiver.h +15 -9
  280. data/ext/pg_query/include/replication/walsender.h +13 -13
  281. data/ext/pg_query/include/rewrite/prs2lock.h +1 -1
  282. data/ext/pg_query/include/rewrite/rewriteHandler.h +1 -4
  283. data/ext/pg_query/include/rewrite/rewriteManip.h +11 -2
  284. data/ext/pg_query/include/rewrite/rewriteSupport.h +1 -1
  285. data/ext/pg_query/include/src_backend_nodes_copyfuncs.funcs.c +5321 -0
  286. data/ext/pg_query/include/src_backend_nodes_equalfuncs.funcs.c +3354 -0
  287. data/ext/pg_query/include/storage/backendid.h +1 -1
  288. data/ext/pg_query/include/storage/block.h +24 -31
  289. data/ext/pg_query/include/storage/buf.h +1 -1
  290. data/ext/pg_query/include/storage/bufmgr.h +183 -87
  291. data/ext/pg_query/include/storage/bufpage.h +146 -93
  292. data/ext/pg_query/include/storage/condition_variable.h +2 -2
  293. data/ext/pg_query/include/storage/dsm.h +3 -6
  294. data/ext/pg_query/include/storage/dsm_impl.h +4 -1
  295. data/ext/pg_query/include/storage/fd.h +24 -20
  296. data/ext/pg_query/include/storage/fileset.h +1 -1
  297. data/ext/pg_query/include/storage/ipc.h +1 -1
  298. data/ext/pg_query/include/storage/item.h +1 -1
  299. data/ext/pg_query/include/storage/itemid.h +1 -1
  300. data/ext/pg_query/include/storage/itemptr.h +94 -57
  301. data/ext/pg_query/include/storage/large_object.h +1 -1
  302. data/ext/pg_query/include/storage/latch.h +9 -1
  303. data/ext/pg_query/include/storage/lmgr.h +6 -1
  304. data/ext/pg_query/include/storage/lock.h +21 -13
  305. data/ext/pg_query/include/storage/lockdefs.h +3 -3
  306. data/ext/pg_query/include/storage/lwlock.h +16 -2
  307. data/ext/pg_query/include/storage/off.h +1 -1
  308. data/ext/pg_query/include/storage/pg_sema.h +1 -1
  309. data/ext/pg_query/include/storage/pg_shmem.h +1 -1
  310. data/ext/pg_query/include/storage/pmsignal.h +1 -1
  311. data/ext/pg_query/include/storage/predicate.h +2 -2
  312. data/ext/pg_query/include/storage/proc.h +22 -17
  313. data/ext/pg_query/include/storage/procarray.h +3 -2
  314. data/ext/pg_query/include/storage/proclist_types.h +1 -1
  315. data/ext/pg_query/include/storage/procsignal.h +3 -1
  316. data/ext/pg_query/include/storage/relfilelocator.h +99 -0
  317. data/ext/pg_query/include/storage/s_lock.h +66 -309
  318. data/ext/pg_query/include/storage/sharedfileset.h +1 -1
  319. data/ext/pg_query/include/storage/shm_mq.h +1 -1
  320. data/ext/pg_query/include/storage/shm_toc.h +1 -1
  321. data/ext/pg_query/include/storage/shmem.h +1 -23
  322. data/ext/pg_query/include/storage/sinval.h +3 -3
  323. data/ext/pg_query/include/storage/sinvaladt.h +4 -2
  324. data/ext/pg_query/include/storage/smgr.h +12 -10
  325. data/ext/pg_query/include/storage/spin.h +1 -1
  326. data/ext/pg_query/include/storage/standby.h +9 -8
  327. data/ext/pg_query/include/storage/standbydefs.h +1 -1
  328. data/ext/pg_query/include/storage/sync.h +3 -3
  329. data/ext/pg_query/include/tcop/cmdtag.h +7 -2
  330. data/ext/pg_query/include/tcop/cmdtaglist.h +1 -1
  331. data/ext/pg_query/include/tcop/deparse_utility.h +1 -1
  332. data/ext/pg_query/include/tcop/dest.h +1 -3
  333. data/ext/pg_query/include/tcop/fastpath.h +1 -1
  334. data/ext/pg_query/include/tcop/pquery.h +1 -1
  335. data/ext/pg_query/include/tcop/tcopprot.h +1 -4
  336. data/ext/pg_query/include/tcop/utility.h +1 -1
  337. data/ext/pg_query/include/tsearch/ts_cache.h +2 -4
  338. data/ext/pg_query/include/utils/acl.h +26 -81
  339. data/ext/pg_query/include/utils/aclchk_internal.h +1 -1
  340. data/ext/pg_query/include/utils/array.h +19 -1
  341. data/ext/pg_query/include/utils/backend_progress.h +2 -1
  342. data/ext/pg_query/include/utils/backend_status.h +24 -3
  343. data/ext/pg_query/include/utils/builtins.h +14 -5
  344. data/ext/pg_query/include/utils/bytea.h +1 -1
  345. data/ext/pg_query/include/utils/catcache.h +1 -1
  346. data/ext/pg_query/include/utils/date.h +37 -9
  347. data/ext/pg_query/include/utils/datetime.h +41 -21
  348. data/ext/pg_query/include/utils/datum.h +1 -1
  349. data/ext/pg_query/include/utils/dsa.h +5 -1
  350. data/ext/pg_query/include/utils/elog.h +101 -26
  351. data/ext/pg_query/include/utils/expandeddatum.h +14 -3
  352. data/ext/pg_query/include/utils/expandedrecord.h +14 -4
  353. data/ext/pg_query/include/utils/float.h +7 -6
  354. data/ext/pg_query/include/utils/fmgroids.h +54 -1
  355. data/ext/pg_query/include/utils/fmgrprotos.h +45 -3
  356. data/ext/pg_query/include/utils/fmgrtab.h +1 -1
  357. data/ext/pg_query/include/utils/guc.h +55 -82
  358. data/ext/pg_query/include/utils/guc_hooks.h +163 -0
  359. data/ext/pg_query/include/utils/guc_tables.h +49 -3
  360. data/ext/pg_query/include/utils/hsearch.h +1 -1
  361. data/ext/pg_query/include/utils/inval.h +3 -3
  362. data/ext/pg_query/include/utils/logtape.h +77 -0
  363. data/ext/pg_query/include/utils/lsyscache.h +5 -1
  364. data/ext/pg_query/include/utils/memdebug.h +1 -1
  365. data/ext/pg_query/include/utils/memutils.h +5 -49
  366. data/ext/pg_query/include/utils/memutils_internal.h +136 -0
  367. data/ext/pg_query/include/utils/memutils_memorychunk.h +237 -0
  368. data/ext/pg_query/include/utils/numeric.h +20 -5
  369. data/ext/pg_query/include/utils/palloc.h +8 -1
  370. data/ext/pg_query/include/utils/partcache.h +3 -2
  371. data/ext/pg_query/include/utils/pg_locale.h +22 -14
  372. data/ext/pg_query/include/utils/pgstat_internal.h +37 -7
  373. data/ext/pg_query/include/utils/pidfile.h +1 -1
  374. data/ext/pg_query/include/utils/plancache.h +1 -1
  375. data/ext/pg_query/include/utils/portal.h +1 -1
  376. data/ext/pg_query/include/utils/probes.h +6 -6
  377. data/ext/pg_query/include/utils/ps_status.h +23 -1
  378. data/ext/pg_query/include/utils/queryenvironment.h +1 -1
  379. data/ext/pg_query/include/utils/regproc.h +3 -3
  380. data/ext/pg_query/include/utils/rel.h +60 -43
  381. data/ext/pg_query/include/utils/relcache.h +13 -8
  382. data/ext/pg_query/include/utils/reltrigger.h +1 -1
  383. data/ext/pg_query/include/utils/resowner.h +1 -1
  384. data/ext/pg_query/include/utils/ruleutils.h +6 -1
  385. data/ext/pg_query/include/utils/sharedtuplestore.h +1 -1
  386. data/ext/pg_query/include/utils/snapmgr.h +4 -2
  387. data/ext/pg_query/include/utils/snapshot.h +1 -1
  388. data/ext/pg_query/include/utils/sortsupport.h +2 -2
  389. data/ext/pg_query/include/utils/syscache.h +4 -1
  390. data/ext/pg_query/include/utils/timeout.h +1 -1
  391. data/ext/pg_query/include/utils/timestamp.h +41 -11
  392. data/ext/pg_query/include/utils/tuplesort.h +189 -35
  393. data/ext/pg_query/include/utils/tuplestore.h +1 -1
  394. data/ext/pg_query/include/utils/typcache.h +1 -1
  395. data/ext/pg_query/include/utils/varlena.h +13 -1
  396. data/ext/pg_query/include/utils/wait_event.h +9 -4
  397. data/ext/pg_query/include/utils/xml.h +15 -5
  398. data/ext/pg_query/include/varatt.h +358 -0
  399. data/ext/pg_query/pg_query.c +1 -1
  400. data/ext/pg_query/pg_query.pb-c.c +19755 -17757
  401. data/ext/pg_query/pg_query_fingerprint.c +8 -3
  402. data/ext/pg_query/pg_query_fingerprint.h +1 -1
  403. data/ext/pg_query/pg_query_internal.h +1 -1
  404. data/ext/pg_query/pg_query_json_plpgsql.c +1 -0
  405. data/ext/pg_query/pg_query_normalize.c +1 -1
  406. data/ext/pg_query/pg_query_outfuncs_protobuf.c +2 -2
  407. data/ext/pg_query/pg_query_parse.c +46 -4
  408. data/ext/pg_query/pg_query_parse_plpgsql.c +1 -1
  409. data/ext/pg_query/pg_query_scan.c +1 -1
  410. data/ext/pg_query/pg_query_split.c +2 -2
  411. data/ext/pg_query/postgres_deparse.c +503 -105
  412. data/ext/pg_query/src_backend_catalog_namespace.c +7 -2
  413. data/ext/pg_query/src_backend_catalog_pg_proc.c +1 -1
  414. data/ext/pg_query/src_backend_commands_define.c +1 -1
  415. data/ext/pg_query/src_backend_nodes_bitmapset.c +11 -70
  416. data/ext/pg_query/src_backend_nodes_copyfuncs.c +96 -6202
  417. data/ext/pg_query/src_backend_nodes_equalfuncs.c +95 -4068
  418. data/ext/pg_query/src_backend_nodes_extensible.c +6 -29
  419. data/ext/pg_query/src_backend_nodes_list.c +14 -2
  420. data/ext/pg_query/src_backend_nodes_makefuncs.c +95 -1
  421. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +283 -132
  422. data/ext/pg_query/src_backend_nodes_value.c +1 -1
  423. data/ext/pg_query/src_backend_parser_gram.c +33208 -31806
  424. data/ext/pg_query/src_backend_parser_parser.c +28 -2
  425. data/ext/pg_query/src_backend_parser_scan.c +4318 -3329
  426. data/ext/pg_query/src_backend_parser_scansup.c +1 -1
  427. data/ext/pg_query/src_backend_postmaster_postmaster.c +129 -110
  428. data/ext/pg_query/src_backend_storage_ipc_ipc.c +1 -1
  429. data/ext/pg_query/src_backend_tcop_postgres.c +66 -87
  430. data/ext/pg_query/src_backend_utils_activity_pgstat_database.c +1 -1
  431. data/ext/pg_query/src_backend_utils_adt_datum.c +5 -7
  432. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +1 -1
  433. data/ext/pg_query/src_backend_utils_adt_format_type.c +1 -1
  434. data/ext/pg_query/src_backend_utils_adt_numutils.c +489 -0
  435. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +79 -5
  436. data/ext/pg_query/src_backend_utils_error_assert.c +4 -7
  437. data/ext/pg_query/src_backend_utils_error_elog.c +354 -97
  438. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +33 -1
  439. data/ext/pg_query/src_backend_utils_init_globals.c +5 -2
  440. data/ext/pg_query/src_backend_utils_mb_mbutils.c +13 -4
  441. data/ext/pg_query/src_backend_utils_misc_guc_tables.c +494 -0
  442. data/ext/pg_query/src_backend_utils_mmgr_alignedalloc.c +163 -0
  443. data/ext/pg_query/src_backend_utils_mmgr_aset.c +449 -312
  444. data/ext/pg_query/src_backend_utils_mmgr_generation.c +1039 -0
  445. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +398 -49
  446. data/ext/pg_query/src_backend_utils_mmgr_slab.c +1021 -0
  447. data/ext/pg_query/src_common_encnames.c +4 -1
  448. data/ext/pg_query/src_common_hashfn.c +1 -1
  449. data/ext/pg_query/src_common_keywords.c +1 -1
  450. data/ext/pg_query/src_common_kwlist_d.h +534 -510
  451. data/ext/pg_query/src_common_kwlookup.c +1 -1
  452. data/ext/pg_query/src_common_psprintf.c +1 -1
  453. data/ext/pg_query/src_common_stringinfo.c +4 -4
  454. data/ext/pg_query/src_common_wchar.c +9 -8
  455. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1 -1
  456. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +3 -1
  457. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +661 -694
  458. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +1 -1
  459. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +1 -1
  460. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +1 -1
  461. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +48 -46
  462. data/ext/pg_query/src_port_pg_bitutils.c +1 -1
  463. data/ext/pg_query/src_port_pgstrcasecmp.c +29 -1
  464. data/ext/pg_query/src_port_snprintf.c +3 -7
  465. data/ext/pg_query/src_port_strerror.c +1 -1
  466. data/ext/pg_query/src_port_strnlen.c +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +166 -3191
  468. data/lib/pg_query/treewalker.rb +7 -2
  469. data/lib/pg_query/version.rb +1 -1
  470. metadata +43 -24
  471. data/ext/pg_query/include/catalog/pg_parameter_acl.h +0 -60
  472. data/ext/pg_query/include/catalog/pg_parameter_acl_d.h +0 -34
  473. data/ext/pg_query/include/commands/variable.h +0 -38
  474. data/ext/pg_query/include/getaddrinfo.h +0 -162
  475. data/ext/pg_query/include/parser/gram.h +0 -1101
  476. data/ext/pg_query/include/storage/relfilenode.h +0 -99
  477. data/ext/pg_query/include/utils/dynahash.h +0 -20
  478. data/ext/pg_query/include/utils/pg_lsn.h +0 -29
  479. data/ext/pg_query/include/utils/rls.h +0 -50
  480. data/ext/pg_query/include/utils/tzparser.h +0 -39
  481. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +0 -371
  482. data/ext/pg_query/src_backend_utils_hash_dynahash.c +0 -1116
  483. data/ext/pg_query/src_backend_utils_misc_guc.c +0 -1993
  484. data/ext/pg_query/src_common_pg_prng.c +0 -152
  485. data/ext/pg_query/src_common_string.c +0 -92
  486. data/ext/pg_query/src_port_pgsleep.c +0 -69
@@ -1,99 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * relfilenode.h
4
- * Physical access information for relations.
5
- *
6
- *
7
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
- * Portions Copyright (c) 1994, Regents of the University of California
9
- *
10
- * src/include/storage/relfilenode.h
11
- *
12
- *-------------------------------------------------------------------------
13
- */
14
- #ifndef RELFILENODE_H
15
- #define RELFILENODE_H
16
-
17
- #include "common/relpath.h"
18
- #include "storage/backendid.h"
19
-
20
- /*
21
- * RelFileNode must provide all that we need to know to physically access
22
- * a relation, with the exception of the backend ID, which can be provided
23
- * separately. Note, however, that a "physical" relation is comprised of
24
- * multiple files on the filesystem, as each fork is stored as a separate
25
- * file, and each fork can be divided into multiple segments. See md.c.
26
- *
27
- * spcNode identifies the tablespace of the relation. It corresponds to
28
- * pg_tablespace.oid.
29
- *
30
- * dbNode identifies the database of the relation. It is zero for
31
- * "shared" relations (those common to all databases of a cluster).
32
- * Nonzero dbNode values correspond to pg_database.oid.
33
- *
34
- * relNode identifies the specific relation. relNode corresponds to
35
- * pg_class.relfilenode (NOT pg_class.oid, because we need to be able
36
- * to assign new physical files to relations in some situations).
37
- * Notice that relNode is only unique within a database in a particular
38
- * tablespace.
39
- *
40
- * Note: spcNode must be GLOBALTABLESPACE_OID if and only if dbNode is
41
- * zero. We support shared relations only in the "global" tablespace.
42
- *
43
- * Note: in pg_class we allow reltablespace == 0 to denote that the
44
- * relation is stored in its database's "default" tablespace (as
45
- * identified by pg_database.dattablespace). However this shorthand
46
- * is NOT allowed in RelFileNode structs --- the real tablespace ID
47
- * must be supplied when setting spcNode.
48
- *
49
- * Note: in pg_class, relfilenode can be zero to denote that the relation
50
- * is a "mapped" relation, whose current true filenode number is available
51
- * from relmapper.c. Again, this case is NOT allowed in RelFileNodes.
52
- *
53
- * Note: various places use RelFileNode in hashtable keys. Therefore,
54
- * there *must not* be any unused padding bytes in this struct. That
55
- * should be safe as long as all the fields are of type Oid.
56
- */
57
- typedef struct RelFileNode
58
- {
59
- Oid spcNode; /* tablespace */
60
- Oid dbNode; /* database */
61
- Oid relNode; /* relation */
62
- } RelFileNode;
63
-
64
- /*
65
- * Augmenting a relfilenode with the backend ID provides all the information
66
- * we need to locate the physical storage. The backend ID is InvalidBackendId
67
- * for regular relations (those accessible to more than one backend), or the
68
- * owning backend's ID for backend-local relations. Backend-local relations
69
- * are always transient and removed in case of a database crash; they are
70
- * never WAL-logged or fsync'd.
71
- */
72
- typedef struct RelFileNodeBackend
73
- {
74
- RelFileNode node;
75
- BackendId backend;
76
- } RelFileNodeBackend;
77
-
78
- #define RelFileNodeBackendIsTemp(rnode) \
79
- ((rnode).backend != InvalidBackendId)
80
-
81
- /*
82
- * Note: RelFileNodeEquals and RelFileNodeBackendEquals compare relNode first
83
- * since that is most likely to be different in two unequal RelFileNodes. It
84
- * is probably redundant to compare spcNode if the other fields are found equal,
85
- * but do it anyway to be sure. Likewise for checking the backend ID in
86
- * RelFileNodeBackendEquals.
87
- */
88
- #define RelFileNodeEquals(node1, node2) \
89
- ((node1).relNode == (node2).relNode && \
90
- (node1).dbNode == (node2).dbNode && \
91
- (node1).spcNode == (node2).spcNode)
92
-
93
- #define RelFileNodeBackendEquals(node1, node2) \
94
- ((node1).node.relNode == (node2).node.relNode && \
95
- (node1).node.dbNode == (node2).node.dbNode && \
96
- (node1).backend == (node2).backend && \
97
- (node1).node.spcNode == (node2).node.spcNode)
98
-
99
- #endif /* RELFILENODE_H */
@@ -1,20 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * dynahash.h
4
- * POSTGRES dynahash.h file definitions
5
- *
6
- *
7
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8
- * Portions Copyright (c) 1994, Regents of the University of California
9
- *
10
- * IDENTIFICATION
11
- * src/include/utils/dynahash.h
12
- *
13
- *-------------------------------------------------------------------------
14
- */
15
- #ifndef DYNAHASH_H
16
- #define DYNAHASH_H
17
-
18
- extern int my_log2(long num);
19
-
20
- #endif /* DYNAHASH_H */
@@ -1,29 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * pg_lsn.h
4
- * Declarations for operations on log sequence numbers (LSNs) of
5
- * PostgreSQL.
6
- *
7
- *
8
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
9
- * Portions Copyright (c) 1994, Regents of the University of California
10
- *
11
- * src/include/utils/pg_lsn.h
12
- *
13
- *-------------------------------------------------------------------------
14
- */
15
- #ifndef PG_LSN_H
16
- #define PG_LSN_H
17
-
18
- #include "access/xlogdefs.h"
19
- #include "fmgr.h"
20
-
21
- #define DatumGetLSN(X) ((XLogRecPtr) DatumGetInt64(X))
22
- #define LSNGetDatum(X) (Int64GetDatum((int64) (X)))
23
-
24
- #define PG_GETARG_LSN(n) DatumGetLSN(PG_GETARG_DATUM(n))
25
- #define PG_RETURN_LSN(x) return LSNGetDatum(x)
26
-
27
- extern XLogRecPtr pg_lsn_in_internal(const char *str, bool *have_error);
28
-
29
- #endif /* PG_LSN_H */
@@ -1,50 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * rls.h
4
- * Header file for Row Level Security (RLS) utility commands to be used
5
- * with the rowsecurity feature.
6
- *
7
- * Copyright (c) 2007-2022, PostgreSQL Global Development Group
8
- *
9
- * src/include/utils/rls.h
10
- *
11
- *-------------------------------------------------------------------------
12
- */
13
- #ifndef RLS_H
14
- #define RLS_H
15
-
16
- /* GUC variable */
17
- extern PGDLLIMPORT bool row_security;
18
-
19
- /*
20
- * Used by callers of check_enable_rls.
21
- *
22
- * RLS could be completely disabled on the tables involved in the query,
23
- * which is the simple case, or it may depend on the current environment
24
- * (the role which is running the query or the value of the row_security
25
- * GUC), or it might be simply enabled as usual.
26
- *
27
- * If RLS isn't on the table involved then RLS_NONE is returned to indicate
28
- * that we don't need to worry about invalidating the query plan for RLS
29
- * reasons. If RLS is on the table, but we are bypassing it for now, then
30
- * we return RLS_NONE_ENV to indicate that, if the environment changes,
31
- * we need to invalidate and replan. Finally, if RLS should be turned on
32
- * for the query, then we return RLS_ENABLED, which means we also need to
33
- * invalidate if the environment changes.
34
- *
35
- * Note that RLS_ENABLED will also be returned if noError is true
36
- * (indicating that the caller simply want to know if RLS should be applied
37
- * for this user but doesn't want an error thrown if it is; this is used
38
- * by other error cases where we're just trying to decide if data from the
39
- * table should be passed back to the user or not).
40
- */
41
- enum CheckEnableRlsResult
42
- {
43
- RLS_NONE,
44
- RLS_NONE_ENV,
45
- RLS_ENABLED
46
- };
47
-
48
- extern int check_enable_rls(Oid relid, Oid checkAsUser, bool noError);
49
-
50
- #endif /* RLS_H */
@@ -1,39 +0,0 @@
1
- /*-------------------------------------------------------------------------
2
- *
3
- * tzparser.h
4
- * Timezone offset file parsing definitions.
5
- *
6
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7
- * Portions Copyright (c) 1994, Regents of the University of California
8
- *
9
- * src/include/utils/tzparser.h
10
- *
11
- *-------------------------------------------------------------------------
12
- */
13
- #ifndef TZPARSER_H
14
- #define TZPARSER_H
15
-
16
- #include "utils/datetime.h"
17
-
18
- /*
19
- * The result of parsing a timezone configuration file is an array of
20
- * these structs, in order by abbrev. We export this because datetime.c
21
- * needs it.
22
- */
23
- typedef struct tzEntry
24
- {
25
- /* the actual data */
26
- char *abbrev; /* TZ abbreviation (downcased) */
27
- char *zone; /* zone name if dynamic abbrev, else NULL */
28
- /* for a dynamic abbreviation, offset/is_dst are not used */
29
- int offset; /* offset in seconds from UTC */
30
- bool is_dst; /* true if a DST abbreviation */
31
- /* source information (for error messages) */
32
- int lineno;
33
- const char *filename;
34
- } tzEntry;
35
-
36
-
37
- extern TimeZoneAbbrevTable *load_tzoffsets(const char *filename);
38
-
39
- #endif /* TZPARSER_H */
@@ -1,371 +0,0 @@
1
- /*--------------------------------------------------------------------
2
- * Symbols referenced in this file:
3
- * - s_lock
4
- * - perform_spin_delay
5
- * - spins_per_delay
6
- * - s_lock_stuck
7
- * - finish_spin_delay
8
- *--------------------------------------------------------------------
9
- */
10
-
11
- /*-------------------------------------------------------------------------
12
- *
13
- * s_lock.c
14
- * Hardware-dependent implementation of spinlocks.
15
- *
16
- * When waiting for a contended spinlock we loop tightly for awhile, then
17
- * delay using pg_usleep() and try again. Preferably, "awhile" should be a
18
- * small multiple of the maximum time we expect a spinlock to be held. 100
19
- * iterations seems about right as an initial guess. However, on a
20
- * uniprocessor the loop is a waste of cycles, while in a multi-CPU scenario
21
- * it's usually better to spin a bit longer than to call the kernel, so we try
22
- * to adapt the spin loop count depending on whether we seem to be in a
23
- * uniprocessor or multiprocessor.
24
- *
25
- * Note: you might think MIN_SPINS_PER_DELAY should be just 1, but you'd
26
- * be wrong; there are platforms where that can result in a "stuck
27
- * spinlock" failure. This has been seen particularly on Alphas; it seems
28
- * that the first TAS after returning from kernel space will always fail
29
- * on that hardware.
30
- *
31
- * Once we do decide to block, we use randomly increasing pg_usleep()
32
- * delays. The first delay is 1 msec, then the delay randomly increases to
33
- * about one second, after which we reset to 1 msec and start again. The
34
- * idea here is that in the presence of heavy contention we need to
35
- * increase the delay, else the spinlock holder may never get to run and
36
- * release the lock. (Consider situation where spinlock holder has been
37
- * nice'd down in priority by the scheduler --- it will not get scheduled
38
- * until all would-be acquirers are sleeping, so if we always use a 1-msec
39
- * sleep, there is a real possibility of starvation.) But we can't just
40
- * clamp the delay to an upper bound, else it would take a long time to
41
- * make a reasonable number of tries.
42
- *
43
- * We time out and declare error after NUM_DELAYS delays (thus, exactly
44
- * that many tries). With the given settings, this will usually take 2 or
45
- * so minutes. It seems better to fix the total number of tries (and thus
46
- * the probability of unintended failure) than to fix the total time
47
- * spent.
48
- *
49
- * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
50
- * Portions Copyright (c) 1994, Regents of the University of California
51
- *
52
- *
53
- * IDENTIFICATION
54
- * src/backend/storage/lmgr/s_lock.c
55
- *
56
- *-------------------------------------------------------------------------
57
- */
58
- #include "postgres.h"
59
-
60
- #include <time.h>
61
- #include <unistd.h>
62
-
63
- #include "common/pg_prng.h"
64
- #include "port/atomics.h"
65
- #include "storage/s_lock.h"
66
-
67
- #define MIN_SPINS_PER_DELAY 10
68
- #define MAX_SPINS_PER_DELAY 1000
69
- #define NUM_DELAYS 1000
70
- #define MIN_DELAY_USEC 1000L
71
- #define MAX_DELAY_USEC 1000000L
72
-
73
-
74
-
75
-
76
- static __thread int spins_per_delay = DEFAULT_SPINS_PER_DELAY;
77
-
78
-
79
-
80
- /*
81
- * s_lock_stuck() - complain about a stuck spinlock
82
- */
83
- static void
84
- s_lock_stuck(const char *file, int line, const char *func)
85
- {
86
- if (!func)
87
- func = "(unknown)";
88
- #if defined(S_LOCK_TEST)
89
- fprintf(stderr,
90
- "\nStuck spinlock detected at %s, %s:%d.\n",
91
- func, file, line);
92
- exit(1);
93
- #else
94
- elog(PANIC, "stuck spinlock detected at %s, %s:%d",
95
- func, file, line);
96
- #endif
97
- }
98
-
99
- /*
100
- * s_lock(lock) - platform-independent portion of waiting for a spinlock.
101
- */
102
- int
103
- s_lock(volatile slock_t *lock, const char *file, int line, const char *func)
104
- {
105
- SpinDelayStatus delayStatus;
106
-
107
- init_spin_delay(&delayStatus, file, line, func);
108
-
109
- while (TAS_SPIN(lock))
110
- {
111
- perform_spin_delay(&delayStatus);
112
- }
113
-
114
- finish_spin_delay(&delayStatus);
115
-
116
- return delayStatus.delays;
117
- }
118
-
119
- #ifdef USE_DEFAULT_S_UNLOCK
120
- void
121
- s_unlock(volatile slock_t *lock)
122
- {
123
- #ifdef TAS_ACTIVE_WORD
124
- /* HP's PA-RISC */
125
- *TAS_ACTIVE_WORD(lock) = -1;
126
- #else
127
- *lock = 0;
128
- #endif
129
- }
130
- #endif
131
-
132
- /*
133
- * Wait while spinning on a contended spinlock.
134
- */
135
- void
136
- perform_spin_delay(SpinDelayStatus *status)
137
- {
138
- /* CPU-specific delay each time through the loop */
139
- SPIN_DELAY();
140
-
141
- /* Block the process every spins_per_delay tries */
142
- if (++(status->spins) >= spins_per_delay)
143
- {
144
- if (++(status->delays) > NUM_DELAYS)
145
- s_lock_stuck(status->file, status->line, status->func);
146
-
147
- if (status->cur_delay == 0) /* first time to delay? */
148
- status->cur_delay = MIN_DELAY_USEC;
149
-
150
- pg_usleep(status->cur_delay);
151
-
152
- #if defined(S_LOCK_TEST)
153
- fprintf(stdout, "*");
154
- fflush(stdout);
155
- #endif
156
-
157
- /* increase delay by a random fraction between 1X and 2X */
158
- status->cur_delay += (int) (status->cur_delay *
159
- pg_prng_double(&pg_global_prng_state) + 0.5);
160
- /* wrap back to minimum delay when max is exceeded */
161
- if (status->cur_delay > MAX_DELAY_USEC)
162
- status->cur_delay = MIN_DELAY_USEC;
163
-
164
- status->spins = 0;
165
- }
166
- }
167
-
168
- /*
169
- * After acquiring a spinlock, update estimates about how long to loop.
170
- *
171
- * If we were able to acquire the lock without delaying, it's a good
172
- * indication we are in a multiprocessor. If we had to delay, it's a sign
173
- * (but not a sure thing) that we are in a uniprocessor. Hence, we
174
- * decrement spins_per_delay slowly when we had to delay, and increase it
175
- * rapidly when we didn't. It's expected that spins_per_delay will
176
- * converge to the minimum value on a uniprocessor and to the maximum
177
- * value on a multiprocessor.
178
- *
179
- * Note: spins_per_delay is local within our current process. We want to
180
- * average these observations across multiple backends, since it's
181
- * relatively rare for this function to even get entered, and so a single
182
- * backend might not live long enough to converge on a good value. That
183
- * is handled by the two routines below.
184
- */
185
- void
186
- finish_spin_delay(SpinDelayStatus *status)
187
- {
188
- if (status->cur_delay == 0)
189
- {
190
- /* we never had to delay */
191
- if (spins_per_delay < MAX_SPINS_PER_DELAY)
192
- spins_per_delay = Min(spins_per_delay + 100, MAX_SPINS_PER_DELAY);
193
- }
194
- else
195
- {
196
- if (spins_per_delay > MIN_SPINS_PER_DELAY)
197
- spins_per_delay = Max(spins_per_delay - 1, MIN_SPINS_PER_DELAY);
198
- }
199
- }
200
-
201
- /*
202
- * Set local copy of spins_per_delay during backend startup.
203
- *
204
- * NB: this has to be pretty fast as it is called while holding a spinlock
205
- */
206
-
207
-
208
- /*
209
- * Update shared estimate of spins_per_delay during backend exit.
210
- *
211
- * NB: this has to be pretty fast as it is called while holding a spinlock
212
- */
213
-
214
-
215
-
216
- /*
217
- * Various TAS implementations that cannot live in s_lock.h as no inline
218
- * definition exists (yet).
219
- * In the future, get rid of tas.[cso] and fold it into this file.
220
- *
221
- * If you change something here, you will likely need to modify s_lock.h too,
222
- * because the definitions for these are split between this file and s_lock.h.
223
- */
224
-
225
-
226
- #ifdef HAVE_SPINLOCKS /* skip spinlocks if requested */
227
-
228
-
229
- #if defined(__GNUC__)
230
-
231
- /*
232
- * All the gcc flavors that are not inlined
233
- */
234
-
235
-
236
- /*
237
- * Note: all the if-tests here probably ought to be testing gcc version
238
- * rather than platform, but I don't have adequate info to know what to
239
- * write. Ideally we'd flush all this in favor of the inline version.
240
- */
241
- #if defined(__m68k__) && !defined(__linux__)
242
- /* really means: extern int tas(slock_t* **lock); */
243
- static void
244
- tas_dummy()
245
- {
246
- __asm__ __volatile__(
247
- #if (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(__ELF__)
248
- /* no underscore for label and % for registers */
249
- "\
250
- .global tas \n\
251
- tas: \n\
252
- movel %sp@(0x4),%a0 \n\
253
- tas %a0@ \n\
254
- beq _success \n\
255
- moveq #-128,%d0 \n\
256
- rts \n\
257
- _success: \n\
258
- moveq #0,%d0 \n\
259
- rts \n"
260
- #else
261
- "\
262
- .global _tas \n\
263
- _tas: \n\
264
- movel sp@(0x4),a0 \n\
265
- tas a0@ \n\
266
- beq _success \n\
267
- moveq #-128,d0 \n\
268
- rts \n\
269
- _success: \n\
270
- moveq #0,d0 \n\
271
- rts \n"
272
- #endif /* (__NetBSD__ || __OpenBSD__) && __ELF__ */
273
- );
274
- }
275
- #endif /* __m68k__ && !__linux__ */
276
- #endif /* not __GNUC__ */
277
- #endif /* HAVE_SPINLOCKS */
278
-
279
-
280
-
281
- /*****************************************************************************/
282
- #if defined(S_LOCK_TEST)
283
-
284
- /*
285
- * test program for verifying a port's spinlock support.
286
- */
287
-
288
- struct test_lock_struct
289
- {
290
- char pad1;
291
- slock_t lock;
292
- char pad2;
293
- };
294
-
295
- volatile struct test_lock_struct test_lock;
296
-
297
- int
298
- main()
299
- {
300
- pg_prng_seed(&pg_global_prng_state, (uint64) time(NULL));
301
-
302
- test_lock.pad1 = test_lock.pad2 = 0x44;
303
-
304
- S_INIT_LOCK(&test_lock.lock);
305
-
306
- if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
307
- {
308
- printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
309
- return 1;
310
- }
311
-
312
- if (!S_LOCK_FREE(&test_lock.lock))
313
- {
314
- printf("S_LOCK_TEST: failed, lock not initialized\n");
315
- return 1;
316
- }
317
-
318
- S_LOCK(&test_lock.lock);
319
-
320
- if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
321
- {
322
- printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
323
- return 1;
324
- }
325
-
326
- if (S_LOCK_FREE(&test_lock.lock))
327
- {
328
- printf("S_LOCK_TEST: failed, lock not locked\n");
329
- return 1;
330
- }
331
-
332
- S_UNLOCK(&test_lock.lock);
333
-
334
- if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
335
- {
336
- printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
337
- return 1;
338
- }
339
-
340
- if (!S_LOCK_FREE(&test_lock.lock))
341
- {
342
- printf("S_LOCK_TEST: failed, lock not unlocked\n");
343
- return 1;
344
- }
345
-
346
- S_LOCK(&test_lock.lock);
347
-
348
- if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
349
- {
350
- printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
351
- return 1;
352
- }
353
-
354
- if (S_LOCK_FREE(&test_lock.lock))
355
- {
356
- printf("S_LOCK_TEST: failed, lock not re-locked\n");
357
- return 1;
358
- }
359
-
360
- printf("S_LOCK_TEST: this will print %d stars and then\n", NUM_DELAYS);
361
- printf(" exit with a 'stuck spinlock' message\n");
362
- printf(" if S_LOCK() and TAS() are working.\n");
363
- fflush(stdout);
364
-
365
- s_lock(&test_lock.lock, __FILE__, __LINE__, PG_FUNCNAME_MACRO);
366
-
367
- printf("S_LOCK_TEST: failed, lock not locked\n");
368
- return 1;
369
- }
370
-
371
- #endif /* S_LOCK_TEST */