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,231 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * expandedrecord.h
4
+ * Declarations for composite expanded objects.
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ * src/include/utils/expandedrecord.h
10
+ *
11
+ *-------------------------------------------------------------------------
12
+ */
13
+ #ifndef EXPANDEDRECORD_H
14
+ #define EXPANDEDRECORD_H
15
+
16
+ #include "access/htup.h"
17
+ #include "access/tupdesc.h"
18
+ #include "fmgr.h"
19
+ #include "utils/expandeddatum.h"
20
+
21
+
22
+ /*
23
+ * An expanded record is contained within a private memory context (as
24
+ * all expanded objects must be) and has a control structure as below.
25
+ *
26
+ * The expanded record might contain a regular "flat" tuple if that was the
27
+ * original input and we've not modified it. Otherwise, the contents are
28
+ * represented by Datum/isnull arrays plus type information. We could also
29
+ * have both forms, if we've deconstructed the original tuple for access
30
+ * purposes but not yet changed it. For pass-by-reference field types, the
31
+ * Datums would point into the flat tuple in this situation. Once we start
32
+ * modifying tuple fields, new pass-by-ref fields are separately palloc'd
33
+ * within the memory context.
34
+ *
35
+ * It's possible to build an expanded record that references a "flat" tuple
36
+ * stored externally, if the caller can guarantee that that tuple will not
37
+ * change for the lifetime of the expanded record. (This frammish is mainly
38
+ * meant to avoid unnecessary data copying in trigger functions.)
39
+ */
40
+ #define ER_MAGIC 1384727874 /* ID for debugging crosschecks */
41
+
42
+ typedef struct ExpandedRecordHeader
43
+ {
44
+ /* Standard header for expanded objects */
45
+ ExpandedObjectHeader hdr;
46
+
47
+ /* Magic value identifying an expanded record (for debugging only) */
48
+ int er_magic;
49
+
50
+ /* Assorted flag bits */
51
+ int flags;
52
+ #define ER_FLAG_FVALUE_VALID 0x0001 /* fvalue is up to date? */
53
+ #define ER_FLAG_FVALUE_ALLOCED 0x0002 /* fvalue is local storage? */
54
+ #define ER_FLAG_DVALUES_VALID 0x0004 /* dvalues/dnulls are up to date? */
55
+ #define ER_FLAG_DVALUES_ALLOCED 0x0008 /* any field values local storage? */
56
+ #define ER_FLAG_HAVE_EXTERNAL 0x0010 /* any field values are external? */
57
+ #define ER_FLAG_TUPDESC_ALLOCED 0x0020 /* tupdesc is local storage? */
58
+ #define ER_FLAG_IS_DOMAIN 0x0040 /* er_decltypeid is domain? */
59
+ #define ER_FLAG_IS_DUMMY 0x0080 /* this header is dummy (see below) */
60
+ /* flag bits that are not to be cleared when replacing tuple data: */
61
+ #define ER_FLAGS_NON_DATA \
62
+ (ER_FLAG_TUPDESC_ALLOCED | ER_FLAG_IS_DOMAIN | ER_FLAG_IS_DUMMY)
63
+
64
+ /* Declared type of the record variable (could be a domain type) */
65
+ Oid er_decltypeid;
66
+
67
+ /*
68
+ * Actual composite type/typmod; never a domain (if ER_FLAG_IS_DOMAIN,
69
+ * these identify the composite base type). These will match
70
+ * er_tupdesc->tdtypeid/tdtypmod, as well as the header fields of
71
+ * composite datums made from or stored in this expanded record.
72
+ */
73
+ Oid er_typeid; /* type OID of the composite type */
74
+ int32 er_typmod; /* typmod of the composite type */
75
+
76
+ /*
77
+ * Tuple descriptor, if we have one, else NULL. This may point to a
78
+ * reference-counted tupdesc originally belonging to the typcache, in
79
+ * which case we use a memory context reset callback to release the
80
+ * refcount. It can also be locally allocated in this object's private
81
+ * context (in which case ER_FLAG_TUPDESC_ALLOCED is set).
82
+ */
83
+ TupleDesc er_tupdesc;
84
+
85
+ /*
86
+ * Unique-within-process identifier for the tupdesc (see typcache.h). This
87
+ * field will never be equal to INVALID_TUPLEDESC_IDENTIFIER.
88
+ */
89
+ uint64 er_tupdesc_id;
90
+
91
+ /*
92
+ * If we have a Datum-array representation of the record, it's kept here;
93
+ * else ER_FLAG_DVALUES_VALID is not set, and dvalues/dnulls may be NULL
94
+ * if they've not yet been allocated. If allocated, the dvalues and
95
+ * dnulls arrays are palloc'd within the object private context, and are
96
+ * of length matching er_tupdesc->natts. For pass-by-ref field types,
97
+ * dvalues entries might point either into the fstartptr..fendptr area, or
98
+ * to separately palloc'd chunks.
99
+ */
100
+ Datum *dvalues; /* array of Datums */
101
+ bool *dnulls; /* array of is-null flags for Datums */
102
+ int nfields; /* length of above arrays */
103
+
104
+ /*
105
+ * flat_size is the current space requirement for the flat equivalent of
106
+ * the expanded record, if known; otherwise it's 0. We store this to make
107
+ * consecutive calls of get_flat_size cheap. If flat_size is not 0, the
108
+ * component values data_len, hoff, and hasnull must be valid too.
109
+ */
110
+ Size flat_size;
111
+
112
+ Size data_len; /* data len within flat_size */
113
+ int hoff; /* header offset */
114
+ bool hasnull; /* null bitmap needed? */
115
+
116
+ /*
117
+ * fvalue points to the flat representation if we have one, else it is
118
+ * NULL. If the flat representation is valid (up to date) then
119
+ * ER_FLAG_FVALUE_VALID is set. Even if we've outdated the flat
120
+ * representation due to changes of user fields, it can still be used to
121
+ * fetch system column values. If we have a flat representation then
122
+ * fstartptr/fendptr point to the start and end+1 of its data area; this
123
+ * is so that we can tell which Datum pointers point into the flat
124
+ * representation rather than being pointers to separately palloc'd data.
125
+ */
126
+ HeapTuple fvalue; /* might or might not be private storage */
127
+ char *fstartptr; /* start of its data area */
128
+ char *fendptr; /* end+1 of its data area */
129
+
130
+ /* Some operations on the expanded record need a short-lived context */
131
+ MemoryContext er_short_term_cxt; /* short-term memory context */
132
+
133
+ /* Working state for domain checking, used if ER_FLAG_IS_DOMAIN is set */
134
+ struct ExpandedRecordHeader *er_dummy_header; /* dummy record header */
135
+ void *er_domaininfo; /* cache space for domain_check() */
136
+
137
+ /* Callback info (it's active if er_mcb.arg is not NULL) */
138
+ MemoryContextCallback er_mcb;
139
+ } ExpandedRecordHeader;
140
+
141
+ /* fmgr macros for expanded record objects */
142
+ #define PG_GETARG_EXPANDED_RECORD(n) DatumGetExpandedRecord(PG_GETARG_DATUM(n))
143
+ #define ExpandedRecordGetDatum(erh) EOHPGetRWDatum(&(erh)->hdr)
144
+ #define ExpandedRecordGetRODatum(erh) EOHPGetRODatum(&(erh)->hdr)
145
+ #define PG_RETURN_EXPANDED_RECORD(x) PG_RETURN_DATUM(ExpandedRecordGetDatum(x))
146
+
147
+ /* assorted other macros */
148
+ #define ExpandedRecordIsEmpty(erh) \
149
+ (((erh)->flags & (ER_FLAG_DVALUES_VALID | ER_FLAG_FVALUE_VALID)) == 0)
150
+ #define ExpandedRecordIsDomain(erh) \
151
+ (((erh)->flags & ER_FLAG_IS_DOMAIN) != 0)
152
+
153
+ /* this can substitute for TransferExpandedObject() when we already have erh */
154
+ #define TransferExpandedRecord(erh, cxt) \
155
+ MemoryContextSetParent((erh)->hdr.eoh_context, cxt)
156
+
157
+ /* information returned by expanded_record_lookup_field() */
158
+ typedef struct ExpandedRecordFieldInfo
159
+ {
160
+ int fnumber; /* field's attr number in record */
161
+ Oid ftypeid; /* field's type/typmod info */
162
+ int32 ftypmod;
163
+ Oid fcollation; /* field's collation if any */
164
+ } ExpandedRecordFieldInfo;
165
+
166
+ /*
167
+ * prototypes for functions defined in expandedrecord.c
168
+ */
169
+ extern ExpandedRecordHeader *make_expanded_record_from_typeid(Oid type_id, int32 typmod,
170
+ MemoryContext parentcontext);
171
+ extern ExpandedRecordHeader *make_expanded_record_from_tupdesc(TupleDesc tupdesc,
172
+ MemoryContext parentcontext);
173
+ extern ExpandedRecordHeader *make_expanded_record_from_exprecord(ExpandedRecordHeader *olderh,
174
+ MemoryContext parentcontext);
175
+ extern void expanded_record_set_tuple(ExpandedRecordHeader *erh,
176
+ HeapTuple tuple, bool copy, bool expand_external);
177
+ extern Datum make_expanded_record_from_datum(Datum recorddatum,
178
+ MemoryContext parentcontext);
179
+ extern TupleDesc expanded_record_fetch_tupdesc(ExpandedRecordHeader *erh);
180
+ extern HeapTuple expanded_record_get_tuple(ExpandedRecordHeader *erh);
181
+ extern ExpandedRecordHeader *DatumGetExpandedRecord(Datum d);
182
+ extern void deconstruct_expanded_record(ExpandedRecordHeader *erh);
183
+ extern bool expanded_record_lookup_field(ExpandedRecordHeader *erh,
184
+ const char *fieldname,
185
+ ExpandedRecordFieldInfo *finfo);
186
+ extern Datum expanded_record_fetch_field(ExpandedRecordHeader *erh, int fnumber,
187
+ bool *isnull);
188
+ extern void expanded_record_set_field_internal(ExpandedRecordHeader *erh,
189
+ int fnumber,
190
+ Datum newValue, bool isnull,
191
+ bool expand_external,
192
+ bool check_constraints);
193
+ extern void expanded_record_set_fields(ExpandedRecordHeader *erh,
194
+ const Datum *newValues, const bool *isnulls,
195
+ bool expand_external);
196
+
197
+ /* outside code should never call expanded_record_set_field_internal as such */
198
+ #define expanded_record_set_field(erh, fnumber, newValue, isnull, expand_external) \
199
+ expanded_record_set_field_internal(erh, fnumber, newValue, isnull, expand_external, true)
200
+
201
+ /*
202
+ * Inline-able fast cases. The expanded_record_fetch_xxx functions above
203
+ * handle the general cases.
204
+ */
205
+
206
+ /* Get the tupdesc for the expanded record's actual type */
207
+ static inline TupleDesc
208
+ expanded_record_get_tupdesc(ExpandedRecordHeader *erh)
209
+ {
210
+ if (likely(erh->er_tupdesc != NULL))
211
+ return erh->er_tupdesc;
212
+ else
213
+ return expanded_record_fetch_tupdesc(erh);
214
+ }
215
+
216
+ /* Get value of record field */
217
+ static inline Datum
218
+ expanded_record_get_field(ExpandedRecordHeader *erh, int fnumber,
219
+ bool *isnull)
220
+ {
221
+ if ((erh->flags & ER_FLAG_DVALUES_VALID) &&
222
+ likely(fnumber > 0 && fnumber <= erh->nfields))
223
+ {
224
+ *isnull = erh->dnulls[fnumber - 1];
225
+ return erh->dvalues[fnumber - 1];
226
+ }
227
+ else
228
+ return expanded_record_fetch_field(erh, fnumber, isnull);
229
+ }
230
+
231
+ #endif /* EXPANDEDRECORD_H */
@@ -0,0 +1,356 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * float.h
4
+ * Definitions for the built-in floating-point types
5
+ *
6
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
7
+ * Portions Copyright (c) 1994, Regents of the University of California
8
+ *
9
+ *
10
+ * IDENTIFICATION
11
+ * src/include/utils/float.h
12
+ *
13
+ *-------------------------------------------------------------------------
14
+ */
15
+ #ifndef FLOAT_H
16
+ #define FLOAT_H
17
+
18
+ #include <math.h>
19
+
20
+ #ifndef M_PI
21
+ /* From my RH5.2 gcc math.h file - thomas 2000-04-03 */
22
+ #define M_PI 3.14159265358979323846
23
+ #endif
24
+
25
+ /* Radians per degree, a.k.a. PI / 180 */
26
+ #define RADIANS_PER_DEGREE 0.0174532925199432957692
27
+
28
+ /* Visual C++ etc lacks NAN, and won't accept 0.0/0.0. */
29
+ #if defined(WIN32) && !defined(NAN)
30
+ static const uint32 nan[2] = {0xffffffff, 0x7fffffff};
31
+
32
+ #define NAN (*(const float8 *) nan)
33
+ #endif
34
+
35
+ extern PGDLLIMPORT int extra_float_digits;
36
+
37
+ /*
38
+ * Utility functions in float.c
39
+ */
40
+ extern void float_overflow_error(void) pg_attribute_noreturn();
41
+ extern void float_underflow_error(void) pg_attribute_noreturn();
42
+ extern void float_zero_divide_error(void) pg_attribute_noreturn();
43
+ extern int is_infinite(float8 val);
44
+ extern float8 float8in_internal(char *num, char **endptr_p,
45
+ const char *type_name, const char *orig_string);
46
+ extern float8 float8in_internal_opt_error(char *num, char **endptr_p,
47
+ const char *type_name, const char *orig_string,
48
+ bool *have_error);
49
+ extern char *float8out_internal(float8 num);
50
+ extern int float4_cmp_internal(float4 a, float4 b);
51
+ extern int float8_cmp_internal(float8 a, float8 b);
52
+
53
+ /*
54
+ * Routines to provide reasonably platform-independent handling of
55
+ * infinity and NaN
56
+ *
57
+ * We assume that isinf() and isnan() are available and work per spec.
58
+ * (On some platforms, we have to supply our own; see src/port.) However,
59
+ * generating an Infinity or NaN in the first place is less well standardized;
60
+ * pre-C99 systems tend not to have C99's INFINITY and NaN macros. We
61
+ * centralize our workarounds for this here.
62
+ */
63
+
64
+ /*
65
+ * The funny placements of the two #pragmas is necessary because of a
66
+ * long lived bug in the Microsoft compilers.
67
+ * See http://support.microsoft.com/kb/120968/en-us for details
68
+ */
69
+ #ifdef _MSC_VER
70
+ #pragma warning(disable:4756)
71
+ #endif
72
+ static inline float4
73
+ get_float4_infinity(void)
74
+ {
75
+ #ifdef INFINITY
76
+ /* C99 standard way */
77
+ return (float4) INFINITY;
78
+ #else
79
+ #ifdef _MSC_VER
80
+ #pragma warning(default:4756)
81
+ #endif
82
+
83
+ /*
84
+ * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
85
+ * largest normal float8. We assume forcing an overflow will get us a
86
+ * true infinity.
87
+ */
88
+ return (float4) (HUGE_VAL * HUGE_VAL);
89
+ #endif
90
+ }
91
+
92
+ static inline float8
93
+ get_float8_infinity(void)
94
+ {
95
+ #ifdef INFINITY
96
+ /* C99 standard way */
97
+ return (float8) INFINITY;
98
+ #else
99
+
100
+ /*
101
+ * On some platforms, HUGE_VAL is an infinity, elsewhere it's just the
102
+ * largest normal float8. We assume forcing an overflow will get us a
103
+ * true infinity.
104
+ */
105
+ return (float8) (HUGE_VAL * HUGE_VAL);
106
+ #endif
107
+ }
108
+
109
+ static inline float4
110
+ get_float4_nan(void)
111
+ {
112
+ #ifdef NAN
113
+ /* C99 standard way */
114
+ return (float4) NAN;
115
+ #else
116
+ /* Assume we can get a NAN via zero divide */
117
+ return (float4) (0.0 / 0.0);
118
+ #endif
119
+ }
120
+
121
+ static inline float8
122
+ get_float8_nan(void)
123
+ {
124
+ /* (float8) NAN doesn't work on some NetBSD/MIPS releases */
125
+ #if defined(NAN) && !(defined(__NetBSD__) && defined(__mips__))
126
+ /* C99 standard way */
127
+ return (float8) NAN;
128
+ #else
129
+ /* Assume we can get a NaN via zero divide */
130
+ return (float8) (0.0 / 0.0);
131
+ #endif
132
+ }
133
+
134
+ /*
135
+ * Floating-point arithmetic with overflow/underflow reported as errors
136
+ *
137
+ * There isn't any way to check for underflow of addition/subtraction
138
+ * because numbers near the underflow value have already been rounded to
139
+ * the point where we can't detect that the two values were originally
140
+ * different, e.g. on x86, '1e-45'::float4 == '2e-45'::float4 ==
141
+ * 1.4013e-45.
142
+ */
143
+
144
+ static inline float4
145
+ float4_pl(const float4 val1, const float4 val2)
146
+ {
147
+ float4 result;
148
+
149
+ result = val1 + val2;
150
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
151
+ float_overflow_error();
152
+
153
+ return result;
154
+ }
155
+
156
+ static inline float8
157
+ float8_pl(const float8 val1, const float8 val2)
158
+ {
159
+ float8 result;
160
+
161
+ result = val1 + val2;
162
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
163
+ float_overflow_error();
164
+
165
+ return result;
166
+ }
167
+
168
+ static inline float4
169
+ float4_mi(const float4 val1, const float4 val2)
170
+ {
171
+ float4 result;
172
+
173
+ result = val1 - val2;
174
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
175
+ float_overflow_error();
176
+
177
+ return result;
178
+ }
179
+
180
+ static inline float8
181
+ float8_mi(const float8 val1, const float8 val2)
182
+ {
183
+ float8 result;
184
+
185
+ result = val1 - val2;
186
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
187
+ float_overflow_error();
188
+
189
+ return result;
190
+ }
191
+
192
+ static inline float4
193
+ float4_mul(const float4 val1, const float4 val2)
194
+ {
195
+ float4 result;
196
+
197
+ result = val1 * val2;
198
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
199
+ float_overflow_error();
200
+ if (unlikely(result == 0.0f) && val1 != 0.0f && val2 != 0.0f)
201
+ float_underflow_error();
202
+
203
+ return result;
204
+ }
205
+
206
+ static inline float8
207
+ float8_mul(const float8 val1, const float8 val2)
208
+ {
209
+ float8 result;
210
+
211
+ result = val1 * val2;
212
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
213
+ float_overflow_error();
214
+ if (unlikely(result == 0.0) && val1 != 0.0 && val2 != 0.0)
215
+ float_underflow_error();
216
+
217
+ return result;
218
+ }
219
+
220
+ static inline float4
221
+ float4_div(const float4 val1, const float4 val2)
222
+ {
223
+ float4 result;
224
+
225
+ if (unlikely(val2 == 0.0f))
226
+ float_zero_divide_error();
227
+ result = val1 / val2;
228
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
229
+ float_overflow_error();
230
+ if (unlikely(result == 0.0f) && val1 != 0.0f)
231
+ float_underflow_error();
232
+
233
+ return result;
234
+ }
235
+
236
+ static inline float8
237
+ float8_div(const float8 val1, const float8 val2)
238
+ {
239
+ float8 result;
240
+
241
+ if (unlikely(val2 == 0.0))
242
+ float_zero_divide_error();
243
+ result = val1 / val2;
244
+ if (unlikely(isinf(result)) && !isinf(val1) && !isinf(val2))
245
+ float_overflow_error();
246
+ if (unlikely(result == 0.0) && val1 != 0.0)
247
+ float_underflow_error();
248
+
249
+ return result;
250
+ }
251
+
252
+ /*
253
+ * Routines for NaN-aware comparisons
254
+ *
255
+ * We consider all NaNs to be equal and larger than any non-NaN. This is
256
+ * somewhat arbitrary; the important thing is to have a consistent sort
257
+ * order.
258
+ */
259
+
260
+ static inline bool
261
+ float4_eq(const float4 val1, const float4 val2)
262
+ {
263
+ return isnan(val1) ? isnan(val2) : !isnan(val2) && val1 == val2;
264
+ }
265
+
266
+ static inline bool
267
+ float8_eq(const float8 val1, const float8 val2)
268
+ {
269
+ return isnan(val1) ? isnan(val2) : !isnan(val2) && val1 == val2;
270
+ }
271
+
272
+ static inline bool
273
+ float4_ne(const float4 val1, const float4 val2)
274
+ {
275
+ return isnan(val1) ? !isnan(val2) : isnan(val2) || val1 != val2;
276
+ }
277
+
278
+ static inline bool
279
+ float8_ne(const float8 val1, const float8 val2)
280
+ {
281
+ return isnan(val1) ? !isnan(val2) : isnan(val2) || val1 != val2;
282
+ }
283
+
284
+ static inline bool
285
+ float4_lt(const float4 val1, const float4 val2)
286
+ {
287
+ return !isnan(val1) && (isnan(val2) || val1 < val2);
288
+ }
289
+
290
+ static inline bool
291
+ float8_lt(const float8 val1, const float8 val2)
292
+ {
293
+ return !isnan(val1) && (isnan(val2) || val1 < val2);
294
+ }
295
+
296
+ static inline bool
297
+ float4_le(const float4 val1, const float4 val2)
298
+ {
299
+ return isnan(val2) || (!isnan(val1) && val1 <= val2);
300
+ }
301
+
302
+ static inline bool
303
+ float8_le(const float8 val1, const float8 val2)
304
+ {
305
+ return isnan(val2) || (!isnan(val1) && val1 <= val2);
306
+ }
307
+
308
+ static inline bool
309
+ float4_gt(const float4 val1, const float4 val2)
310
+ {
311
+ return !isnan(val2) && (isnan(val1) || val1 > val2);
312
+ }
313
+
314
+ static inline bool
315
+ float8_gt(const float8 val1, const float8 val2)
316
+ {
317
+ return !isnan(val2) && (isnan(val1) || val1 > val2);
318
+ }
319
+
320
+ static inline bool
321
+ float4_ge(const float4 val1, const float4 val2)
322
+ {
323
+ return isnan(val1) || (!isnan(val2) && val1 >= val2);
324
+ }
325
+
326
+ static inline bool
327
+ float8_ge(const float8 val1, const float8 val2)
328
+ {
329
+ return isnan(val1) || (!isnan(val2) && val1 >= val2);
330
+ }
331
+
332
+ static inline float4
333
+ float4_min(const float4 val1, const float4 val2)
334
+ {
335
+ return float4_lt(val1, val2) ? val1 : val2;
336
+ }
337
+
338
+ static inline float8
339
+ float8_min(const float8 val1, const float8 val2)
340
+ {
341
+ return float8_lt(val1, val2) ? val1 : val2;
342
+ }
343
+
344
+ static inline float4
345
+ float4_max(const float4 val1, const float4 val2)
346
+ {
347
+ return float4_gt(val1, val2) ? val1 : val2;
348
+ }
349
+
350
+ static inline float8
351
+ float8_max(const float8 val1, const float8 val2)
352
+ {
353
+ return float8_gt(val1, val2) ? val1 : val2;
354
+ }
355
+
356
+ #endif /* FLOAT_H */