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,26 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * arch-arm.h
4
+ * Atomic operations considerations specific to ARM
5
+ *
6
+ * Portions Copyright (c) 2013-2020, PostgreSQL Global Development Group
7
+ *
8
+ * NOTES:
9
+ *
10
+ * src/include/port/atomics/arch-arm.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+
15
+ /* intentionally no include guards, should only be included by atomics.h */
16
+ #ifndef INSIDE_ATOMICS_H
17
+ #error "should be included via atomics.h"
18
+ #endif
19
+
20
+ /*
21
+ * 64 bit atomics on ARM32 are implemented using kernel fallbacks and thus
22
+ * might be slow, so disable entirely. On ARM64 that problem doesn't exist.
23
+ */
24
+ #if !defined(__aarch64__) && !defined(__aarch64)
25
+ #define PG_DISABLE_64_BIT_ATOMICS
26
+ #endif /* __aarch64__ || __aarch64 */
@@ -0,0 +1,254 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * arch-ppc.h
4
+ * Atomic operations considerations specific to PowerPC
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * NOTES:
10
+ *
11
+ * src/include/port/atomics/arch-ppc.h
12
+ *
13
+ *-------------------------------------------------------------------------
14
+ */
15
+
16
+ #if defined(__GNUC__)
17
+
18
+ /*
19
+ * lwsync orders loads with respect to each other, and similarly with stores.
20
+ * But a load can be performed before a subsequent store, so sync must be used
21
+ * for a full memory barrier.
22
+ */
23
+ #define pg_memory_barrier_impl() __asm__ __volatile__ ("sync" : : : "memory")
24
+ #define pg_read_barrier_impl() __asm__ __volatile__ ("lwsync" : : : "memory")
25
+ #define pg_write_barrier_impl() __asm__ __volatile__ ("lwsync" : : : "memory")
26
+ #endif
27
+
28
+ #define PG_HAVE_ATOMIC_U32_SUPPORT
29
+ typedef struct pg_atomic_uint32
30
+ {
31
+ volatile uint32 value;
32
+ } pg_atomic_uint32;
33
+
34
+ /* 64bit atomics are only supported in 64bit mode */
35
+ #if SIZEOF_VOID_P >= 8
36
+ #define PG_HAVE_ATOMIC_U64_SUPPORT
37
+ typedef struct pg_atomic_uint64
38
+ {
39
+ volatile uint64 value pg_attribute_aligned(8);
40
+ } pg_atomic_uint64;
41
+
42
+ #endif
43
+
44
+ /*
45
+ * This mimics gcc __atomic_compare_exchange_n(..., __ATOMIC_SEQ_CST), but
46
+ * code generation differs at the end. __atomic_compare_exchange_n():
47
+ * 100: isync
48
+ * 104: mfcr r3
49
+ * 108: rlwinm r3,r3,3,31,31
50
+ * 10c: bne 120 <.eb+0x10>
51
+ * 110: clrldi r3,r3,63
52
+ * 114: addi r1,r1,112
53
+ * 118: blr
54
+ * 11c: nop
55
+ * 120: clrldi r3,r3,63
56
+ * 124: stw r9,0(r4)
57
+ * 128: addi r1,r1,112
58
+ * 12c: blr
59
+ *
60
+ * This:
61
+ * f0: isync
62
+ * f4: mfcr r9
63
+ * f8: rldicl. r3,r9,35,63
64
+ * fc: bne 104 <.eb>
65
+ * 100: stw r10,0(r4)
66
+ * 104: addi r1,r1,112
67
+ * 108: blr
68
+ *
69
+ * This implementation may or may not have materially different performance.
70
+ * It's not exploiting the fact that cr0 still holds the relevant comparison
71
+ * bits, set during the __asm__. One could fix that by moving more code into
72
+ * the __asm__. (That would remove the freedom to eliminate dead stores when
73
+ * the caller ignores "expected", but few callers do.)
74
+ *
75
+ * Recognizing constant "newval" would be superfluous, because there's no
76
+ * immediate-operand version of stwcx.
77
+ */
78
+ #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
79
+ static inline bool
80
+ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
81
+ uint32 *expected, uint32 newval)
82
+ {
83
+ uint32 found;
84
+ uint32 condition_register;
85
+ bool ret;
86
+
87
+ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
88
+ if (__builtin_constant_p(*expected) &&
89
+ (int32) *expected <= PG_INT16_MAX &&
90
+ (int32) *expected >= PG_INT16_MIN)
91
+ __asm__ __volatile__(
92
+ " sync \n"
93
+ " lwarx %0,0,%5 \n"
94
+ " cmpwi %0,%3 \n"
95
+ " bne $+12 \n" /* branch to isync */
96
+ " stwcx. %4,0,%5 \n"
97
+ " bne $-16 \n" /* branch to lwarx */
98
+ " isync \n"
99
+ " mfcr %1 \n"
100
+ : "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
101
+ : "i"(*expected), "r"(newval), "r"(&ptr->value)
102
+ : "memory", "cc");
103
+ else
104
+ #endif
105
+ __asm__ __volatile__(
106
+ " sync \n"
107
+ " lwarx %0,0,%5 \n"
108
+ " cmpw %0,%3 \n"
109
+ " bne $+12 \n" /* branch to isync */
110
+ " stwcx. %4,0,%5 \n"
111
+ " bne $-16 \n" /* branch to lwarx */
112
+ " isync \n"
113
+ " mfcr %1 \n"
114
+ : "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
115
+ : "r"(*expected), "r"(newval), "r"(&ptr->value)
116
+ : "memory", "cc");
117
+
118
+ ret = (condition_register >> 29) & 1; /* test eq bit of cr0 */
119
+ if (!ret)
120
+ *expected = found;
121
+ return ret;
122
+ }
123
+
124
+ /*
125
+ * This mirrors gcc __sync_fetch_and_add().
126
+ *
127
+ * Like tas(), use constraint "=&b" to avoid allocating r0.
128
+ */
129
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U32
130
+ static inline uint32
131
+ pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
132
+ {
133
+ uint32 _t;
134
+ uint32 res;
135
+
136
+ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
137
+ if (__builtin_constant_p(add_) &&
138
+ add_ <= PG_INT16_MAX && add_ >= PG_INT16_MIN)
139
+ __asm__ __volatile__(
140
+ " sync \n"
141
+ " lwarx %1,0,%4 \n"
142
+ " addi %0,%1,%3 \n"
143
+ " stwcx. %0,0,%4 \n"
144
+ " bne $-12 \n" /* branch to lwarx */
145
+ " isync \n"
146
+ : "=&r"(_t), "=&b"(res), "+m"(ptr->value)
147
+ : "i"(add_), "r"(&ptr->value)
148
+ : "memory", "cc");
149
+ else
150
+ #endif
151
+ __asm__ __volatile__(
152
+ " sync \n"
153
+ " lwarx %1,0,%4 \n"
154
+ " add %0,%1,%3 \n"
155
+ " stwcx. %0,0,%4 \n"
156
+ " bne $-12 \n" /* branch to lwarx */
157
+ " isync \n"
158
+ : "=&r"(_t), "=&r"(res), "+m"(ptr->value)
159
+ : "r"(add_), "r"(&ptr->value)
160
+ : "memory", "cc");
161
+
162
+ return res;
163
+ }
164
+
165
+ #ifdef PG_HAVE_ATOMIC_U64_SUPPORT
166
+
167
+ #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
168
+ static inline bool
169
+ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
170
+ uint64 *expected, uint64 newval)
171
+ {
172
+ uint64 found;
173
+ uint32 condition_register;
174
+ bool ret;
175
+
176
+ /* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */
177
+ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
178
+ if (__builtin_constant_p(*expected) &&
179
+ (int64) *expected <= PG_INT16_MAX &&
180
+ (int64) *expected >= PG_INT16_MIN)
181
+ __asm__ __volatile__(
182
+ " sync \n"
183
+ " ldarx %0,0,%5 \n"
184
+ " cmpdi %0,%3 \n"
185
+ " bne $+12 \n" /* branch to isync */
186
+ " stdcx. %4,0,%5 \n"
187
+ " bne $-16 \n" /* branch to ldarx */
188
+ " isync \n"
189
+ " mfcr %1 \n"
190
+ : "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
191
+ : "i"(*expected), "r"(newval), "r"(&ptr->value)
192
+ : "memory", "cc");
193
+ else
194
+ #endif
195
+ __asm__ __volatile__(
196
+ " sync \n"
197
+ " ldarx %0,0,%5 \n"
198
+ " cmpd %0,%3 \n"
199
+ " bne $+12 \n" /* branch to isync */
200
+ " stdcx. %4,0,%5 \n"
201
+ " bne $-16 \n" /* branch to ldarx */
202
+ " isync \n"
203
+ " mfcr %1 \n"
204
+ : "=&r"(found), "=r"(condition_register), "+m"(ptr->value)
205
+ : "r"(*expected), "r"(newval), "r"(&ptr->value)
206
+ : "memory", "cc");
207
+
208
+ ret = (condition_register >> 29) & 1; /* test eq bit of cr0 */
209
+ if (!ret)
210
+ *expected = found;
211
+ return ret;
212
+ }
213
+
214
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U64
215
+ static inline uint64
216
+ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
217
+ {
218
+ uint64 _t;
219
+ uint64 res;
220
+
221
+ /* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/ */
222
+ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
223
+ if (__builtin_constant_p(add_) &&
224
+ add_ <= PG_INT16_MAX && add_ >= PG_INT16_MIN)
225
+ __asm__ __volatile__(
226
+ " sync \n"
227
+ " ldarx %1,0,%4 \n"
228
+ " addi %0,%1,%3 \n"
229
+ " stdcx. %0,0,%4 \n"
230
+ " bne $-12 \n" /* branch to ldarx */
231
+ " isync \n"
232
+ : "=&r"(_t), "=&b"(res), "+m"(ptr->value)
233
+ : "i"(add_), "r"(&ptr->value)
234
+ : "memory", "cc");
235
+ else
236
+ #endif
237
+ __asm__ __volatile__(
238
+ " sync \n"
239
+ " ldarx %1,0,%4 \n"
240
+ " add %0,%1,%3 \n"
241
+ " stdcx. %0,0,%4 \n"
242
+ " bne $-12 \n" /* branch to ldarx */
243
+ " isync \n"
244
+ : "=&r"(_t), "=&r"(res), "+m"(ptr->value)
245
+ : "r"(add_), "r"(&ptr->value)
246
+ : "memory", "cc");
247
+
248
+ return res;
249
+ }
250
+
251
+ #endif /* PG_HAVE_ATOMIC_U64_SUPPORT */
252
+
253
+ /* per architecture manual doubleword accesses have single copy atomicity */
254
+ #define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY
@@ -0,0 +1,252 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * arch-x86.h
4
+ * Atomic operations considerations specific to intel x86
5
+ *
6
+ * Note that we actually require a 486 upwards because the 386 doesn't have
7
+ * support for xadd and cmpxchg. Given that the 386 isn't supported anywhere
8
+ * anymore that's not much of a restriction luckily.
9
+ *
10
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
11
+ * Portions Copyright (c) 1994, Regents of the University of California
12
+ *
13
+ * NOTES:
14
+ *
15
+ * src/include/port/atomics/arch-x86.h
16
+ *
17
+ *-------------------------------------------------------------------------
18
+ */
19
+
20
+ /*
21
+ * Both 32 and 64 bit x86 do not allow loads to be reordered with other loads,
22
+ * or stores to be reordered with other stores, but a load can be performed
23
+ * before a subsequent store.
24
+ *
25
+ * Technically, some x86-ish chips support uncached memory access and/or
26
+ * special instructions that are weakly ordered. In those cases we'd need
27
+ * the read and write barriers to be lfence and sfence. But since we don't
28
+ * do those things, a compiler barrier should be enough.
29
+ *
30
+ * "lock; addl" has worked for longer than "mfence". It's also rumored to be
31
+ * faster in many scenarios.
32
+ */
33
+
34
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER)
35
+ #if defined(__i386__) || defined(__i386)
36
+ #define pg_memory_barrier_impl() \
37
+ __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory", "cc")
38
+ #elif defined(__x86_64__)
39
+ #define pg_memory_barrier_impl() \
40
+ __asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")
41
+ #endif
42
+ #endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
43
+
44
+ #define pg_read_barrier_impl() pg_compiler_barrier_impl()
45
+ #define pg_write_barrier_impl() pg_compiler_barrier_impl()
46
+
47
+ /*
48
+ * Provide implementation for atomics using inline assembly on x86 gcc. It's
49
+ * nice to support older gcc's and the compare/exchange implementation here is
50
+ * actually more efficient than the * __sync variant.
51
+ */
52
+ #if defined(HAVE_ATOMICS)
53
+
54
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER)
55
+
56
+ #define PG_HAVE_ATOMIC_FLAG_SUPPORT
57
+ typedef struct pg_atomic_flag
58
+ {
59
+ volatile char value;
60
+ } pg_atomic_flag;
61
+
62
+ #define PG_HAVE_ATOMIC_U32_SUPPORT
63
+ typedef struct pg_atomic_uint32
64
+ {
65
+ volatile uint32 value;
66
+ } pg_atomic_uint32;
67
+
68
+ /*
69
+ * It's too complicated to write inline asm for 64bit types on 32bit and the
70
+ * 486 can't do it anyway.
71
+ */
72
+ #ifdef __x86_64__
73
+ #define PG_HAVE_ATOMIC_U64_SUPPORT
74
+ typedef struct pg_atomic_uint64
75
+ {
76
+ /* alignment guaranteed due to being on a 64bit platform */
77
+ volatile uint64 value;
78
+ } pg_atomic_uint64;
79
+ #endif /* __x86_64__ */
80
+
81
+ #endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
82
+
83
+ #endif /* defined(HAVE_ATOMICS) */
84
+
85
+ #if !defined(PG_HAVE_SPIN_DELAY)
86
+ /*
87
+ * This sequence is equivalent to the PAUSE instruction ("rep" is
88
+ * ignored by old IA32 processors if the following instruction is
89
+ * not a string operation); the IA-32 Architecture Software
90
+ * Developer's Manual, Vol. 3, Section 7.7.2 describes why using
91
+ * PAUSE in the inner loop of a spin lock is necessary for good
92
+ * performance:
93
+ *
94
+ * The PAUSE instruction improves the performance of IA-32
95
+ * processors supporting Hyper-Threading Technology when
96
+ * executing spin-wait loops and other routines where one
97
+ * thread is accessing a shared lock or semaphore in a tight
98
+ * polling loop. When executing a spin-wait loop, the
99
+ * processor can suffer a severe performance penalty when
100
+ * exiting the loop because it detects a possible memory order
101
+ * violation and flushes the core processor's pipeline. The
102
+ * PAUSE instruction provides a hint to the processor that the
103
+ * code sequence is a spin-wait loop. The processor uses this
104
+ * hint to avoid the memory order violation and prevent the
105
+ * pipeline flush. In addition, the PAUSE instruction
106
+ * de-pipelines the spin-wait loop to prevent it from
107
+ * consuming execution resources excessively.
108
+ */
109
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER)
110
+ #define PG_HAVE_SPIN_DELAY
111
+ static __inline__ void
112
+ pg_spin_delay_impl(void)
113
+ {
114
+ __asm__ __volatile__(" rep; nop \n");
115
+ }
116
+ #elif defined(_MSC_VER) && defined(__x86_64__)
117
+ #define PG_HAVE_SPIN_DELAY
118
+ static __forceinline void
119
+ pg_spin_delay_impl(void)
120
+ {
121
+ _mm_pause();
122
+ }
123
+ #elif defined(_MSC_VER)
124
+ #define PG_HAVE_SPIN_DELAY
125
+ static __forceinline void
126
+ pg_spin_delay_impl(void)
127
+ {
128
+ /* See comment for gcc code. Same code, MASM syntax */
129
+ __asm rep nop;
130
+ }
131
+ #endif
132
+ #endif /* !defined(PG_HAVE_SPIN_DELAY) */
133
+
134
+
135
+ #if defined(HAVE_ATOMICS)
136
+
137
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER)
138
+
139
+ #define PG_HAVE_ATOMIC_TEST_SET_FLAG
140
+ static inline bool
141
+ pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
142
+ {
143
+ register char _res = 1;
144
+
145
+ __asm__ __volatile__(
146
+ " lock \n"
147
+ " xchgb %0,%1 \n"
148
+ : "+q"(_res), "+m"(ptr->value)
149
+ :
150
+ : "memory");
151
+ return _res == 0;
152
+ }
153
+
154
+ #define PG_HAVE_ATOMIC_CLEAR_FLAG
155
+ static inline void
156
+ pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)
157
+ {
158
+ /*
159
+ * On a TSO architecture like x86 it's sufficient to use a compiler
160
+ * barrier to achieve release semantics.
161
+ */
162
+ __asm__ __volatile__("" ::: "memory");
163
+ ptr->value = 0;
164
+ }
165
+
166
+ #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32
167
+ static inline bool
168
+ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,
169
+ uint32 *expected, uint32 newval)
170
+ {
171
+ char ret;
172
+
173
+ /*
174
+ * Perform cmpxchg and use the zero flag which it implicitly sets when
175
+ * equal to measure the success.
176
+ */
177
+ __asm__ __volatile__(
178
+ " lock \n"
179
+ " cmpxchgl %4,%5 \n"
180
+ " setz %2 \n"
181
+ : "=a" (*expected), "=m"(ptr->value), "=q" (ret)
182
+ : "a" (*expected), "r" (newval), "m"(ptr->value)
183
+ : "memory", "cc");
184
+ return (bool) ret;
185
+ }
186
+
187
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U32
188
+ static inline uint32
189
+ pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
190
+ {
191
+ uint32 res;
192
+ __asm__ __volatile__(
193
+ " lock \n"
194
+ " xaddl %0,%1 \n"
195
+ : "=q"(res), "=m"(ptr->value)
196
+ : "0" (add_), "m"(ptr->value)
197
+ : "memory", "cc");
198
+ return res;
199
+ }
200
+
201
+ #ifdef __x86_64__
202
+
203
+ #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64
204
+ static inline bool
205
+ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
206
+ uint64 *expected, uint64 newval)
207
+ {
208
+ char ret;
209
+
210
+ /*
211
+ * Perform cmpxchg and use the zero flag which it implicitly sets when
212
+ * equal to measure the success.
213
+ */
214
+ __asm__ __volatile__(
215
+ " lock \n"
216
+ " cmpxchgq %4,%5 \n"
217
+ " setz %2 \n"
218
+ : "=a" (*expected), "=m"(ptr->value), "=q" (ret)
219
+ : "a" (*expected), "r" (newval), "m"(ptr->value)
220
+ : "memory", "cc");
221
+ return (bool) ret;
222
+ }
223
+
224
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U64
225
+ static inline uint64
226
+ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
227
+ {
228
+ uint64 res;
229
+ __asm__ __volatile__(
230
+ " lock \n"
231
+ " xaddq %0,%1 \n"
232
+ : "=q"(res), "=m"(ptr->value)
233
+ : "0" (add_), "m"(ptr->value)
234
+ : "memory", "cc");
235
+ return res;
236
+ }
237
+
238
+ #endif /* __x86_64__ */
239
+
240
+ #endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */
241
+
242
+ /*
243
+ * 8 byte reads / writes have single-copy atomicity on 32 bit x86 platforms
244
+ * since at least the 586. As well as on all x86-64 cpus.
245
+ */
246
+ #if defined(__i568__) || defined(__i668__) || /* gcc i586+ */ \
247
+ (defined(_M_IX86) && _M_IX86 >= 500) || /* msvc i586+ */ \
248
+ defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) /* gcc, sunpro, msvc */
249
+ #define PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY
250
+ #endif /* 8 byte single-copy atomicity */
251
+
252
+ #endif /* HAVE_ATOMICS */