gitlab-pg_query 1.3.1 → 2.0.4

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 (480) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +217 -99
  3. data/README.md +92 -69
  4. data/Rakefile +85 -5
  5. data/ext/pg_query/extconf.rb +3 -40
  6. data/ext/pg_query/guc-file.c +0 -0
  7. data/ext/pg_query/include/access/amapi.h +246 -0
  8. data/ext/pg_query/include/access/attmap.h +52 -0
  9. data/ext/pg_query/include/access/attnum.h +64 -0
  10. data/ext/pg_query/include/access/clog.h +61 -0
  11. data/ext/pg_query/include/access/commit_ts.h +77 -0
  12. data/ext/pg_query/include/access/detoast.h +92 -0
  13. data/ext/pg_query/include/access/genam.h +228 -0
  14. data/ext/pg_query/include/access/gin.h +78 -0
  15. data/ext/pg_query/include/access/htup.h +89 -0
  16. data/ext/pg_query/include/access/htup_details.h +819 -0
  17. data/ext/pg_query/include/access/itup.h +161 -0
  18. data/ext/pg_query/include/access/parallel.h +82 -0
  19. data/ext/pg_query/include/access/printtup.h +35 -0
  20. data/ext/pg_query/include/access/relation.h +28 -0
  21. data/ext/pg_query/include/access/relscan.h +176 -0
  22. data/ext/pg_query/include/access/rmgr.h +35 -0
  23. data/ext/pg_query/include/access/rmgrlist.h +49 -0
  24. data/ext/pg_query/include/access/sdir.h +58 -0
  25. data/ext/pg_query/include/access/skey.h +151 -0
  26. data/ext/pg_query/include/access/stratnum.h +83 -0
  27. data/ext/pg_query/include/access/sysattr.h +29 -0
  28. data/ext/pg_query/include/access/table.h +27 -0
  29. data/ext/pg_query/include/access/tableam.h +1825 -0
  30. data/ext/pg_query/include/access/transam.h +265 -0
  31. data/ext/pg_query/include/access/tupconvert.h +51 -0
  32. data/ext/pg_query/include/access/tupdesc.h +154 -0
  33. data/ext/pg_query/include/access/tupmacs.h +247 -0
  34. data/ext/pg_query/include/access/twophase.h +61 -0
  35. data/ext/pg_query/include/access/xact.h +463 -0
  36. data/ext/pg_query/include/access/xlog.h +398 -0
  37. data/ext/pg_query/include/access/xlog_internal.h +330 -0
  38. data/ext/pg_query/include/access/xlogdefs.h +109 -0
  39. data/ext/pg_query/include/access/xloginsert.h +64 -0
  40. data/ext/pg_query/include/access/xlogreader.h +327 -0
  41. data/ext/pg_query/include/access/xlogrecord.h +227 -0
  42. data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
  43. data/ext/pg_query/include/c.h +1322 -0
  44. data/ext/pg_query/include/catalog/catalog.h +42 -0
  45. data/ext/pg_query/include/catalog/catversion.h +58 -0
  46. data/ext/pg_query/include/catalog/dependency.h +275 -0
  47. data/ext/pg_query/include/catalog/genbki.h +64 -0
  48. data/ext/pg_query/include/catalog/index.h +199 -0
  49. data/ext/pg_query/include/catalog/indexing.h +366 -0
  50. data/ext/pg_query/include/catalog/namespace.h +188 -0
  51. data/ext/pg_query/include/catalog/objectaccess.h +197 -0
  52. data/ext/pg_query/include/catalog/objectaddress.h +84 -0
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
  55. data/ext/pg_query/include/catalog/pg_am.h +60 -0
  56. data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
  57. data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
  59. data/ext/pg_query/include/catalog/pg_authid.h +58 -0
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
  61. data/ext/pg_query/include/catalog/pg_class.h +200 -0
  62. data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
  63. data/ext/pg_query/include/catalog/pg_collation.h +73 -0
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
  65. data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
  67. data/ext/pg_query/include/catalog/pg_control.h +250 -0
  68. data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
  70. data/ext/pg_query/include/catalog/pg_depend.h +73 -0
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
  74. data/ext/pg_query/include/catalog/pg_index.h +80 -0
  75. data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
  76. data/ext/pg_query/include/catalog/pg_language.h +67 -0
  77. data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
  78. data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
  80. data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
  82. data/ext/pg_query/include/catalog/pg_operator.h +102 -0
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
  88. data/ext/pg_query/include/catalog/pg_proc.h +211 -0
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
  90. data/ext/pg_query/include/catalog/pg_publication.h +115 -0
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
  94. data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
  98. data/ext/pg_query/include/catalog/pg_transform.h +45 -0
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
  100. data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
  110. data/ext/pg_query/include/catalog/pg_type.h +372 -0
  111. data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
  112. data/ext/pg_query/include/catalog/storage.h +48 -0
  113. data/ext/pg_query/include/commands/async.h +54 -0
  114. data/ext/pg_query/include/commands/dbcommands.h +35 -0
  115. data/ext/pg_query/include/commands/defrem.h +173 -0
  116. data/ext/pg_query/include/commands/event_trigger.h +88 -0
  117. data/ext/pg_query/include/commands/explain.h +127 -0
  118. data/ext/pg_query/include/commands/prepare.h +61 -0
  119. data/ext/pg_query/include/commands/tablespace.h +67 -0
  120. data/ext/pg_query/include/commands/trigger.h +277 -0
  121. data/ext/pg_query/include/commands/user.h +37 -0
  122. data/ext/pg_query/include/commands/vacuum.h +293 -0
  123. data/ext/pg_query/include/commands/variable.h +38 -0
  124. data/ext/pg_query/include/common/file_perm.h +56 -0
  125. data/ext/pg_query/include/common/hashfn.h +104 -0
  126. data/ext/pg_query/include/common/ip.h +37 -0
  127. data/ext/pg_query/include/common/keywords.h +33 -0
  128. data/ext/pg_query/include/common/kwlookup.h +44 -0
  129. data/ext/pg_query/include/common/relpath.h +90 -0
  130. data/ext/pg_query/include/common/string.h +19 -0
  131. data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
  132. data/ext/pg_query/include/datatype/timestamp.h +197 -0
  133. data/ext/pg_query/include/executor/execdesc.h +70 -0
  134. data/ext/pg_query/include/executor/executor.h +614 -0
  135. data/ext/pg_query/include/executor/functions.h +41 -0
  136. data/ext/pg_query/include/executor/instrument.h +101 -0
  137. data/ext/pg_query/include/executor/spi.h +175 -0
  138. data/ext/pg_query/include/executor/tablefunc.h +67 -0
  139. data/ext/pg_query/include/executor/tuptable.h +487 -0
  140. data/ext/pg_query/include/fmgr.h +775 -0
  141. data/ext/pg_query/include/funcapi.h +348 -0
  142. data/ext/pg_query/include/getaddrinfo.h +162 -0
  143. data/ext/pg_query/include/jit/jit.h +105 -0
  144. data/ext/pg_query/include/kwlist_d.h +1072 -0
  145. data/ext/pg_query/include/lib/ilist.h +727 -0
  146. data/ext/pg_query/include/lib/pairingheap.h +102 -0
  147. data/ext/pg_query/include/lib/simplehash.h +1059 -0
  148. data/ext/pg_query/include/lib/stringinfo.h +161 -0
  149. data/ext/pg_query/include/libpq/auth.h +29 -0
  150. data/ext/pg_query/include/libpq/crypt.h +46 -0
  151. data/ext/pg_query/include/libpq/hba.h +140 -0
  152. data/ext/pg_query/include/libpq/libpq-be.h +326 -0
  153. data/ext/pg_query/include/libpq/libpq.h +133 -0
  154. data/ext/pg_query/include/libpq/pqcomm.h +208 -0
  155. data/ext/pg_query/include/libpq/pqformat.h +210 -0
  156. data/ext/pg_query/include/libpq/pqsignal.h +42 -0
  157. data/ext/pg_query/include/mb/pg_wchar.h +672 -0
  158. data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
  159. data/ext/pg_query/include/miscadmin.h +476 -0
  160. data/ext/pg_query/include/nodes/bitmapset.h +122 -0
  161. data/ext/pg_query/include/nodes/execnodes.h +2520 -0
  162. data/ext/pg_query/include/nodes/extensible.h +160 -0
  163. data/ext/pg_query/include/nodes/lockoptions.h +61 -0
  164. data/ext/pg_query/include/nodes/makefuncs.h +108 -0
  165. data/ext/pg_query/include/nodes/memnodes.h +108 -0
  166. data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
  167. data/ext/pg_query/include/nodes/nodes.h +842 -0
  168. data/ext/pg_query/include/nodes/params.h +170 -0
  169. data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
  170. data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
  171. data/ext/pg_query/include/nodes/pg_list.h +605 -0
  172. data/ext/pg_query/include/nodes/plannodes.h +1251 -0
  173. data/ext/pg_query/include/nodes/primnodes.h +1541 -0
  174. data/ext/pg_query/include/nodes/print.h +34 -0
  175. data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
  176. data/ext/pg_query/include/nodes/value.h +61 -0
  177. data/ext/pg_query/include/optimizer/cost.h +206 -0
  178. data/ext/pg_query/include/optimizer/geqo.h +88 -0
  179. data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
  180. data/ext/pg_query/include/optimizer/optimizer.h +199 -0
  181. data/ext/pg_query/include/optimizer/paths.h +249 -0
  182. data/ext/pg_query/include/optimizer/planmain.h +119 -0
  183. data/ext/pg_query/include/parser/analyze.h +49 -0
  184. data/ext/pg_query/include/parser/gram.h +1067 -0
  185. data/ext/pg_query/include/parser/gramparse.h +75 -0
  186. data/ext/pg_query/include/parser/kwlist.h +477 -0
  187. data/ext/pg_query/include/parser/parse_agg.h +68 -0
  188. data/ext/pg_query/include/parser/parse_clause.h +54 -0
  189. data/ext/pg_query/include/parser/parse_coerce.h +97 -0
  190. data/ext/pg_query/include/parser/parse_collate.h +27 -0
  191. data/ext/pg_query/include/parser/parse_expr.h +26 -0
  192. data/ext/pg_query/include/parser/parse_func.h +73 -0
  193. data/ext/pg_query/include/parser/parse_node.h +327 -0
  194. data/ext/pg_query/include/parser/parse_oper.h +67 -0
  195. data/ext/pg_query/include/parser/parse_relation.h +123 -0
  196. data/ext/pg_query/include/parser/parse_target.h +46 -0
  197. data/ext/pg_query/include/parser/parse_type.h +60 -0
  198. data/ext/pg_query/include/parser/parser.h +41 -0
  199. data/ext/pg_query/include/parser/parsetree.h +61 -0
  200. data/ext/pg_query/include/parser/scanner.h +152 -0
  201. data/ext/pg_query/include/parser/scansup.h +30 -0
  202. data/ext/pg_query/include/partitioning/partdefs.h +26 -0
  203. data/ext/pg_query/include/pg_config.h +989 -0
  204. data/ext/pg_query/include/pg_config_ext.h +8 -0
  205. data/ext/pg_query/include/pg_config_manual.h +350 -0
  206. data/ext/pg_query/include/pg_config_os.h +8 -0
  207. data/ext/pg_query/include/pg_getopt.h +56 -0
  208. data/ext/pg_query/include/pg_query.h +121 -0
  209. data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
  212. data/ext/pg_query/include/pg_query_json_helper.c +61 -0
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
  217. data/ext/pg_query/include/pg_trace.h +17 -0
  218. data/ext/pg_query/include/pgstat.h +1487 -0
  219. data/ext/pg_query/include/pgtime.h +84 -0
  220. data/ext/pg_query/include/pl_gram.h +385 -0
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
  225. data/ext/pg_query/include/plerrcodes.h +990 -0
  226. data/ext/pg_query/include/plpgsql.h +1347 -0
  227. data/ext/pg_query/include/port.h +524 -0
  228. data/ext/pg_query/include/port/atomics.h +524 -0
  229. data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
  230. data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
  231. data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
  232. data/ext/pg_query/include/port/atomics/fallback.h +170 -0
  233. data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
  234. data/ext/pg_query/include/port/atomics/generic.h +401 -0
  235. data/ext/pg_query/include/port/pg_bitutils.h +226 -0
  236. data/ext/pg_query/include/port/pg_bswap.h +161 -0
  237. data/ext/pg_query/include/port/pg_crc32c.h +101 -0
  238. data/ext/pg_query/include/portability/instr_time.h +256 -0
  239. data/ext/pg_query/include/postgres.h +764 -0
  240. data/ext/pg_query/include/postgres_ext.h +74 -0
  241. data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +161 -0
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
  244. data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
  245. data/ext/pg_query/include/postmaster/fork_process.h +17 -0
  246. data/ext/pg_query/include/postmaster/interrupt.h +32 -0
  247. data/ext/pg_query/include/postmaster/pgarch.h +39 -0
  248. data/ext/pg_query/include/postmaster/postmaster.h +77 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +98 -0
  250. data/ext/pg_query/include/postmaster/walwriter.h +21 -0
  251. data/ext/pg_query/include/protobuf-c.h +1106 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
  254. data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
  255. data/ext/pg_query/include/regex/regex.h +184 -0
  256. data/ext/pg_query/include/replication/logicallauncher.h +31 -0
  257. data/ext/pg_query/include/replication/logicalproto.h +110 -0
  258. data/ext/pg_query/include/replication/logicalworker.h +19 -0
  259. data/ext/pg_query/include/replication/origin.h +73 -0
  260. data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
  261. data/ext/pg_query/include/replication/slot.h +219 -0
  262. data/ext/pg_query/include/replication/syncrep.h +115 -0
  263. data/ext/pg_query/include/replication/walreceiver.h +340 -0
  264. data/ext/pg_query/include/replication/walsender.h +74 -0
  265. data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
  266. data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
  267. data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
  268. data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
  269. data/ext/pg_query/include/storage/backendid.h +37 -0
  270. data/ext/pg_query/include/storage/block.h +121 -0
  271. data/ext/pg_query/include/storage/buf.h +46 -0
  272. data/ext/pg_query/include/storage/bufmgr.h +292 -0
  273. data/ext/pg_query/include/storage/bufpage.h +459 -0
  274. data/ext/pg_query/include/storage/condition_variable.h +62 -0
  275. data/ext/pg_query/include/storage/dsm.h +61 -0
  276. data/ext/pg_query/include/storage/dsm_impl.h +75 -0
  277. data/ext/pg_query/include/storage/fd.h +168 -0
  278. data/ext/pg_query/include/storage/ipc.h +81 -0
  279. data/ext/pg_query/include/storage/item.h +19 -0
  280. data/ext/pg_query/include/storage/itemid.h +184 -0
  281. data/ext/pg_query/include/storage/itemptr.h +206 -0
  282. data/ext/pg_query/include/storage/large_object.h +100 -0
  283. data/ext/pg_query/include/storage/latch.h +190 -0
  284. data/ext/pg_query/include/storage/lmgr.h +114 -0
  285. data/ext/pg_query/include/storage/lock.h +612 -0
  286. data/ext/pg_query/include/storage/lockdefs.h +59 -0
  287. data/ext/pg_query/include/storage/lwlock.h +232 -0
  288. data/ext/pg_query/include/storage/lwlocknames.h +51 -0
  289. data/ext/pg_query/include/storage/off.h +57 -0
  290. data/ext/pg_query/include/storage/pg_sema.h +61 -0
  291. data/ext/pg_query/include/storage/pg_shmem.h +90 -0
  292. data/ext/pg_query/include/storage/pmsignal.h +94 -0
  293. data/ext/pg_query/include/storage/predicate.h +87 -0
  294. data/ext/pg_query/include/storage/proc.h +333 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +51 -0
  296. data/ext/pg_query/include/storage/procsignal.h +75 -0
  297. data/ext/pg_query/include/storage/relfilenode.h +99 -0
  298. data/ext/pg_query/include/storage/s_lock.h +1047 -0
  299. data/ext/pg_query/include/storage/sharedfileset.h +45 -0
  300. data/ext/pg_query/include/storage/shm_mq.h +85 -0
  301. data/ext/pg_query/include/storage/shm_toc.h +58 -0
  302. data/ext/pg_query/include/storage/shmem.h +81 -0
  303. data/ext/pg_query/include/storage/sinval.h +153 -0
  304. data/ext/pg_query/include/storage/sinvaladt.h +43 -0
  305. data/ext/pg_query/include/storage/smgr.h +109 -0
  306. data/ext/pg_query/include/storage/spin.h +77 -0
  307. data/ext/pg_query/include/storage/standby.h +91 -0
  308. data/ext/pg_query/include/storage/standbydefs.h +74 -0
  309. data/ext/pg_query/include/storage/sync.h +62 -0
  310. data/ext/pg_query/include/tcop/cmdtag.h +58 -0
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
  312. data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
  313. data/ext/pg_query/include/tcop/dest.h +149 -0
  314. data/ext/pg_query/include/tcop/fastpath.h +21 -0
  315. data/ext/pg_query/include/tcop/pquery.h +45 -0
  316. data/ext/pg_query/include/tcop/tcopprot.h +89 -0
  317. data/ext/pg_query/include/tcop/utility.h +108 -0
  318. data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
  319. data/ext/pg_query/include/utils/acl.h +312 -0
  320. data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
  321. data/ext/pg_query/include/utils/array.h +458 -0
  322. data/ext/pg_query/include/utils/builtins.h +127 -0
  323. data/ext/pg_query/include/utils/bytea.h +27 -0
  324. data/ext/pg_query/include/utils/catcache.h +231 -0
  325. data/ext/pg_query/include/utils/date.h +90 -0
  326. data/ext/pg_query/include/utils/datetime.h +343 -0
  327. data/ext/pg_query/include/utils/datum.h +68 -0
  328. data/ext/pg_query/include/utils/dsa.h +123 -0
  329. data/ext/pg_query/include/utils/dynahash.h +19 -0
  330. data/ext/pg_query/include/utils/elog.h +439 -0
  331. data/ext/pg_query/include/utils/errcodes.h +352 -0
  332. data/ext/pg_query/include/utils/expandeddatum.h +159 -0
  333. data/ext/pg_query/include/utils/expandedrecord.h +231 -0
  334. data/ext/pg_query/include/utils/float.h +356 -0
  335. data/ext/pg_query/include/utils/fmgroids.h +2657 -0
  336. data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
  337. data/ext/pg_query/include/utils/fmgrtab.h +48 -0
  338. data/ext/pg_query/include/utils/guc.h +443 -0
  339. data/ext/pg_query/include/utils/guc_tables.h +272 -0
  340. data/ext/pg_query/include/utils/hsearch.h +149 -0
  341. data/ext/pg_query/include/utils/inval.h +64 -0
  342. data/ext/pg_query/include/utils/lsyscache.h +197 -0
  343. data/ext/pg_query/include/utils/memdebug.h +82 -0
  344. data/ext/pg_query/include/utils/memutils.h +225 -0
  345. data/ext/pg_query/include/utils/numeric.h +76 -0
  346. data/ext/pg_query/include/utils/palloc.h +136 -0
  347. data/ext/pg_query/include/utils/partcache.h +102 -0
  348. data/ext/pg_query/include/utils/pg_locale.h +119 -0
  349. data/ext/pg_query/include/utils/pg_lsn.h +29 -0
  350. data/ext/pg_query/include/utils/pidfile.h +56 -0
  351. data/ext/pg_query/include/utils/plancache.h +235 -0
  352. data/ext/pg_query/include/utils/portal.h +241 -0
  353. data/ext/pg_query/include/utils/probes.h +114 -0
  354. data/ext/pg_query/include/utils/ps_status.h +25 -0
  355. data/ext/pg_query/include/utils/queryenvironment.h +74 -0
  356. data/ext/pg_query/include/utils/regproc.h +28 -0
  357. data/ext/pg_query/include/utils/rel.h +644 -0
  358. data/ext/pg_query/include/utils/relcache.h +151 -0
  359. data/ext/pg_query/include/utils/reltrigger.h +81 -0
  360. data/ext/pg_query/include/utils/resowner.h +86 -0
  361. data/ext/pg_query/include/utils/rls.h +50 -0
  362. data/ext/pg_query/include/utils/ruleutils.h +44 -0
  363. data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
  364. data/ext/pg_query/include/utils/snapmgr.h +158 -0
  365. data/ext/pg_query/include/utils/snapshot.h +206 -0
  366. data/ext/pg_query/include/utils/sortsupport.h +276 -0
  367. data/ext/pg_query/include/utils/syscache.h +219 -0
  368. data/ext/pg_query/include/utils/timeout.h +88 -0
  369. data/ext/pg_query/include/utils/timestamp.h +116 -0
  370. data/ext/pg_query/include/utils/tuplesort.h +277 -0
  371. data/ext/pg_query/include/utils/tuplestore.h +91 -0
  372. data/ext/pg_query/include/utils/typcache.h +202 -0
  373. data/ext/pg_query/include/utils/tzparser.h +39 -0
  374. data/ext/pg_query/include/utils/varlena.h +39 -0
  375. data/ext/pg_query/include/utils/xml.h +84 -0
  376. data/ext/pg_query/include/xxhash.h +5445 -0
  377. data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
  378. data/ext/pg_query/pg_query.c +104 -0
  379. data/ext/pg_query/pg_query.pb-c.c +37628 -0
  380. data/ext/pg_query/pg_query_deparse.c +9959 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +295 -0
  382. data/ext/pg_query/pg_query_fingerprint.h +8 -0
  383. data/ext/pg_query/pg_query_internal.h +24 -0
  384. data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
  385. data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
  386. data/ext/pg_query/pg_query_normalize.c +439 -0
  387. data/ext/pg_query/pg_query_outfuncs.h +10 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
  390. data/ext/pg_query/pg_query_parse.c +148 -0
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
  392. data/ext/pg_query/pg_query_readfuncs.h +11 -0
  393. data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
  394. data/ext/pg_query/pg_query_ruby.c +108 -12
  395. data/ext/pg_query/pg_query_scan.c +173 -0
  396. data/ext/pg_query/pg_query_split.c +221 -0
  397. data/ext/pg_query/protobuf-c.c +3660 -0
  398. data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
  399. data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
  400. data/ext/pg_query/src_backend_commands_define.c +117 -0
  401. data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
  402. data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
  403. data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
  404. data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
  405. data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
  406. data/ext/pg_query/src_backend_nodes_list.c +922 -0
  407. data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
  408. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
  409. data/ext/pg_query/src_backend_nodes_value.c +84 -0
  410. data/ext/pg_query/src_backend_parser_gram.c +47456 -0
  411. data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
  412. data/ext/pg_query/src_backend_parser_parser.c +497 -0
  413. data/ext/pg_query/src_backend_parser_scan.c +7091 -0
  414. data/ext/pg_query/src_backend_parser_scansup.c +160 -0
  415. data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
  416. data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
  417. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
  418. data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
  419. data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
  420. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
  421. data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
  422. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
  423. data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
  424. data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
  425. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
  426. data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
  427. data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
  428. data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
  429. data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
  430. data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
  431. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_keywords.c +39 -0
  434. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  435. data/ext/pg_query/src_common_kwlookup.c +91 -0
  436. data/ext/pg_query/src_common_psprintf.c +158 -0
  437. data/ext/pg_query/src_common_string.c +86 -0
  438. data/ext/pg_query/src_common_stringinfo.c +336 -0
  439. data/ext/pg_query/src_common_wchar.c +1651 -0
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  447. data/ext/pg_query/src_port_erand48.c +127 -0
  448. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  449. data/ext/pg_query/src_port_pgsleep.c +69 -0
  450. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  451. data/ext/pg_query/src_port_qsort.c +240 -0
  452. data/ext/pg_query/src_port_random.c +31 -0
  453. data/ext/pg_query/src_port_snprintf.c +1449 -0
  454. data/ext/pg_query/src_port_strerror.c +324 -0
  455. data/ext/pg_query/src_port_strnlen.c +39 -0
  456. data/ext/pg_query/xxhash.c +43 -0
  457. data/lib/pg_query.rb +7 -4
  458. data/lib/pg_query/constants.rb +21 -0
  459. data/lib/pg_query/deparse.rb +15 -1581
  460. data/lib/pg_query/filter_columns.rb +88 -85
  461. data/lib/pg_query/fingerprint.rb +122 -87
  462. data/lib/pg_query/json_field_names.rb +1402 -0
  463. data/lib/pg_query/node.rb +31 -0
  464. data/lib/pg_query/param_refs.rb +42 -37
  465. data/lib/pg_query/parse.rb +220 -203
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3211 -0
  468. data/lib/pg_query/scan.rb +23 -0
  469. data/lib/pg_query/treewalker.rb +24 -40
  470. data/lib/pg_query/truncate.rb +71 -42
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +472 -11
  473. data/ext/pg_query/pg_query_ruby.h +0 -10
  474. data/lib/pg_query/deep_dup.rb +0 -16
  475. data/lib/pg_query/deparse/alter_table.rb +0 -42
  476. data/lib/pg_query/deparse/interval.rb +0 -105
  477. data/lib/pg_query/deparse/keywords.rb +0 -159
  478. data/lib/pg_query/deparse/rename.rb +0 -41
  479. data/lib/pg_query/legacy_parsetree.rb +0 -109
  480. data/lib/pg_query/node_types.rb +0 -296
