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,401 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * generic.h
4
+ * Implement higher level operations based on some lower level atomic
5
+ * operations.
6
+ *
7
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 1994, Regents of the University of California
9
+ *
10
+ * src/include/port/atomics/generic.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
+ * If read or write barriers are undefined, we upgrade them to full memory
22
+ * barriers.
23
+ */
24
+ #if !defined(pg_read_barrier_impl)
25
+ # define pg_read_barrier_impl pg_memory_barrier_impl
26
+ #endif
27
+ #if !defined(pg_write_barrier_impl)
28
+ # define pg_write_barrier_impl pg_memory_barrier_impl
29
+ #endif
30
+
31
+ #ifndef PG_HAVE_SPIN_DELAY
32
+ #define PG_HAVE_SPIN_DELAY
33
+ #define pg_spin_delay_impl() ((void)0)
34
+ #endif
35
+
36
+
37
+ /* provide fallback */
38
+ #if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && defined(PG_HAVE_ATOMIC_U32_SUPPORT)
39
+ #define PG_HAVE_ATOMIC_FLAG_SUPPORT
40
+ typedef pg_atomic_uint32 pg_atomic_flag;
41
+ #endif
42
+
43
+ #ifndef PG_HAVE_ATOMIC_READ_U32
44
+ #define PG_HAVE_ATOMIC_READ_U32
45
+ static inline uint32
46
+ pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)
47
+ {
48
+ return ptr->value;
49
+ }
50
+ #endif
51
+
52
+ #ifndef PG_HAVE_ATOMIC_WRITE_U32
53
+ #define PG_HAVE_ATOMIC_WRITE_U32
54
+ static inline void
55
+ pg_atomic_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
56
+ {
57
+ ptr->value = val;
58
+ }
59
+ #endif
60
+
61
+ #ifndef PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
62
+ #define PG_HAVE_ATOMIC_UNLOCKED_WRITE_U32
63
+ static inline void
64
+ pg_atomic_unlocked_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)
65
+ {
66
+ ptr->value = val;
67
+ }
68
+ #endif
69
+
70
+ /*
71
+ * provide fallback for test_and_set using atomic_exchange if available
72
+ */
73
+ #if !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)
74
+
75
+ #define PG_HAVE_ATOMIC_INIT_FLAG
76
+ static inline void
77
+ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)
78
+ {
79
+ pg_atomic_write_u32_impl(ptr, 0);
80
+ }
81
+
82
+ #define PG_HAVE_ATOMIC_TEST_SET_FLAG
83
+ static inline bool
84
+ pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
85
+ {
86
+ return pg_atomic_exchange_u32_impl(ptr, &value, 1) == 0;
87
+ }
88
+
89
+ #define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
90
+ static inline bool
91
+ pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)
92
+ {
93
+ return pg_atomic_read_u32_impl(ptr) == 0;
94
+ }
95
+
96
+
97
+ #define PG_HAVE_ATOMIC_CLEAR_FLAG
98
+ static inline void
99
+ pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)
100
+ {
101
+ /* XXX: release semantics suffice? */
102
+ pg_memory_barrier_impl();
103
+ pg_atomic_write_u32_impl(ptr, 0);
104
+ }
105
+
106
+ /*
107
+ * provide fallback for test_and_set using atomic_compare_exchange if
108
+ * available.
109
+ */
110
+ #elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
111
+
112
+ #define PG_HAVE_ATOMIC_INIT_FLAG
113
+ static inline void
114
+ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)
115
+ {
116
+ pg_atomic_write_u32_impl(ptr, 0);
117
+ }
118
+
119
+ #define PG_HAVE_ATOMIC_TEST_SET_FLAG
120
+ static inline bool
121
+ pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)
122
+ {
123
+ uint32 value = 0;
124
+ return pg_atomic_compare_exchange_u32_impl(ptr, &value, 1);
125
+ }
126
+
127
+ #define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG
128
+ static inline bool
129
+ pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)
130
+ {
131
+ return pg_atomic_read_u32_impl(ptr) == 0;
132
+ }
133
+
134
+ #define PG_HAVE_ATOMIC_CLEAR_FLAG
135
+ static inline void
136
+ pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)
137
+ {
138
+ /*
139
+ * Use a memory barrier + plain write if we have a native memory
140
+ * barrier. But don't do so if memory barriers use spinlocks - that'd lead
141
+ * to circularity if flags are used to implement spinlocks.
142
+ */
143
+ #ifndef PG_HAVE_MEMORY_BARRIER_EMULATION
144
+ /* XXX: release semantics suffice? */
145
+ pg_memory_barrier_impl();
146
+ pg_atomic_write_u32_impl(ptr, 0);
147
+ #else
148
+ uint32 value = 1;
149
+ pg_atomic_compare_exchange_u32_impl(ptr, &value, 0);
150
+ #endif
151
+ }
152
+
153
+ #elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG)
154
+ # error "No pg_atomic_test_and_set provided"
155
+ #endif /* !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) */
156
+
157
+
158
+ #ifndef PG_HAVE_ATOMIC_INIT_U32
159
+ #define PG_HAVE_ATOMIC_INIT_U32
160
+ static inline void
161
+ pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)
162
+ {
163
+ ptr->value = val_;
164
+ }
165
+ #endif
166
+
167
+ #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
168
+ #define PG_HAVE_ATOMIC_EXCHANGE_U32
169
+ static inline uint32
170
+ pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 xchg_)
171
+ {
172
+ uint32 old;
173
+ old = ptr->value; /* ok if read is not atomic */
174
+ while (!pg_atomic_compare_exchange_u32_impl(ptr, &old, xchg_))
175
+ /* skip */;
176
+ return old;
177
+ }
178
+ #endif
179
+
180
+ #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
181
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U32
182
+ static inline uint32
183
+ pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
184
+ {
185
+ uint32 old;
186
+ old = ptr->value; /* ok if read is not atomic */
187
+ while (!pg_atomic_compare_exchange_u32_impl(ptr, &old, old + add_))
188
+ /* skip */;
189
+ return old;
190
+ }
191
+ #endif
192
+
193
+ #if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
194
+ #define PG_HAVE_ATOMIC_FETCH_SUB_U32
195
+ static inline uint32
196
+ pg_atomic_fetch_sub_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)
197
+ {
198
+ return pg_atomic_fetch_add_u32_impl(ptr, -sub_);
199
+ }
200
+ #endif
201
+
202
+ #if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
203
+ #define PG_HAVE_ATOMIC_FETCH_AND_U32
204
+ static inline uint32
205
+ pg_atomic_fetch_and_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 and_)
206
+ {
207
+ uint32 old;
208
+ old = ptr->value; /* ok if read is not atomic */
209
+ while (!pg_atomic_compare_exchange_u32_impl(ptr, &old, old & and_))
210
+ /* skip */;
211
+ return old;
212
+ }
213
+ #endif
214
+
215
+ #if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)
216
+ #define PG_HAVE_ATOMIC_FETCH_OR_U32
217
+ static inline uint32
218
+ pg_atomic_fetch_or_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 or_)
219
+ {
220
+ uint32 old;
221
+ old = ptr->value; /* ok if read is not atomic */
222
+ while (!pg_atomic_compare_exchange_u32_impl(ptr, &old, old | or_))
223
+ /* skip */;
224
+ return old;
225
+ }
226
+ #endif
227
+
228
+ #if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)
229
+ #define PG_HAVE_ATOMIC_ADD_FETCH_U32
230
+ static inline uint32
231
+ pg_atomic_add_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)
232
+ {
233
+ return pg_atomic_fetch_add_u32_impl(ptr, add_) + add_;
234
+ }
235
+ #endif
236
+
237
+ #if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32)
238
+ #define PG_HAVE_ATOMIC_SUB_FETCH_U32
239
+ static inline uint32
240
+ pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)
241
+ {
242
+ return pg_atomic_fetch_sub_u32_impl(ptr, sub_) - sub_;
243
+ }
244
+ #endif
245
+
246
+ #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
247
+ #define PG_HAVE_ATOMIC_EXCHANGE_U64
248
+ static inline uint64
249
+ pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 xchg_)
250
+ {
251
+ uint64 old;
252
+ old = ptr->value; /* ok if read is not atomic */
253
+ while (!pg_atomic_compare_exchange_u64_impl(ptr, &old, xchg_))
254
+ /* skip */;
255
+ return old;
256
+ }
257
+ #endif
258
+
259
+ #ifndef PG_HAVE_ATOMIC_WRITE_U64
260
+ #define PG_HAVE_ATOMIC_WRITE_U64
261
+
262
+ #if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
263
+ !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
264
+
265
+ static inline void
266
+ pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
267
+ {
268
+ /*
269
+ * On this platform aligned 64bit writes are guaranteed to be atomic,
270
+ * except if using the fallback implementation, where can't guarantee the
271
+ * required alignment.
272
+ */
273
+ AssertPointerAlignment(ptr, 8);
274
+ ptr->value = val;
275
+ }
276
+
277
+ #else
278
+
279
+ static inline void
280
+ pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)
281
+ {
282
+ /*
283
+ * 64 bit writes aren't safe on all platforms. In the generic
284
+ * implementation implement them as an atomic exchange.
285
+ */
286
+ pg_atomic_exchange_u64_impl(ptr, val);
287
+ }
288
+
289
+ #endif /* PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY && !PG_HAVE_ATOMIC_U64_SIMULATION */
290
+ #endif /* PG_HAVE_ATOMIC_WRITE_U64 */
291
+
292
+ #ifndef PG_HAVE_ATOMIC_READ_U64
293
+ #define PG_HAVE_ATOMIC_READ_U64
294
+
295
+ #if defined(PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY) && \
296
+ !defined(PG_HAVE_ATOMIC_U64_SIMULATION)
297
+
298
+ static inline uint64
299
+ pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
300
+ {
301
+ /*
302
+ * On this platform aligned 64-bit reads are guaranteed to be atomic.
303
+ */
304
+ AssertPointerAlignment(ptr, 8);
305
+ return ptr->value;
306
+ }
307
+
308
+ #else
309
+
310
+ static inline uint64
311
+ pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)
312
+ {
313
+ uint64 old = 0;
314
+
315
+ /*
316
+ * 64-bit reads aren't atomic on all platforms. In the generic
317
+ * implementation implement them as a compare/exchange with 0. That'll
318
+ * fail or succeed, but always return the old value. Possibly might store
319
+ * a 0, but only if the previous value also was a 0 - i.e. harmless.
320
+ */
321
+ pg_atomic_compare_exchange_u64_impl(ptr, &old, 0);
322
+
323
+ return old;
324
+ }
325
+ #endif /* PG_HAVE_8BYTE_SINGLE_COPY_ATOMICITY && !PG_HAVE_ATOMIC_U64_SIMULATION */
326
+ #endif /* PG_HAVE_ATOMIC_READ_U64 */
327
+
328
+ #ifndef PG_HAVE_ATOMIC_INIT_U64
329
+ #define PG_HAVE_ATOMIC_INIT_U64
330
+ static inline void
331
+ pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)
332
+ {
333
+ ptr->value = val_;
334
+ }
335
+ #endif
336
+
337
+ #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
338
+ #define PG_HAVE_ATOMIC_FETCH_ADD_U64
339
+ static inline uint64
340
+ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
341
+ {
342
+ uint64 old;
343
+ old = ptr->value; /* ok if read is not atomic */
344
+ while (!pg_atomic_compare_exchange_u64_impl(ptr, &old, old + add_))
345
+ /* skip */;
346
+ return old;
347
+ }
348
+ #endif
349
+
350
+ #if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
351
+ #define PG_HAVE_ATOMIC_FETCH_SUB_U64
352
+ static inline uint64
353
+ pg_atomic_fetch_sub_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)
354
+ {
355
+ return pg_atomic_fetch_add_u64_impl(ptr, -sub_);
356
+ }
357
+ #endif
358
+
359
+ #if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
360
+ #define PG_HAVE_ATOMIC_FETCH_AND_U64
361
+ static inline uint64
362
+ pg_atomic_fetch_and_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 and_)
363
+ {
364
+ uint64 old;
365
+ old = ptr->value; /* ok if read is not atomic */
366
+ while (!pg_atomic_compare_exchange_u64_impl(ptr, &old, old & and_))
367
+ /* skip */;
368
+ return old;
369
+ }
370
+ #endif
371
+
372
+ #if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)
373
+ #define PG_HAVE_ATOMIC_FETCH_OR_U64
374
+ static inline uint64
375
+ pg_atomic_fetch_or_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 or_)
376
+ {
377
+ uint64 old;
378
+ old = ptr->value; /* ok if read is not atomic */
379
+ while (!pg_atomic_compare_exchange_u64_impl(ptr, &old, old | or_))
380
+ /* skip */;
381
+ return old;
382
+ }
383
+ #endif
384
+
385
+ #if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)
386
+ #define PG_HAVE_ATOMIC_ADD_FETCH_U64
387
+ static inline uint64
388
+ pg_atomic_add_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)
389
+ {
390
+ return pg_atomic_fetch_add_u64_impl(ptr, add_) + add_;
391
+ }
392
+ #endif
393
+
394
+ #if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U64)
395
+ #define PG_HAVE_ATOMIC_SUB_FETCH_U64
396
+ static inline uint64
397
+ pg_atomic_sub_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)
398
+ {
399
+ return pg_atomic_fetch_sub_u64_impl(ptr, sub_) - sub_;
400
+ }
401
+ #endif
@@ -0,0 +1,226 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * pg_bitutils.h
4
+ * Miscellaneous functions for bit-wise operations.
5
+ *
6
+ *
7
+ * Copyright (c) 2019-2020, PostgreSQL Global Development Group
8
+ *
9
+ * src/include/port/pg_bitutils.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef PG_BITUTILS_H
14
+ #define PG_BITUTILS_H
15
+
16
+ #ifndef FRONTEND
17
+ extern PGDLLIMPORT const uint8 pg_leftmost_one_pos[256];
18
+ extern PGDLLIMPORT const uint8 pg_rightmost_one_pos[256];
19
+ extern PGDLLIMPORT const uint8 pg_number_of_ones[256];
20
+ #else
21
+ extern const uint8 pg_leftmost_one_pos[256];
22
+ extern const uint8 pg_rightmost_one_pos[256];
23
+ extern const uint8 pg_number_of_ones[256];
24
+ #endif
25
+
26
+ /*
27
+ * pg_leftmost_one_pos32
28
+ * Returns the position of the most significant set bit in "word",
29
+ * measured from the least significant bit. word must not be 0.
30
+ */
31
+ static inline int
32
+ pg_leftmost_one_pos32(uint32 word)
33
+ {
34
+ #ifdef HAVE__BUILTIN_CLZ
35
+ Assert(word != 0);
36
+
37
+ return 31 - __builtin_clz(word);
38
+ #else
39
+ int shift = 32 - 8;
40
+
41
+ Assert(word != 0);
42
+
43
+ while ((word >> shift) == 0)
44
+ shift -= 8;
45
+
46
+ return shift + pg_leftmost_one_pos[(word >> shift) & 255];
47
+ #endif /* HAVE__BUILTIN_CLZ */
48
+ }
49
+
50
+ /*
51
+ * pg_leftmost_one_pos64
52
+ * As above, but for a 64-bit word.
53
+ */
54
+ static inline int
55
+ pg_leftmost_one_pos64(uint64 word)
56
+ {
57
+ #ifdef HAVE__BUILTIN_CLZ
58
+ Assert(word != 0);
59
+
60
+ #if defined(HAVE_LONG_INT_64)
61
+ return 63 - __builtin_clzl(word);
62
+ #elif defined(HAVE_LONG_LONG_INT_64)
63
+ return 63 - __builtin_clzll(word);
64
+ #else
65
+ #error must have a working 64-bit integer datatype
66
+ #endif
67
+ #else /* !HAVE__BUILTIN_CLZ */
68
+ int shift = 64 - 8;
69
+
70
+ Assert(word != 0);
71
+
72
+ while ((word >> shift) == 0)
73
+ shift -= 8;
74
+
75
+ return shift + pg_leftmost_one_pos[(word >> shift) & 255];
76
+ #endif /* HAVE__BUILTIN_CLZ */
77
+ }
78
+
79
+ /*
80
+ * pg_rightmost_one_pos32
81
+ * Returns the position of the least significant set bit in "word",
82
+ * measured from the least significant bit. word must not be 0.
83
+ */
84
+ static inline int
85
+ pg_rightmost_one_pos32(uint32 word)
86
+ {
87
+ #ifdef HAVE__BUILTIN_CTZ
88
+ Assert(word != 0);
89
+
90
+ return __builtin_ctz(word);
91
+ #else
92
+ int result = 0;
93
+
94
+ Assert(word != 0);
95
+
96
+ while ((word & 255) == 0)
97
+ {
98
+ word >>= 8;
99
+ result += 8;
100
+ }
101
+ result += pg_rightmost_one_pos[word & 255];
102
+ return result;
103
+ #endif /* HAVE__BUILTIN_CTZ */
104
+ }
105
+
106
+ /*
107
+ * pg_rightmost_one_pos64
108
+ * As above, but for a 64-bit word.
109
+ */
110
+ static inline int
111
+ pg_rightmost_one_pos64(uint64 word)
112
+ {
113
+ #ifdef HAVE__BUILTIN_CTZ
114
+ Assert(word != 0);
115
+
116
+ #if defined(HAVE_LONG_INT_64)
117
+ return __builtin_ctzl(word);
118
+ #elif defined(HAVE_LONG_LONG_INT_64)
119
+ return __builtin_ctzll(word);
120
+ #else
121
+ #error must have a working 64-bit integer datatype
122
+ #endif
123
+ #else /* !HAVE__BUILTIN_CTZ */
124
+ int result = 0;
125
+
126
+ Assert(word != 0);
127
+
128
+ while ((word & 255) == 0)
129
+ {
130
+ word >>= 8;
131
+ result += 8;
132
+ }
133
+ result += pg_rightmost_one_pos[word & 255];
134
+ return result;
135
+ #endif /* HAVE__BUILTIN_CTZ */
136
+ }
137
+
138
+ /*
139
+ * pg_nextpower2_32
140
+ * Returns the next highest power of 2 of 'num', or 'num', if it's
141
+ * already a power of 2.
142
+ *
143
+ * 'num' mustn't be 0 or be above PG_UINT32_MAX / 2 + 1.
144
+ */
145
+ static inline uint32
146
+ pg_nextpower2_32(uint32 num)
147
+ {
148
+ Assert(num > 0 && num <= PG_UINT32_MAX / 2 + 1);
149
+
150
+ /*
151
+ * A power 2 number has only 1 bit set. Subtracting 1 from such a number
152
+ * will turn on all previous bits resulting in no common bits being set
153
+ * between num and num-1.
154
+ */
155
+ if ((num & (num - 1)) == 0)
156
+ return num; /* already power 2 */
157
+
158
+ return ((uint32) 1) << (pg_leftmost_one_pos32(num) + 1);
159
+ }
160
+
161
+ /*
162
+ * pg_nextpower2_64
163
+ * Returns the next highest power of 2 of 'num', or 'num', if it's
164
+ * already a power of 2.
165
+ *
166
+ * 'num' mustn't be 0 or be above PG_UINT64_MAX / 2 + 1.
167
+ */
168
+ static inline uint64
169
+ pg_nextpower2_64(uint64 num)
170
+ {
171
+ Assert(num > 0 && num <= PG_UINT64_MAX / 2 + 1);
172
+
173
+ /*
174
+ * A power 2 number has only 1 bit set. Subtracting 1 from such a number
175
+ * will turn on all previous bits resulting in no common bits being set
176
+ * between num and num-1.
177
+ */
178
+ if ((num & (num - 1)) == 0)
179
+ return num; /* already power 2 */
180
+
181
+ return ((uint64) 1) << (pg_leftmost_one_pos64(num) + 1);
182
+ }
183
+
184
+ /*
185
+ * pg_ceil_log2_32
186
+ * Returns equivalent of ceil(log2(num))
187
+ */
188
+ static inline uint32
189
+ pg_ceil_log2_32(uint32 num)
190
+ {
191
+ if (num < 2)
192
+ return 0;
193
+ else
194
+ return pg_leftmost_one_pos32(num - 1) + 1;
195
+ }
196
+
197
+ /*
198
+ * pg_ceil_log2_64
199
+ * Returns equivalent of ceil(log2(num))
200
+ */
201
+ static inline uint64
202
+ pg_ceil_log2_64(uint64 num)
203
+ {
204
+ if (num < 2)
205
+ return 0;
206
+ else
207
+ return pg_leftmost_one_pos64(num - 1) + 1;
208
+ }
209
+
210
+ /* Count the number of one-bits in a uint32 or uint64 */
211
+ extern int (*pg_popcount32) (uint32 word);
212
+ extern int (*pg_popcount64) (uint64 word);
213
+
214
+ /* Count the number of one-bits in a byte array */
215
+ extern uint64 pg_popcount(const char *buf, int bytes);
216
+
217
+ /*
218
+ * Rotate the bits of "word" to the right by n bits.
219
+ */
220
+ static inline uint32
221
+ pg_rotate_right32(uint32 word, int n)
222
+ {
223
+ return (word >> n) | (word << (sizeof(word) * BITS_PER_BYTE - n));
224
+ }
225
+
226
+ #endif /* PG_BITUTILS_H */