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,255 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - UnreservedPLKeywords
4
+ * - UnreservedPLKeywords_kw_string
5
+ * - UnreservedPLKeywords_kw_offsets
6
+ * - UnreservedPLKeywords_hash_func
7
+ *--------------------------------------------------------------------
8
+ */
9
+
10
+ /*-------------------------------------------------------------------------
11
+ *
12
+ * pl_unreserved_kwlist_d.h
13
+ * List of keywords represented as a ScanKeywordList.
14
+ *
15
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
16
+ * Portions Copyright (c) 1994, Regents of the University of California
17
+ *
18
+ * NOTES
19
+ * ******************************
20
+ * *** DO NOT EDIT THIS FILE! ***
21
+ * ******************************
22
+ *
23
+ * It has been GENERATED by src/tools/gen_keywordlist.pl
24
+ *
25
+ *-------------------------------------------------------------------------
26
+ */
27
+
28
+ #ifndef PL_UNRESERVED_KWLIST_D_H
29
+ #define PL_UNRESERVED_KWLIST_D_H
30
+
31
+ #include "common/kwlookup.h"
32
+
33
+ static const char UnreservedPLKeywords_kw_string[] =
34
+ "absolute\0"
35
+ "alias\0"
36
+ "and\0"
37
+ "array\0"
38
+ "assert\0"
39
+ "backward\0"
40
+ "call\0"
41
+ "chain\0"
42
+ "close\0"
43
+ "collate\0"
44
+ "column\0"
45
+ "column_name\0"
46
+ "commit\0"
47
+ "constant\0"
48
+ "constraint\0"
49
+ "constraint_name\0"
50
+ "continue\0"
51
+ "current\0"
52
+ "cursor\0"
53
+ "datatype\0"
54
+ "debug\0"
55
+ "default\0"
56
+ "detail\0"
57
+ "diagnostics\0"
58
+ "do\0"
59
+ "dump\0"
60
+ "elseif\0"
61
+ "elsif\0"
62
+ "errcode\0"
63
+ "error\0"
64
+ "exception\0"
65
+ "exit\0"
66
+ "fetch\0"
67
+ "first\0"
68
+ "forward\0"
69
+ "get\0"
70
+ "hint\0"
71
+ "import\0"
72
+ "info\0"
73
+ "insert\0"
74
+ "is\0"
75
+ "last\0"
76
+ "log\0"
77
+ "message\0"
78
+ "message_text\0"
79
+ "move\0"
80
+ "next\0"
81
+ "no\0"
82
+ "notice\0"
83
+ "open\0"
84
+ "option\0"
85
+ "perform\0"
86
+ "pg_context\0"
87
+ "pg_datatype_name\0"
88
+ "pg_exception_context\0"
89
+ "pg_exception_detail\0"
90
+ "pg_exception_hint\0"
91
+ "print_strict_params\0"
92
+ "prior\0"
93
+ "query\0"
94
+ "raise\0"
95
+ "relative\0"
96
+ "reset\0"
97
+ "return\0"
98
+ "returned_sqlstate\0"
99
+ "reverse\0"
100
+ "rollback\0"
101
+ "row_count\0"
102
+ "rowtype\0"
103
+ "schema\0"
104
+ "schema_name\0"
105
+ "scroll\0"
106
+ "set\0"
107
+ "slice\0"
108
+ "sqlstate\0"
109
+ "stacked\0"
110
+ "table\0"
111
+ "table_name\0"
112
+ "type\0"
113
+ "use_column\0"
114
+ "use_variable\0"
115
+ "variable_conflict\0"
116
+ "warning";
117
+
118
+ static const uint16 UnreservedPLKeywords_kw_offsets[] = {
119
+ 0,
120
+ 9,
121
+ 15,
122
+ 19,
123
+ 25,
124
+ 32,
125
+ 41,
126
+ 46,
127
+ 52,
128
+ 58,
129
+ 66,
130
+ 73,
131
+ 85,
132
+ 92,
133
+ 101,
134
+ 112,
135
+ 128,
136
+ 137,
137
+ 145,
138
+ 152,
139
+ 161,
140
+ 167,
141
+ 175,
142
+ 182,
143
+ 194,
144
+ 197,
145
+ 202,
146
+ 209,
147
+ 215,
148
+ 223,
149
+ 229,
150
+ 239,
151
+ 244,
152
+ 250,
153
+ 256,
154
+ 264,
155
+ 268,
156
+ 273,
157
+ 280,
158
+ 285,
159
+ 292,
160
+ 295,
161
+ 300,
162
+ 304,
163
+ 312,
164
+ 325,
165
+ 330,
166
+ 335,
167
+ 338,
168
+ 345,
169
+ 350,
170
+ 357,
171
+ 365,
172
+ 376,
173
+ 393,
174
+ 414,
175
+ 434,
176
+ 452,
177
+ 472,
178
+ 478,
179
+ 484,
180
+ 490,
181
+ 499,
182
+ 505,
183
+ 512,
184
+ 530,
185
+ 538,
186
+ 547,
187
+ 557,
188
+ 565,
189
+ 572,
190
+ 584,
191
+ 591,
192
+ 595,
193
+ 601,
194
+ 610,
195
+ 618,
196
+ 624,
197
+ 635,
198
+ 640,
199
+ 651,
200
+ 664,
201
+ 682,
202
+ };
203
+
204
+ #define UNRESERVEDPLKEYWORDS_NUM_KEYWORDS 83
205
+
206
+ static int
207
+ UnreservedPLKeywords_hash_func(const void *key, size_t keylen)
208
+ {
209
+ static const int16 h[167] = {
210
+ 10, 32767, 32767, 57, 32767, 62, 21, 32767,
211
+ 54, 18, 32767, 58, 59, -54, 47, 0,
212
+ -22, -64, 32767, -22, 33, 44, -5, 32767,
213
+ 32767, 43, 57, 102, 32767, -65, 7, 32767,
214
+ 13, 32767, -28, 14, 32767, 32767, 82, 32767,
215
+ 0, 0, 32767, 8, -43, 0, 19, 8,
216
+ 75, -58, 32767, 32767, 0, 22, 29, 32767,
217
+ -50, 6, 32767, 0, 30, 32767, 32767, 29,
218
+ 0, 104, 32767, 32767, 26, 0, 32767, 32767,
219
+ -9, 2, 32767, 50, 39, 38, 39, 80,
220
+ 32767, 32767, 32767, 32767, -67, 89, 32767, -40,
221
+ 64, 32767, 32767, 26, 10, 27, 32767, 19,
222
+ 51, -13, 26, 32767, 32767, 32767, 84, 23,
223
+ 0, 66, 12, -5, 32767, 32767, 0, 50,
224
+ 141, 72, 45, 32767, 32767, 0, -22, 0,
225
+ 32767, 32767, -34, 0, 19, -5, 32767, 32767,
226
+ 32767, 0, 37, 13, 32767, 32767, 32767, 32767,
227
+ -68, -4, 32767, 32767, 78, 32767, 32767, 0,
228
+ 85, 32767, 32767, 32767, -93, 32767, 0, 0,
229
+ 32767, 74, 5, 32767, 32767, 71, 0, 32767,
230
+ 32767, 0, 32767, 32767, 32767, 46, 70,
231
+ };
232
+
233
+ const unsigned char *k = (const unsigned char *) key;
234
+ uint32 a = 0;
235
+ uint32 b = 1;
236
+
237
+ while (keylen--)
238
+ {
239
+ unsigned char c = *k++ | 0x20;
240
+
241
+ a = a * 31 + c;
242
+ b = b * 127 + c;
243
+ }
244
+ return h[a % 167] + h[b % 167];
245
+ }
246
+
247
+ static const ScanKeywordList UnreservedPLKeywords = {
248
+ UnreservedPLKeywords_kw_string,
249
+ UnreservedPLKeywords_kw_offsets,
250
+ UnreservedPLKeywords_hash_func,
251
+ UNRESERVEDPLKEYWORDS_NUM_KEYWORDS,
252
+ 20
253
+ };
254
+
255
+ #endif /* PL_UNRESERVED_KWLIST_D_H */
@@ -0,0 +1,127 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - pg_lrand48
4
+ * - _dorand48
5
+ * - _rand48_seed
6
+ *--------------------------------------------------------------------
7
+ */
8
+
9
+ /*-------------------------------------------------------------------------
10
+ *
11
+ * erand48.c
12
+ *
13
+ * This file supplies pg_erand48() and related functions, which except
14
+ * for the names are just like the POSIX-standard erand48() family.
15
+ * (We don't supply the full set though, only the ones we have found use
16
+ * for in Postgres. In particular, we do *not* implement lcong48(), so
17
+ * that there is no need for the multiplier and addend to be variable.)
18
+ *
19
+ * We used to test for an operating system version rather than
20
+ * unconditionally using our own, but (1) some versions of Cygwin have a
21
+ * buggy erand48() that always returns zero and (2) as of 2011, glibc's
22
+ * erand48() is strangely coded to be almost-but-not-quite thread-safe,
23
+ * which doesn't matter for the backend but is important for pgbench.
24
+ *
25
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
26
+ *
27
+ * Portions Copyright (c) 1993 Martin Birgmeier
28
+ * All rights reserved.
29
+ *
30
+ * You may redistribute unmodified or modified versions of this source
31
+ * code provided that the above copyright notice and this and the
32
+ * following conditions are retained.
33
+ *
34
+ * This software is provided ``as is'', and comes with no warranties
35
+ * of any kind. I shall in no event be liable for anything that happens
36
+ * to anyone/anything when using this software.
37
+ *
38
+ * IDENTIFICATION
39
+ * src/port/erand48.c
40
+ *
41
+ *-------------------------------------------------------------------------
42
+ */
43
+
44
+ #include "c.h"
45
+
46
+ #include <math.h>
47
+
48
+ /* These values are specified by POSIX */
49
+ #define RAND48_MULT UINT64CONST(0x0005deece66d)
50
+ #define RAND48_ADD UINT64CONST(0x000b)
51
+
52
+ /* POSIX specifies 0x330e's use in srand48, but the other bits are arbitrary */
53
+ #define RAND48_SEED_0 (0x330e)
54
+ #define RAND48_SEED_1 (0xabcd)
55
+ #define RAND48_SEED_2 (0x1234)
56
+
57
+ static __thread unsigned short _rand48_seed[3] = {
58
+ RAND48_SEED_0,
59
+ RAND48_SEED_1,
60
+ RAND48_SEED_2
61
+ };
62
+
63
+
64
+
65
+ /*
66
+ * Advance the 48-bit value stored in xseed[] to the next "random" number.
67
+ *
68
+ * Also returns the value of that number --- without masking it to 48 bits.
69
+ * If caller uses the result, it must mask off the bits it wants.
70
+ */
71
+ static uint64
72
+ _dorand48(unsigned short xseed[3])
73
+ {
74
+ /*
75
+ * We do the arithmetic in uint64; any type wider than 48 bits would work.
76
+ */
77
+ uint64 in;
78
+ uint64 out;
79
+
80
+ in = (uint64) xseed[2] << 32 | (uint64) xseed[1] << 16 | (uint64) xseed[0];
81
+
82
+ out = in * RAND48_MULT + RAND48_ADD;
83
+
84
+ xseed[0] = out & 0xFFFF;
85
+ xseed[1] = (out >> 16) & 0xFFFF;
86
+ xseed[2] = (out >> 32) & 0xFFFF;
87
+
88
+ return out;
89
+ }
90
+
91
+
92
+ /*
93
+ * Generate a random floating-point value using caller-supplied state.
94
+ * Values are uniformly distributed over the interval [0.0, 1.0).
95
+ */
96
+
97
+
98
+ /*
99
+ * Generate a random non-negative integral value using internal state.
100
+ * Values are uniformly distributed over the interval [0, 2^31).
101
+ */
102
+ long
103
+ pg_lrand48(void)
104
+ {
105
+ uint64 x = _dorand48(_rand48_seed);
106
+
107
+ return (x >> 17) & UINT64CONST(0x7FFFFFFF);
108
+ }
109
+
110
+ /*
111
+ * Generate a random signed integral value using caller-supplied state.
112
+ * Values are uniformly distributed over the interval [-2^31, 2^31).
113
+ */
114
+
115
+
116
+ /*
117
+ * Initialize the internal state using the given seed.
118
+ *
119
+ * Per POSIX, this uses only 32 bits from "seed" even if "long" is wider.
120
+ * Hence, the set of possible seed values is smaller than it could be.
121
+ * Better practice is to use caller-supplied state and initialize it with
122
+ * random bits obtained from a high-quality source of random bits.
123
+ *
124
+ * Note: POSIX specifies a function seed48() that allows all 48 bits
125
+ * of the internal state to be set, but we don't currently support that.
126
+ */
127
+
@@ -0,0 +1,246 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - pg_popcount64
4
+ * - pg_popcount64_choose
5
+ * - pg_popcount32
6
+ * - pg_popcount32_choose
7
+ * - pg_popcount_available
8
+ * - pg_popcount32_asm
9
+ * - pg_popcount64_asm
10
+ * - pg_popcount32_slow
11
+ * - pg_popcount64_slow
12
+ *--------------------------------------------------------------------
13
+ */
14
+
15
+ /*-------------------------------------------------------------------------
16
+ *
17
+ * pg_bitutils.c
18
+ * Miscellaneous functions for bit-wise operations.
19
+ *
20
+ * Copyright (c) 2019-2020, PostgreSQL Global Development Group
21
+ *
22
+ * IDENTIFICATION
23
+ * src/port/pg_bitutils.c
24
+ *
25
+ *-------------------------------------------------------------------------
26
+ */
27
+ #include "c.h"
28
+
29
+ #ifdef HAVE__GET_CPUID
30
+ #include <cpuid.h>
31
+ #endif
32
+ #ifdef HAVE__CPUID
33
+ #include <intrin.h>
34
+ #endif
35
+
36
+ #include "port/pg_bitutils.h"
37
+
38
+
39
+ /*
40
+ * Array giving the position of the left-most set bit for each possible
41
+ * byte value. We count the right-most position as the 0th bit, and the
42
+ * left-most the 7th bit. The 0th entry of the array should not be used.
43
+ *
44
+ * Note: this is not used by the functions in pg_bitutils.h when
45
+ * HAVE__BUILTIN_CLZ is defined, but we provide it anyway, so that
46
+ * extensions possibly compiled with a different compiler can use it.
47
+ */
48
+
49
+
50
+ /*
51
+ * Array giving the position of the right-most set bit for each possible
52
+ * byte value. We count the right-most position as the 0th bit, and the
53
+ * left-most the 7th bit. The 0th entry of the array should not be used.
54
+ *
55
+ * Note: this is not used by the functions in pg_bitutils.h when
56
+ * HAVE__BUILTIN_CTZ is defined, but we provide it anyway, so that
57
+ * extensions possibly compiled with a different compiler can use it.
58
+ */
59
+
60
+
61
+ /*
62
+ * Array giving the number of 1-bits in each possible byte value.
63
+ *
64
+ * Note: we export this for use by functions in which explicit use
65
+ * of the popcount functions seems unlikely to be a win.
66
+ */
67
+
68
+
69
+ /*
70
+ * On x86_64, we can use the hardware popcount instruction, but only if
71
+ * we can verify that the CPU supports it via the cpuid instruction.
72
+ *
73
+ * Otherwise, we fall back to __builtin_popcount if the compiler has that,
74
+ * or a hand-rolled implementation if not.
75
+ */
76
+ #ifdef HAVE_X86_64_POPCNTQ
77
+ #if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
78
+ #define USE_POPCNT_ASM 1
79
+ #endif
80
+ #endif
81
+
82
+ static int pg_popcount32_slow(uint32 word);
83
+ static int pg_popcount64_slow(uint64 word);
84
+
85
+ #ifdef USE_POPCNT_ASM
86
+ static bool pg_popcount_available(void);
87
+ static int pg_popcount32_choose(uint32 word);
88
+ static int pg_popcount64_choose(uint64 word);
89
+ static int pg_popcount32_asm(uint32 word);
90
+ static int pg_popcount64_asm(uint64 word);
91
+
92
+ int (*pg_popcount32) (uint32 word) = pg_popcount32_choose;
93
+ int (*pg_popcount64) (uint64 word) = pg_popcount64_choose;
94
+ #else
95
+ int (*pg_popcount32) (uint32 word) = pg_popcount32_slow;
96
+ int (*pg_popcount64) (uint64 word) = pg_popcount64_slow;
97
+ #endif /* USE_POPCNT_ASM */
98
+
99
+ #ifdef USE_POPCNT_ASM
100
+
101
+ /*
102
+ * Return true if CPUID indicates that the POPCNT instruction is available.
103
+ */
104
+ static bool
105
+ pg_popcount_available(void)
106
+ {
107
+ unsigned int exx[4] = {0, 0, 0, 0};
108
+
109
+ #if defined(HAVE__GET_CPUID)
110
+ __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
111
+ #elif defined(HAVE__CPUID)
112
+ __cpuid(exx, 1);
113
+ #else
114
+ #error cpuid instruction not available
115
+ #endif
116
+
117
+ return (exx[2] & (1 << 23)) != 0; /* POPCNT */
118
+ }
119
+
120
+ /*
121
+ * These functions get called on the first call to pg_popcount32 etc.
122
+ * They detect whether we can use the asm implementations, and replace
123
+ * the function pointers so that subsequent calls are routed directly to
124
+ * the chosen implementation.
125
+ */
126
+ static int
127
+ pg_popcount32_choose(uint32 word)
128
+ {
129
+ if (pg_popcount_available())
130
+ {
131
+ pg_popcount32 = pg_popcount32_asm;
132
+ pg_popcount64 = pg_popcount64_asm;
133
+ }
134
+ else
135
+ {
136
+ pg_popcount32 = pg_popcount32_slow;
137
+ pg_popcount64 = pg_popcount64_slow;
138
+ }
139
+
140
+ return pg_popcount32(word);
141
+ }
142
+
143
+ static int
144
+ pg_popcount64_choose(uint64 word)
145
+ {
146
+ if (pg_popcount_available())
147
+ {
148
+ pg_popcount32 = pg_popcount32_asm;
149
+ pg_popcount64 = pg_popcount64_asm;
150
+ }
151
+ else
152
+ {
153
+ pg_popcount32 = pg_popcount32_slow;
154
+ pg_popcount64 = pg_popcount64_slow;
155
+ }
156
+
157
+ return pg_popcount64(word);
158
+ }
159
+
160
+ /*
161
+ * pg_popcount32_asm
162
+ * Return the number of 1 bits set in word
163
+ */
164
+ static int
165
+ pg_popcount32_asm(uint32 word)
166
+ {
167
+ uint32 res;
168
+
169
+ __asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc");
170
+ return (int) res;
171
+ }
172
+
173
+ /*
174
+ * pg_popcount64_asm
175
+ * Return the number of 1 bits set in word
176
+ */
177
+ static int
178
+ pg_popcount64_asm(uint64 word)
179
+ {
180
+ uint64 res;
181
+
182
+ __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc");
183
+ return (int) res;
184
+ }
185
+
186
+ #endif /* USE_POPCNT_ASM */
187
+
188
+
189
+ /*
190
+ * pg_popcount32_slow
191
+ * Return the number of 1 bits set in word
192
+ */
193
+ static int
194
+ pg_popcount32_slow(uint32 word)
195
+ {
196
+ #ifdef HAVE__BUILTIN_POPCOUNT
197
+ return __builtin_popcount(word);
198
+ #else /* !HAVE__BUILTIN_POPCOUNT */
199
+ int result = 0;
200
+
201
+ while (word != 0)
202
+ {
203
+ result += pg_number_of_ones[word & 255];
204
+ word >>= 8;
205
+ }
206
+
207
+ return result;
208
+ #endif /* HAVE__BUILTIN_POPCOUNT */
209
+ }
210
+
211
+ /*
212
+ * pg_popcount64_slow
213
+ * Return the number of 1 bits set in word
214
+ */
215
+ static int
216
+ pg_popcount64_slow(uint64 word)
217
+ {
218
+ #ifdef HAVE__BUILTIN_POPCOUNT
219
+ #if defined(HAVE_LONG_INT_64)
220
+ return __builtin_popcountl(word);
221
+ #elif defined(HAVE_LONG_LONG_INT_64)
222
+ return __builtin_popcountll(word);
223
+ #else
224
+ #error must have a working 64-bit integer datatype
225
+ #endif
226
+ #else /* !HAVE__BUILTIN_POPCOUNT */
227
+ int result = 0;
228
+
229
+ while (word != 0)
230
+ {
231
+ result += pg_number_of_ones[word & 255];
232
+ word >>= 8;
233
+ }
234
+
235
+ return result;
236
+ #endif /* HAVE__BUILTIN_POPCOUNT */
237
+ }
238
+
239
+
240
+ /*
241
+ * pg_popcount
242
+ * Returns the number of 1-bits in buf
243
+ */
244
+ #if SIZEOF_VOID_P >= 8
245
+ #else
246
+ #endif