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,161 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * pg_bswap.h
4
+ * Byte swapping.
5
+ *
6
+ * Macros for reversing the byte order of 16, 32 and 64-bit unsigned integers.
7
+ * For example, 0xAABBCCDD becomes 0xDDCCBBAA. These are just wrappers for
8
+ * built-in functions provided by the compiler where support exists.
9
+ *
10
+ * Note that all of these functions accept unsigned integers as arguments and
11
+ * return the same. Use caution when using these wrapper macros with signed
12
+ * integers.
13
+ *
14
+ * Copyright (c) 2015-2020, PostgreSQL Global Development Group
15
+ *
16
+ * src/include/port/pg_bswap.h
17
+ *
18
+ *-------------------------------------------------------------------------
19
+ */
20
+ #ifndef PG_BSWAP_H
21
+ #define PG_BSWAP_H
22
+
23
+
24
+ /*
25
+ * In all supported versions msvc provides _byteswap_* functions in stdlib.h,
26
+ * already included by c.h.
27
+ */
28
+
29
+
30
+ /* implementation of uint16 pg_bswap16(uint16) */
31
+ #if defined(HAVE__BUILTIN_BSWAP16)
32
+
33
+ #define pg_bswap16(x) __builtin_bswap16(x)
34
+
35
+ #elif defined(_MSC_VER)
36
+
37
+ #define pg_bswap16(x) _byteswap_ushort(x)
38
+
39
+ #else
40
+
41
+ static inline uint16
42
+ pg_bswap16(uint16 x)
43
+ {
44
+ return
45
+ ((x << 8) & 0xff00) |
46
+ ((x >> 8) & 0x00ff);
47
+ }
48
+
49
+ #endif /* HAVE__BUILTIN_BSWAP16 */
50
+
51
+
52
+ /* implementation of uint32 pg_bswap32(uint32) */
53
+ #if defined(HAVE__BUILTIN_BSWAP32)
54
+
55
+ #define pg_bswap32(x) __builtin_bswap32(x)
56
+
57
+ #elif defined(_MSC_VER)
58
+
59
+ #define pg_bswap32(x) _byteswap_ulong(x)
60
+
61
+ #else
62
+
63
+ static inline uint32
64
+ pg_bswap32(uint32 x)
65
+ {
66
+ return
67
+ ((x << 24) & 0xff000000) |
68
+ ((x << 8) & 0x00ff0000) |
69
+ ((x >> 8) & 0x0000ff00) |
70
+ ((x >> 24) & 0x000000ff);
71
+ }
72
+
73
+ #endif /* HAVE__BUILTIN_BSWAP32 */
74
+
75
+
76
+ /* implementation of uint64 pg_bswap64(uint64) */
77
+ #if defined(HAVE__BUILTIN_BSWAP64)
78
+
79
+ #define pg_bswap64(x) __builtin_bswap64(x)
80
+
81
+
82
+ #elif defined(_MSC_VER)
83
+
84
+ #define pg_bswap64(x) _byteswap_uint64(x)
85
+
86
+ #else
87
+
88
+ static inline uint64
89
+ pg_bswap64(uint64 x)
90
+ {
91
+ return
92
+ ((x << 56) & UINT64CONST(0xff00000000000000)) |
93
+ ((x << 40) & UINT64CONST(0x00ff000000000000)) |
94
+ ((x << 24) & UINT64CONST(0x0000ff0000000000)) |
95
+ ((x << 8) & UINT64CONST(0x000000ff00000000)) |
96
+ ((x >> 8) & UINT64CONST(0x00000000ff000000)) |
97
+ ((x >> 24) & UINT64CONST(0x0000000000ff0000)) |
98
+ ((x >> 40) & UINT64CONST(0x000000000000ff00)) |
99
+ ((x >> 56) & UINT64CONST(0x00000000000000ff));
100
+ }
101
+ #endif /* HAVE__BUILTIN_BSWAP64 */
102
+
103
+
104
+ /*
105
+ * Portable and fast equivalents for ntohs, ntohl, htons, htonl,
106
+ * additionally extended to 64 bits.
107
+ */
108
+ #ifdef WORDS_BIGENDIAN
109
+
110
+ #define pg_hton16(x) (x)
111
+ #define pg_hton32(x) (x)
112
+ #define pg_hton64(x) (x)
113
+
114
+ #define pg_ntoh16(x) (x)
115
+ #define pg_ntoh32(x) (x)
116
+ #define pg_ntoh64(x) (x)
117
+
118
+ #else
119
+
120
+ #define pg_hton16(x) pg_bswap16(x)
121
+ #define pg_hton32(x) pg_bswap32(x)
122
+ #define pg_hton64(x) pg_bswap64(x)
123
+
124
+ #define pg_ntoh16(x) pg_bswap16(x)
125
+ #define pg_ntoh32(x) pg_bswap32(x)
126
+ #define pg_ntoh64(x) pg_bswap64(x)
127
+
128
+ #endif /* WORDS_BIGENDIAN */
129
+
130
+
131
+ /*
132
+ * Rearrange the bytes of a Datum from big-endian order into the native byte
133
+ * order. On big-endian machines, this does nothing at all. Note that the C
134
+ * type Datum is an unsigned integer type on all platforms.
135
+ *
136
+ * One possible application of the DatumBigEndianToNative() macro is to make
137
+ * bitwise comparisons cheaper. A simple 3-way comparison of Datums
138
+ * transformed by the macro (based on native, unsigned comparisons) will return
139
+ * the same result as a memcmp() of the corresponding original Datums, but can
140
+ * be much cheaper. It's generally safe to do this on big-endian systems
141
+ * without any special transformation occurring first.
142
+ *
143
+ * If SIZEOF_DATUM is not defined, then postgres.h wasn't included and these
144
+ * macros probably shouldn't be used, so we define nothing. Note that
145
+ * SIZEOF_DATUM == 8 would evaluate as 0 == 8 in that case, potentially
146
+ * leading to the wrong implementation being selected and confusing errors, so
147
+ * defining nothing is safest.
148
+ */
149
+ #ifdef SIZEOF_DATUM
150
+ #ifdef WORDS_BIGENDIAN
151
+ #define DatumBigEndianToNative(x) (x)
152
+ #else /* !WORDS_BIGENDIAN */
153
+ #if SIZEOF_DATUM == 8
154
+ #define DatumBigEndianToNative(x) pg_bswap64(x)
155
+ #else /* SIZEOF_DATUM != 8 */
156
+ #define DatumBigEndianToNative(x) pg_bswap32(x)
157
+ #endif /* SIZEOF_DATUM == 8 */
158
+ #endif /* WORDS_BIGENDIAN */
159
+ #endif /* SIZEOF_DATUM */
160
+
161
+ #endif /* PG_BSWAP_H */
@@ -0,0 +1,101 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * pg_crc32c.h
4
+ * Routines for computing CRC-32C checksums.
5
+ *
6
+ * The speed of CRC-32C calculation has a big impact on performance, so we
7
+ * jump through some hoops to get the best implementation for each
8
+ * platform. Some CPU architectures have special instructions for speeding
9
+ * up CRC calculations (e.g. Intel SSE 4.2), on other platforms we use the
10
+ * Slicing-by-8 algorithm which uses lookup tables.
11
+ *
12
+ * The public interface consists of four macros:
13
+ *
14
+ * INIT_CRC32C(crc)
15
+ * Initialize a CRC accumulator
16
+ *
17
+ * COMP_CRC32C(crc, data, len)
18
+ * Accumulate some (more) bytes into a CRC
19
+ *
20
+ * FIN_CRC32C(crc)
21
+ * Finish a CRC calculation
22
+ *
23
+ * EQ_CRC32C(c1, c2)
24
+ * Check for equality of two CRCs.
25
+ *
26
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
27
+ * Portions Copyright (c) 1994, Regents of the University of California
28
+ *
29
+ * src/include/port/pg_crc32c.h
30
+ *
31
+ *-------------------------------------------------------------------------
32
+ */
33
+ #ifndef PG_CRC32C_H
34
+ #define PG_CRC32C_H
35
+
36
+ #include "port/pg_bswap.h"
37
+
38
+ typedef uint32 pg_crc32c;
39
+
40
+ /* The INIT and EQ macros are the same for all implementations. */
41
+ #define INIT_CRC32C(crc) ((crc) = 0xFFFFFFFF)
42
+ #define EQ_CRC32C(c1, c2) ((c1) == (c2))
43
+
44
+ #if defined(USE_SSE42_CRC32C)
45
+ /* Use Intel SSE4.2 instructions. */
46
+ #define COMP_CRC32C(crc, data, len) \
47
+ ((crc) = pg_comp_crc32c_sse42((crc), (data), (len)))
48
+ #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
49
+
50
+ extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);
51
+
52
+ #elif defined(USE_ARMV8_CRC32C)
53
+ /* Use ARMv8 CRC Extension instructions. */
54
+
55
+ #define COMP_CRC32C(crc, data, len) \
56
+ ((crc) = pg_comp_crc32c_armv8((crc), (data), (len)))
57
+ #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
58
+
59
+ extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
60
+
61
+ #elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK) || defined(USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK)
62
+
63
+ /*
64
+ * Use Intel SSE 4.2 or ARMv8 instructions, but perform a runtime check first
65
+ * to check that they are available.
66
+ */
67
+ #define COMP_CRC32C(crc, data, len) \
68
+ ((crc) = pg_comp_crc32c((crc), (data), (len)))
69
+ #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
70
+
71
+ extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);
72
+ extern pg_crc32c (*pg_comp_crc32c) (pg_crc32c crc, const void *data, size_t len);
73
+
74
+ #ifdef USE_SSE42_CRC32C_WITH_RUNTIME_CHECK
75
+ extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);
76
+ #endif
77
+ #ifdef USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK
78
+ extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len);
79
+ #endif
80
+
81
+ #else
82
+ /*
83
+ * Use slicing-by-8 algorithm.
84
+ *
85
+ * On big-endian systems, the intermediate value is kept in reverse byte
86
+ * order, to avoid byte-swapping during the calculation. FIN_CRC32C reverses
87
+ * the bytes to the final order.
88
+ */
89
+ #define COMP_CRC32C(crc, data, len) \
90
+ ((crc) = pg_comp_crc32c_sb8((crc), (data), (len)))
91
+ #ifdef WORDS_BIGENDIAN
92
+ #define FIN_CRC32C(crc) ((crc) = pg_bswap32(crc) ^ 0xFFFFFFFF)
93
+ #else
94
+ #define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)
95
+ #endif
96
+
97
+ extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);
98
+
99
+ #endif
100
+
101
+ #endif /* PG_CRC32C_H */
@@ -0,0 +1,256 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * instr_time.h
4
+ * portable high-precision interval timing
5
+ *
6
+ * This file provides an abstraction layer to hide portability issues in
7
+ * interval timing. On Unix we use clock_gettime() if available, else
8
+ * gettimeofday(). On Windows, gettimeofday() gives a low-precision result
9
+ * so we must use QueryPerformanceCounter() instead. These macros also give
10
+ * some breathing room to use other high-precision-timing APIs.
11
+ *
12
+ * The basic data type is instr_time, which all callers should treat as an
13
+ * opaque typedef. instr_time can store either an absolute time (of
14
+ * unspecified reference time) or an interval. The operations provided
15
+ * for it are:
16
+ *
17
+ * INSTR_TIME_IS_ZERO(t) is t equal to zero?
18
+ *
19
+ * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too)
20
+ *
21
+ * INSTR_TIME_SET_CURRENT(t) set t to current time
22
+ *
23
+ * INSTR_TIME_SET_CURRENT_LAZY(t) set t to current time if t is zero,
24
+ * evaluates to whether t changed
25
+ *
26
+ * INSTR_TIME_ADD(x, y) x += y
27
+ *
28
+ * INSTR_TIME_SUBTRACT(x, y) x -= y
29
+ *
30
+ * INSTR_TIME_ACCUM_DIFF(x, y, z) x += (y - z)
31
+ *
32
+ * INSTR_TIME_GET_DOUBLE(t) convert t to double (in seconds)
33
+ *
34
+ * INSTR_TIME_GET_MILLISEC(t) convert t to double (in milliseconds)
35
+ *
36
+ * INSTR_TIME_GET_MICROSEC(t) convert t to uint64 (in microseconds)
37
+ *
38
+ * Note that INSTR_TIME_SUBTRACT and INSTR_TIME_ACCUM_DIFF convert
39
+ * absolute times to intervals. The INSTR_TIME_GET_xxx operations are
40
+ * only useful on intervals.
41
+ *
42
+ * When summing multiple measurements, it's recommended to leave the
43
+ * running sum in instr_time form (ie, use INSTR_TIME_ADD or
44
+ * INSTR_TIME_ACCUM_DIFF) and convert to a result format only at the end.
45
+ *
46
+ * Beware of multiple evaluations of the macro arguments.
47
+ *
48
+ *
49
+ * Copyright (c) 2001-2020, PostgreSQL Global Development Group
50
+ *
51
+ * src/include/portability/instr_time.h
52
+ *
53
+ *-------------------------------------------------------------------------
54
+ */
55
+ #ifndef INSTR_TIME_H
56
+ #define INSTR_TIME_H
57
+
58
+ #ifndef WIN32
59
+
60
+ #ifdef HAVE_CLOCK_GETTIME
61
+
62
+ /* Use clock_gettime() */
63
+
64
+ #include <time.h>
65
+
66
+ /*
67
+ * The best clockid to use according to the POSIX spec is CLOCK_MONOTONIC,
68
+ * since that will give reliable interval timing even in the face of changes
69
+ * to the system clock. However, POSIX doesn't require implementations to
70
+ * provide anything except CLOCK_REALTIME, so fall back to that if we don't
71
+ * find CLOCK_MONOTONIC.
72
+ *
73
+ * Also, some implementations have nonstandard clockids with better properties
74
+ * than CLOCK_MONOTONIC. In particular, as of macOS 10.12, Apple provides
75
+ * CLOCK_MONOTONIC_RAW which is both faster to read and higher resolution than
76
+ * their version of CLOCK_MONOTONIC.
77
+ */
78
+ #if defined(__darwin__) && defined(CLOCK_MONOTONIC_RAW)
79
+ #define PG_INSTR_CLOCK CLOCK_MONOTONIC_RAW
80
+ #elif defined(CLOCK_MONOTONIC)
81
+ #define PG_INSTR_CLOCK CLOCK_MONOTONIC
82
+ #else
83
+ #define PG_INSTR_CLOCK CLOCK_REALTIME
84
+ #endif
85
+
86
+ typedef struct timespec instr_time;
87
+
88
+ #define INSTR_TIME_IS_ZERO(t) ((t).tv_nsec == 0 && (t).tv_sec == 0)
89
+
90
+ #define INSTR_TIME_SET_ZERO(t) ((t).tv_sec = 0, (t).tv_nsec = 0)
91
+
92
+ #define INSTR_TIME_SET_CURRENT(t) ((void) clock_gettime(PG_INSTR_CLOCK, &(t)))
93
+
94
+ #define INSTR_TIME_ADD(x,y) \
95
+ do { \
96
+ (x).tv_sec += (y).tv_sec; \
97
+ (x).tv_nsec += (y).tv_nsec; \
98
+ /* Normalize */ \
99
+ while ((x).tv_nsec >= 1000000000) \
100
+ { \
101
+ (x).tv_nsec -= 1000000000; \
102
+ (x).tv_sec++; \
103
+ } \
104
+ } while (0)
105
+
106
+ #define INSTR_TIME_SUBTRACT(x,y) \
107
+ do { \
108
+ (x).tv_sec -= (y).tv_sec; \
109
+ (x).tv_nsec -= (y).tv_nsec; \
110
+ /* Normalize */ \
111
+ while ((x).tv_nsec < 0) \
112
+ { \
113
+ (x).tv_nsec += 1000000000; \
114
+ (x).tv_sec--; \
115
+ } \
116
+ } while (0)
117
+
118
+ #define INSTR_TIME_ACCUM_DIFF(x,y,z) \
119
+ do { \
120
+ (x).tv_sec += (y).tv_sec - (z).tv_sec; \
121
+ (x).tv_nsec += (y).tv_nsec - (z).tv_nsec; \
122
+ /* Normalize after each add to avoid overflow/underflow of tv_nsec */ \
123
+ while ((x).tv_nsec < 0) \
124
+ { \
125
+ (x).tv_nsec += 1000000000; \
126
+ (x).tv_sec--; \
127
+ } \
128
+ while ((x).tv_nsec >= 1000000000) \
129
+ { \
130
+ (x).tv_nsec -= 1000000000; \
131
+ (x).tv_sec++; \
132
+ } \
133
+ } while (0)
134
+
135
+ #define INSTR_TIME_GET_DOUBLE(t) \
136
+ (((double) (t).tv_sec) + ((double) (t).tv_nsec) / 1000000000.0)
137
+
138
+ #define INSTR_TIME_GET_MILLISEC(t) \
139
+ (((double) (t).tv_sec * 1000.0) + ((double) (t).tv_nsec) / 1000000.0)
140
+
141
+ #define INSTR_TIME_GET_MICROSEC(t) \
142
+ (((uint64) (t).tv_sec * (uint64) 1000000) + (uint64) ((t).tv_nsec / 1000))
143
+
144
+ #else /* !HAVE_CLOCK_GETTIME */
145
+
146
+ /* Use gettimeofday() */
147
+
148
+ #include <sys/time.h>
149
+
150
+ typedef struct timeval instr_time;
151
+
152
+ #define INSTR_TIME_IS_ZERO(t) ((t).tv_usec == 0 && (t).tv_sec == 0)
153
+
154
+ #define INSTR_TIME_SET_ZERO(t) ((t).tv_sec = 0, (t).tv_usec = 0)
155
+
156
+ #define INSTR_TIME_SET_CURRENT(t) gettimeofday(&(t), NULL)
157
+
158
+ #define INSTR_TIME_ADD(x,y) \
159
+ do { \
160
+ (x).tv_sec += (y).tv_sec; \
161
+ (x).tv_usec += (y).tv_usec; \
162
+ /* Normalize */ \
163
+ while ((x).tv_usec >= 1000000) \
164
+ { \
165
+ (x).tv_usec -= 1000000; \
166
+ (x).tv_sec++; \
167
+ } \
168
+ } while (0)
169
+
170
+ #define INSTR_TIME_SUBTRACT(x,y) \
171
+ do { \
172
+ (x).tv_sec -= (y).tv_sec; \
173
+ (x).tv_usec -= (y).tv_usec; \
174
+ /* Normalize */ \
175
+ while ((x).tv_usec < 0) \
176
+ { \
177
+ (x).tv_usec += 1000000; \
178
+ (x).tv_sec--; \
179
+ } \
180
+ } while (0)
181
+
182
+ #define INSTR_TIME_ACCUM_DIFF(x,y,z) \
183
+ do { \
184
+ (x).tv_sec += (y).tv_sec - (z).tv_sec; \
185
+ (x).tv_usec += (y).tv_usec - (z).tv_usec; \
186
+ /* Normalize after each add to avoid overflow/underflow of tv_usec */ \
187
+ while ((x).tv_usec < 0) \
188
+ { \
189
+ (x).tv_usec += 1000000; \
190
+ (x).tv_sec--; \
191
+ } \
192
+ while ((x).tv_usec >= 1000000) \
193
+ { \
194
+ (x).tv_usec -= 1000000; \
195
+ (x).tv_sec++; \
196
+ } \
197
+ } while (0)
198
+
199
+ #define INSTR_TIME_GET_DOUBLE(t) \
200
+ (((double) (t).tv_sec) + ((double) (t).tv_usec) / 1000000.0)
201
+
202
+ #define INSTR_TIME_GET_MILLISEC(t) \
203
+ (((double) (t).tv_sec * 1000.0) + ((double) (t).tv_usec) / 1000.0)
204
+
205
+ #define INSTR_TIME_GET_MICROSEC(t) \
206
+ (((uint64) (t).tv_sec * (uint64) 1000000) + (uint64) (t).tv_usec)
207
+
208
+ #endif /* HAVE_CLOCK_GETTIME */
209
+
210
+ #else /* WIN32 */
211
+
212
+ /* Use QueryPerformanceCounter() */
213
+
214
+ typedef LARGE_INTEGER instr_time;
215
+
216
+ #define INSTR_TIME_IS_ZERO(t) ((t).QuadPart == 0)
217
+
218
+ #define INSTR_TIME_SET_ZERO(t) ((t).QuadPart = 0)
219
+
220
+ #define INSTR_TIME_SET_CURRENT(t) QueryPerformanceCounter(&(t))
221
+
222
+ #define INSTR_TIME_ADD(x,y) \
223
+ ((x).QuadPart += (y).QuadPart)
224
+
225
+ #define INSTR_TIME_SUBTRACT(x,y) \
226
+ ((x).QuadPart -= (y).QuadPart)
227
+
228
+ #define INSTR_TIME_ACCUM_DIFF(x,y,z) \
229
+ ((x).QuadPart += (y).QuadPart - (z).QuadPart)
230
+
231
+ #define INSTR_TIME_GET_DOUBLE(t) \
232
+ (((double) (t).QuadPart) / GetTimerFrequency())
233
+
234
+ #define INSTR_TIME_GET_MILLISEC(t) \
235
+ (((double) (t).QuadPart * 1000.0) / GetTimerFrequency())
236
+
237
+ #define INSTR_TIME_GET_MICROSEC(t) \
238
+ ((uint64) (((double) (t).QuadPart * 1000000.0) / GetTimerFrequency()))
239
+
240
+ static inline double
241
+ GetTimerFrequency(void)
242
+ {
243
+ LARGE_INTEGER f;
244
+
245
+ QueryPerformanceFrequency(&f);
246
+ return (double) f.QuadPart;
247
+ }
248
+
249
+ #endif /* WIN32 */
250
+
251
+ /* same macro on all platforms */
252
+
253
+ #define INSTR_TIME_SET_CURRENT_LAZY(t) \
254
+ (INSTR_TIME_IS_ZERO(t) ? INSTR_TIME_SET_CURRENT(t), true : false)
255
+
256
+ #endif /* INSTR_TIME_H */