@@ -0,0 +1,192 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - proc_exit_inprogress
4
+ * - proc_exit
5
+ *--------------------------------------------------------------------
6
+ */
7
+
8
+ /*-------------------------------------------------------------------------
9
+ *
10
+ * ipc.c
11
+ * POSTGRES inter-process communication definitions.
12
+ *
13
+ * This file is misnamed, as it no longer has much of anything directly
14
+ * to do with IPC. The functionality here is concerned with managing
15
+ * exit-time cleanup for either a postmaster or a backend.
16
+ *
17
+ *
18
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
19
+ * Portions Copyright (c) 1994, Regents of the University of California
20
+ *
21
+ *
22
+ * IDENTIFICATION
23
+ * src/backend/storage/ipc/ipc.c
24
+ *
25
+ *-------------------------------------------------------------------------
26
+ */
27
+ #include "postgres.h"
28
+
29
+ #include <signal.h>
30
+ #include <unistd.h>
31
+ #include <sys/stat.h>
32
+
33
+ #include "miscadmin.h"
34
+ #ifdef PROFILE_PID_DIR
35
+ #include "postmaster/autovacuum.h"
36
+ #endif
37
+ #include "storage/dsm.h"
38
+ #include "storage/ipc.h"
39
+ #include "tcop/tcopprot.h"
40
+
41
+
42
+ /*
43
+ * This flag is set during proc_exit() to change ereport()'s behavior,
44
+ * so that an ereport() from an on_proc_exit routine cannot get us out
45
+ * of the exit procedure. We do NOT want to go back to the idle loop...
46
+ */
47
+ __thread bool proc_exit_inprogress = false;
48
+
49
+
50
+ /*
51
+ * Set when shmem_exit() is in progress.
52
+ */
53
+
54
+
55
+ /*
56
+ * This flag tracks whether we've called atexit() in the current process
57
+ * (or in the parent postmaster).
58
+ */
59
+
60
+
61
+ /* local functions */
62
+ static void proc_exit_prepare(int code);
63
+
64
+
65
+ /* ----------------------------------------------------------------
66
+ * exit() handling stuff
67
+ *
68
+ * These functions are in generally the same spirit as atexit(),
69
+ * but provide some additional features we need --- in particular,
70
+ * we want to register callbacks to invoke when we are disconnecting
71
+ * from a broken shared-memory context but not exiting the postmaster.
72
+ *
73
+ * Callback functions can take zero, one, or two args: the first passed
74
+ * arg is the integer exitcode, the second is the Datum supplied when
75
+ * the callback was registered.
76
+ * ----------------------------------------------------------------
77
+ */
78
+
79
+ #define MAX_ON_EXITS 20
80
+
81
+ struct ONEXIT
82
+ {
83
+ pg_on_exit_callback function;
84
+ Datum arg;
85
+ };
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+ /* ----------------------------------------------------------------
97
+ * proc_exit
98
+ *
99
+ * this function calls all the callbacks registered
100
+ * for it (to free resources) and then calls exit.
101
+ *
102
+ * This should be the only function to call exit().
103
+ * -cim 2/6/90
104
+ *
105
+ * Unfortunately, we can't really guarantee that add-on code
106
+ * obeys the rule of not calling exit() directly. So, while
107
+ * this is the preferred way out of the system, we also register
108
+ * an atexit callback that will make sure cleanup happens.
109
+ * ----------------------------------------------------------------
110
+ */
111
+ void proc_exit(int code) { printf("Terminating process due to FATAL error\n"); exit(1); }
112
+
113
+
114
+ /*
115
+ * Code shared between proc_exit and the atexit handler. Note that in
116
+ * normal exit through proc_exit, this will actually be called twice ...
117
+ * but the second call will have nothing to do.
118
+ */
119
+
120
+
121
+ /* ------------------
122
+ * Run all of the on_shmem_exit routines --- but don't actually exit.
123
+ * This is used by the postmaster to re-initialize shared memory and
124
+ * semaphores after a backend dies horribly. As with proc_exit(), we
125
+ * remove each callback from the list before calling it, to avoid
126
+ * infinite loop in case of error.
127
+ * ------------------
128
+ */
129
+
130
+
131
+ /* ----------------------------------------------------------------
132
+ * atexit_callback
133
+ *
134
+ * Backstop to ensure that direct calls of exit() don't mess us up.
135
+ *
136
+ * Somebody who was being really uncooperative could call _exit(),
137
+ * but for that case we have a "dead man switch" that will make the
138
+ * postmaster treat it as a crash --- see pmsignal.c.
139
+ * ----------------------------------------------------------------
140
+ */
141
+
142
+
143
+ /* ----------------------------------------------------------------
144
+ * on_proc_exit
145
+ *
146
+ * this function adds a callback function to the list of
147
+ * functions invoked by proc_exit(). -cim 2/6/90
148
+ * ----------------------------------------------------------------
149
+ */
150
+
151
+
152
+ /* ----------------------------------------------------------------
153
+ * before_shmem_exit
154
+ *
155
+ * Register early callback to perform user-level cleanup,
156
+ * e.g. transaction abort, before we begin shutting down
157
+ * low-level subsystems.
158
+ * ----------------------------------------------------------------
159
+ */
160
+
161
+
162
+ /* ----------------------------------------------------------------
163
+ * on_shmem_exit
164
+ *
165
+ * Register ordinary callback to perform low-level shutdown
166
+ * (e.g. releasing our PGPROC); run after before_shmem_exit
167
+ * callbacks and before on_proc_exit callbacks.
168
+ * ----------------------------------------------------------------
169
+ */
170
+
171
+
172
+ /* ----------------------------------------------------------------
173
+ * cancel_before_shmem_exit
174
+ *
175
+ * this function removes a previously-registered before_shmem_exit
176
+ * callback. For simplicity, only the latest entry can be
177
+ * removed. (We could work harder but there is no need for
178
+ * current uses.)
179
+ * ----------------------------------------------------------------
180
+ */
181
+
182
+
183
+ /* ----------------------------------------------------------------
184
+ * on_exit_reset
185
+ *
186
+ * this function clears all on_proc_exit() and on_shmem_exit()
187
+ * registered functions. This is used just after forking a backend,
188
+ * so that the backend doesn't believe it should call the postmaster's
189
+ * on-exit routines when it exits...
190
+ * ----------------------------------------------------------------
191
+ */
192
+
@@ -0,0 +1,370 @@
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-2020, 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 "port/atomics.h"
64
+ #include "storage/s_lock.h"
65
+
66
+ #define MIN_SPINS_PER_DELAY 10
67
+ #define MAX_SPINS_PER_DELAY 1000
68
+ #define NUM_DELAYS 1000
69
+ #define MIN_DELAY_USEC 1000L
70
+ #define MAX_DELAY_USEC 1000000L
71
+
72
+
73
+
74
+
75
+ static __thread int spins_per_delay = DEFAULT_SPINS_PER_DELAY;
76
+
77
+
78
+
79
+ /*
80
+ * s_lock_stuck() - complain about a stuck spinlock
81
+ */
82
+ static void
83
+ s_lock_stuck(const char *file, int line, const char *func)
84
+ {
85
+ if (!func)
86
+ func = "(unknown)";
87
+ #if defined(S_LOCK_TEST)
88
+ fprintf(stderr,
89
+ "\nStuck spinlock detected at %s, %s:%d.\n",
90
+ func, file, line);
91
+ exit(1);
92
+ #else
93
+ elog(PANIC, "stuck spinlock detected at %s, %s:%d",
94
+ func, file, line);
95
+ #endif
96
+ }
97
+
98
+ /*
99
+ * s_lock(lock) - platform-independent portion of waiting for a spinlock.
100
+ */
101
+ int
102
+ s_lock(volatile slock_t *lock, const char *file, int line, const char *func)
103
+ {
104
+ SpinDelayStatus delayStatus;
105
+
106
+ init_spin_delay(&delayStatus, file, line, func);
107
+
108
+ while (TAS_SPIN(lock))
109
+ {
110
+ perform_spin_delay(&delayStatus);
111
+ }
112
+
113
+ finish_spin_delay(&delayStatus);
114
+
115
+ return delayStatus.delays;
116
+ }
117
+
118
+ #ifdef USE_DEFAULT_S_UNLOCK
119
+ void
120
+ s_unlock(volatile slock_t *lock)
121
+ {
122
+ #ifdef TAS_ACTIVE_WORD
123
+ /* HP's PA-RISC */
124
+ *TAS_ACTIVE_WORD(lock) = -1;
125
+ #else
126
+ *lock = 0;
127
+ #endif
128
+ }
129
+ #endif
130
+
131
+ /*
132
+ * Wait while spinning on a contended spinlock.
133
+ */
134
+ void
135
+ perform_spin_delay(SpinDelayStatus *status)
136
+ {
137
+ /* CPU-specific delay each time through the loop */
138
+ SPIN_DELAY();
139
+
140
+ /* Block the process every spins_per_delay tries */
141
+ if (++(status->spins) >= spins_per_delay)
142
+ {
143
+ if (++(status->delays) > NUM_DELAYS)
144
+ s_lock_stuck(status->file, status->line, status->func);
145
+
146
+ if (status->cur_delay == 0) /* first time to delay? */
147
+ status->cur_delay = MIN_DELAY_USEC;
148
+
149
+ pg_usleep(status->cur_delay);
150
+
151
+ #if defined(S_LOCK_TEST)
152
+ fprintf(stdout, "*");
153
+ fflush(stdout);
154
+ #endif
155
+
156
+ /* increase delay by a random fraction between 1X and 2X */
157
+ status->cur_delay += (int) (status->cur_delay *
158
+ ((double) random() / (double) MAX_RANDOM_VALUE) + 0.5);
159
+ /* wrap back to minimum delay when max is exceeded */
160
+ if (status->cur_delay > MAX_DELAY_USEC)
161
+ status->cur_delay = MIN_DELAY_USEC;
162
+
163
+ status->spins = 0;
164
+ }
165
+ }
166
+
167
+ /*
168
+ * After acquiring a spinlock, update estimates about how long to loop.
169
+ *
170
+ * If we were able to acquire the lock without delaying, it's a good
171
+ * indication we are in a multiprocessor. If we had to delay, it's a sign
172
+ * (but not a sure thing) that we are in a uniprocessor. Hence, we
173
+ * decrement spins_per_delay slowly when we had to delay, and increase it
174
+ * rapidly when we didn't. It's expected that spins_per_delay will
175
+ * converge to the minimum value on a uniprocessor and to the maximum
176
+ * value on a multiprocessor.
177
+ *
178
+ * Note: spins_per_delay is local within our current process. We want to
179
+ * average these observations across multiple backends, since it's
180
+ * relatively rare for this function to even get entered, and so a single
181
+ * backend might not live long enough to converge on a good value. That
182
+ * is handled by the two routines below.
183
+ */
184
+ void
185
+ finish_spin_delay(SpinDelayStatus *status)
186
+ {
187
+ if (status->cur_delay == 0)
188
+ {
189
+ /* we never had to delay */
190
+ if (spins_per_delay < MAX_SPINS_PER_DELAY)
191
+ spins_per_delay = Min(spins_per_delay + 100, MAX_SPINS_PER_DELAY);
192
+ }
193
+ else
194
+ {
195
+ if (spins_per_delay > MIN_SPINS_PER_DELAY)
196
+ spins_per_delay = Max(spins_per_delay - 1, MIN_SPINS_PER_DELAY);
197
+ }
198
+ }
199
+
200
+ /*
201
+ * Set local copy of spins_per_delay during backend startup.
202
+ *
203
+ * NB: this has to be pretty fast as it is called while holding a spinlock
204
+ */
205
+
206
+
207
+ /*
208
+ * Update shared estimate of spins_per_delay during backend exit.
209
+ *
210
+ * NB: this has to be pretty fast as it is called while holding a spinlock
211
+ */
212
+
213
+
214
+
215
+ /*
216
+ * Various TAS implementations that cannot live in s_lock.h as no inline
217
+ * definition exists (yet).
218
+ * In the future, get rid of tas.[cso] and fold it into this file.
219
+ *
220
+ * If you change something here, you will likely need to modify s_lock.h too,
221
+ * because the definitions for these are split between this file and s_lock.h.
222
+ */
223
+
224
+
225
+ #ifdef HAVE_SPINLOCKS /* skip spinlocks if requested */
226
+
227
+
228
+ #if defined(__GNUC__)
229
+
230
+ /*
231
+ * All the gcc flavors that are not inlined
232
+ */
233
+
234
+
235
+ /*
236
+ * Note: all the if-tests here probably ought to be testing gcc version
237
+ * rather than platform, but I don't have adequate info to know what to
238
+ * write. Ideally we'd flush all this in favor of the inline version.
239
+ */
240
+ #if defined(__m68k__) && !defined(__linux__)
241
+ /* really means: extern int tas(slock_t* **lock); */
242
+ static void
243
+ tas_dummy()
244
+ {
245
+ __asm__ __volatile__(
246
+ #if (defined(__NetBSD__) || defined(__OpenBSD__)) && defined(__ELF__)
247
+ /* no underscore for label and % for registers */
248
+ "\
249
+ .global tas \n\
250
+ tas: \n\
251
+ movel %sp@(0x4),%a0 \n\
252
+ tas %a0@ \n\
253
+ beq _success \n\
254
+ moveq #-128,%d0 \n\
255
+ rts \n\
256
+ _success: \n\
257
+ moveq #0,%d0 \n\
258
+ rts \n"
259
+ #else
260
+ "\
261
+ .global _tas \n\
262
+ _tas: \n\
263
+ movel sp@(0x4),a0 \n\
264
+ tas a0@ \n\
265
+ beq _success \n\
266
+ moveq #-128,d0 \n\
267
+ rts \n\
268
+ _success: \n\
269
+ moveq #0,d0 \n\
270
+ rts \n"
271
+ #endif /* (__NetBSD__ || __OpenBSD__) && __ELF__ */
272
+ );
273
+ }
274
+ #endif /* __m68k__ && !__linux__ */
275
+ #endif /* not __GNUC__ */
276
+ #endif /* HAVE_SPINLOCKS */
277
+
278
+
279
+
280
+ /*****************************************************************************/
281
+ #if defined(S_LOCK_TEST)
282
+
283
+ /*
284
+ * test program for verifying a port's spinlock support.
285
+ */
286
+
287
+ struct test_lock_struct
288
+ {
289
+ char pad1;
290
+ slock_t lock;
291
+ char pad2;
292
+ };
293
+
294
+ volatile struct test_lock_struct test_lock;
295
+
296
+ int
297
+ main()
298
+ {
299
+ srandom((unsigned int) time(NULL));
300
+
301
+ test_lock.pad1 = test_lock.pad2 = 0x44;
302
+
303
+ S_INIT_LOCK(&test_lock.lock);
304
+
305
+ if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
306
+ {
307
+ printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
308
+ return 1;
309
+ }
310
+
311
+ if (!S_LOCK_FREE(&test_lock.lock))
312
+ {
313
+ printf("S_LOCK_TEST: failed, lock not initialized\n");
314
+ return 1;
315
+ }
316
+
317
+ S_LOCK(&test_lock.lock);
318
+
319
+ if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
320
+ {
321
+ printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
322
+ return 1;
323
+ }
324
+
325
+ if (S_LOCK_FREE(&test_lock.lock))
326
+ {
327
+ printf("S_LOCK_TEST: failed, lock not locked\n");
328
+ return 1;
329
+ }
330
+
331
+ S_UNLOCK(&test_lock.lock);
332
+
333
+ if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
334
+ {
335
+ printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
336
+ return 1;
337
+ }
338
+
339
+ if (!S_LOCK_FREE(&test_lock.lock))
340
+ {
341
+ printf("S_LOCK_TEST: failed, lock not unlocked\n");
342
+ return 1;
343
+ }
344
+
345
+ S_LOCK(&test_lock.lock);
346
+
347
+ if (test_lock.pad1 != 0x44 || test_lock.pad2 != 0x44)
348
+ {
349
+ printf("S_LOCK_TEST: failed, declared datatype is wrong size\n");
350
+ return 1;
351
+ }
352
+
353
+ if (S_LOCK_FREE(&test_lock.lock))
354
+ {
355
+ printf("S_LOCK_TEST: failed, lock not re-locked\n");
356
+ return 1;
357
+ }
358
+
359
+ printf("S_LOCK_TEST: this will print %d stars and then\n", NUM_DELAYS);
360
+ printf(" exit with a 'stuck spinlock' message\n");
361
+ printf(" if S_LOCK() and TAS() are working.\n");
362
+ fflush(stdout);
363
+
364
+ s_lock(&test_lock.lock, __FILE__, __LINE__);
365
+
366
+ printf("S_LOCK_TEST: failed, lock not locked\n");
367
+ return 1;
368
+ }
369
+
370
+ #endif /* S_LOCK_TEST */