pg_query 1.3.0 → 2.1.0

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 +237 -117
  3. data/README.md +84 -65
  4. data/Rakefile +71 -5
  5. data/ext/pg_query/extconf.rb +4 -38
  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 +1334 -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 +620 -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 +2523 -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 +257 -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 +357 -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 +2438 -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 +2879 -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 +1110 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1110 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10851 -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 +459 -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 +198 -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 +37643 -0
  380. data/ext/pg_query/pg_query_deparse.c +9965 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +367 -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 +491 -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 +3667 -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 +1042 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_hashfn.c +420 -0
  434. data/ext/pg_query/src_common_keywords.c +39 -0
  435. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  436. data/ext/pg_query/src_common_kwlookup.c +91 -0
  437. data/ext/pg_query/src_common_psprintf.c +158 -0
  438. data/ext/pg_query/src_common_string.c +86 -0
  439. data/ext/pg_query/src_common_stringinfo.c +336 -0
  440. data/ext/pg_query/src_common_wchar.c +1651 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  447. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  448. data/ext/pg_query/src_port_erand48.c +127 -0
  449. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  450. data/ext/pg_query/src_port_pgsleep.c +69 -0
  451. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  452. data/ext/pg_query/src_port_qsort.c +240 -0
  453. data/ext/pg_query/src_port_random.c +31 -0
  454. data/ext/pg_query/src_port_snprintf.c +1449 -0
  455. data/ext/pg_query/src_port_strerror.c +324 -0
  456. data/ext/pg_query/src_port_strnlen.c +39 -0
  457. data/ext/pg_query/xxhash.c +43 -0
  458. data/lib/pg_query.rb +6 -4
  459. data/lib/pg_query/constants.rb +21 -0
  460. data/lib/pg_query/deparse.rb +15 -1673
  461. data/lib/pg_query/filter_columns.rb +88 -85
  462. data/lib/pg_query/fingerprint.rb +120 -87
  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 +274 -202
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3213 -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 -297
@@ -0,0 +1,227 @@
1
+ /*
2
+ * xlogrecord.h
3
+ *
4
+ * Definitions for the WAL record format.
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/access/xlogrecord.h
10
+ */
11
+ #ifndef XLOGRECORD_H
12
+ #define XLOGRECORD_H
13
+
14
+ #include "access/rmgr.h"
15
+ #include "access/xlogdefs.h"
16
+ #include "port/pg_crc32c.h"
17
+ #include "storage/block.h"
18
+ #include "storage/relfilenode.h"
19
+
20
+ /*
21
+ * The overall layout of an XLOG record is:
22
+ * Fixed-size header (XLogRecord struct)
23
+ * XLogRecordBlockHeader struct
24
+ * XLogRecordBlockHeader struct
25
+ * ...
26
+ * XLogRecordDataHeader[Short|Long] struct
27
+ * block data
28
+ * block data
29
+ * ...
30
+ * main data
31
+ *
32
+ * There can be zero or more XLogRecordBlockHeaders, and 0 or more bytes of
33
+ * rmgr-specific data not associated with a block. XLogRecord structs
34
+ * always start on MAXALIGN boundaries in the WAL files, but the rest of
35
+ * the fields are not aligned.
36
+ *
37
+ * The XLogRecordBlockHeader, XLogRecordDataHeaderShort and
38
+ * XLogRecordDataHeaderLong structs all begin with a single 'id' byte. It's
39
+ * used to distinguish between block references, and the main data structs.
40
+ */
41
+ typedef struct XLogRecord
42
+ {
43
+ uint32 xl_tot_len; /* total len of entire record */
44
+ TransactionId xl_xid; /* xact id */
45
+ XLogRecPtr xl_prev; /* ptr to previous record in log */
46
+ uint8 xl_info; /* flag bits, see below */
47
+ RmgrId xl_rmid; /* resource manager for this record */
48
+ /* 2 bytes of padding here, initialize to zero */
49
+ pg_crc32c xl_crc; /* CRC for this record */
50
+
51
+ /* XLogRecordBlockHeaders and XLogRecordDataHeader follow, no padding */
52
+
53
+ } XLogRecord;
54
+
55
+ #define SizeOfXLogRecord (offsetof(XLogRecord, xl_crc) + sizeof(pg_crc32c))
56
+
57
+ /*
58
+ * The high 4 bits in xl_info may be used freely by rmgr. The
59
+ * XLR_SPECIAL_REL_UPDATE and XLR_CHECK_CONSISTENCY bits can be passed by
60
+ * XLogInsert caller. The rest are set internally by XLogInsert.
61
+ */
62
+ #define XLR_INFO_MASK 0x0F
63
+ #define XLR_RMGR_INFO_MASK 0xF0
64
+
65
+ /*
66
+ * If a WAL record modifies any relation files, in ways not covered by the
67
+ * usual block references, this flag is set. This is not used for anything
68
+ * by PostgreSQL itself, but it allows external tools that read WAL and keep
69
+ * track of modified blocks to recognize such special record types.
70
+ */
71
+ #define XLR_SPECIAL_REL_UPDATE 0x01
72
+
73
+ /*
74
+ * Enforces consistency checks of replayed WAL at recovery. If enabled,
75
+ * each record will log a full-page write for each block modified by the
76
+ * record and will reuse it afterwards for consistency checks. The caller
77
+ * of XLogInsert can use this value if necessary, but if
78
+ * wal_consistency_checking is enabled for a rmgr this is set unconditionally.
79
+ */
80
+ #define XLR_CHECK_CONSISTENCY 0x02
81
+
82
+ /*
83
+ * Header info for block data appended to an XLOG record.
84
+ *
85
+ * 'data_length' is the length of the rmgr-specific payload data associated
86
+ * with this block. It does not include the possible full page image, nor
87
+ * XLogRecordBlockHeader struct itself.
88
+ *
89
+ * Note that we don't attempt to align the XLogRecordBlockHeader struct!
90
+ * So, the struct must be copied to aligned local storage before use.
91
+ */
92
+ typedef struct XLogRecordBlockHeader
93
+ {
94
+ uint8 id; /* block reference ID */
95
+ uint8 fork_flags; /* fork within the relation, and flags */
96
+ uint16 data_length; /* number of payload bytes (not including page
97
+ * image) */
98
+
99
+ /* If BKPBLOCK_HAS_IMAGE, an XLogRecordBlockImageHeader struct follows */
100
+ /* If BKPBLOCK_SAME_REL is not set, a RelFileNode follows */
101
+ /* BlockNumber follows */
102
+ } XLogRecordBlockHeader;
103
+
104
+ #define SizeOfXLogRecordBlockHeader (offsetof(XLogRecordBlockHeader, data_length) + sizeof(uint16))
105
+
106
+ /*
107
+ * Additional header information when a full-page image is included
108
+ * (i.e. when BKPBLOCK_HAS_IMAGE is set).
109
+ *
110
+ * The XLOG code is aware that PG data pages usually contain an unused "hole"
111
+ * in the middle, which contains only zero bytes. Since we know that the
112
+ * "hole" is all zeros, we remove it from the stored data (and it's not counted
113
+ * in the XLOG record's CRC, either). Hence, the amount of block data actually
114
+ * present is (BLCKSZ - <length of "hole" bytes>).
115
+ *
116
+ * Additionally, when wal_compression is enabled, we will try to compress full
117
+ * page images using the PGLZ compression algorithm, after removing the "hole".
118
+ * This can reduce the WAL volume, but at some extra cost of CPU spent
119
+ * on the compression during WAL logging. In this case, since the "hole"
120
+ * length cannot be calculated by subtracting the number of page image bytes
121
+ * from BLCKSZ, basically it needs to be stored as an extra information.
122
+ * But when no "hole" exists, we can assume that the "hole" length is zero
123
+ * and no such an extra information needs to be stored. Note that
124
+ * the original version of page image is stored in WAL instead of the
125
+ * compressed one if the number of bytes saved by compression is less than
126
+ * the length of extra information. Hence, when a page image is successfully
127
+ * compressed, the amount of block data actually present is less than
128
+ * BLCKSZ - the length of "hole" bytes - the length of extra information.
129
+ */
130
+ typedef struct XLogRecordBlockImageHeader
131
+ {
132
+ uint16 length; /* number of page image bytes */
133
+ uint16 hole_offset; /* number of bytes before "hole" */
134
+ uint8 bimg_info; /* flag bits, see below */
135
+
136
+ /*
137
+ * If BKPIMAGE_HAS_HOLE and BKPIMAGE_IS_COMPRESSED, an
138
+ * XLogRecordBlockCompressHeader struct follows.
139
+ */
140
+ } XLogRecordBlockImageHeader;
141
+
142
+ #define SizeOfXLogRecordBlockImageHeader \
143
+ (offsetof(XLogRecordBlockImageHeader, bimg_info) + sizeof(uint8))
144
+
145
+ /* Information stored in bimg_info */
146
+ #define BKPIMAGE_HAS_HOLE 0x01 /* page image has "hole" */
147
+ #define BKPIMAGE_IS_COMPRESSED 0x02 /* page image is compressed */
148
+ #define BKPIMAGE_APPLY 0x04 /* page image should be restored during
149
+ * replay */
150
+
151
+ /*
152
+ * Extra header information used when page image has "hole" and
153
+ * is compressed.
154
+ */
155
+ typedef struct XLogRecordBlockCompressHeader
156
+ {
157
+ uint16 hole_length; /* number of bytes in "hole" */
158
+ } XLogRecordBlockCompressHeader;
159
+
160
+ #define SizeOfXLogRecordBlockCompressHeader \
161
+ sizeof(XLogRecordBlockCompressHeader)
162
+
163
+ /*
164
+ * Maximum size of the header for a block reference. This is used to size a
165
+ * temporary buffer for constructing the header.
166
+ */
167
+ #define MaxSizeOfXLogRecordBlockHeader \
168
+ (SizeOfXLogRecordBlockHeader + \
169
+ SizeOfXLogRecordBlockImageHeader + \
170
+ SizeOfXLogRecordBlockCompressHeader + \
171
+ sizeof(RelFileNode) + \
172
+ sizeof(BlockNumber))
173
+
174
+ /*
175
+ * The fork number fits in the lower 4 bits in the fork_flags field. The upper
176
+ * bits are used for flags.
177
+ */
178
+ #define BKPBLOCK_FORK_MASK 0x0F
179
+ #define BKPBLOCK_FLAG_MASK 0xF0
180
+ #define BKPBLOCK_HAS_IMAGE 0x10 /* block data is an XLogRecordBlockImage */
181
+ #define BKPBLOCK_HAS_DATA 0x20
182
+ #define BKPBLOCK_WILL_INIT 0x40 /* redo will re-init the page */
183
+ #define BKPBLOCK_SAME_REL 0x80 /* RelFileNode omitted, same as previous */
184
+
185
+ /*
186
+ * XLogRecordDataHeaderShort/Long are used for the "main data" portion of
187
+ * the record. If the length of the data is less than 256 bytes, the short
188
+ * form is used, with a single byte to hold the length. Otherwise the long
189
+ * form is used.
190
+ *
191
+ * (These structs are currently not used in the code, they are here just for
192
+ * documentation purposes).
193
+ */
194
+ typedef struct XLogRecordDataHeaderShort
195
+ {
196
+ uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */
197
+ uint8 data_length; /* number of payload bytes */
198
+ } XLogRecordDataHeaderShort;
199
+
200
+ #define SizeOfXLogRecordDataHeaderShort (sizeof(uint8) * 2)
201
+
202
+ typedef struct XLogRecordDataHeaderLong
203
+ {
204
+ uint8 id; /* XLR_BLOCK_ID_DATA_LONG */
205
+ /* followed by uint32 data_length, unaligned */
206
+ } XLogRecordDataHeaderLong;
207
+
208
+ #define SizeOfXLogRecordDataHeaderLong (sizeof(uint8) + sizeof(uint32))
209
+
210
+ /*
211
+ * Block IDs used to distinguish different kinds of record fragments. Block
212
+ * references are numbered from 0 to XLR_MAX_BLOCK_ID. A rmgr is free to use
213
+ * any ID number in that range (although you should stick to small numbers,
214
+ * because the WAL machinery is optimized for that case). A couple of ID
215
+ * numbers are reserved to denote the "main" data portion of the record.
216
+ *
217
+ * The maximum is currently set at 32, quite arbitrarily. Most records only
218
+ * need a handful of block references, but there are a few exceptions that
219
+ * need more.
220
+ */
221
+ #define XLR_MAX_BLOCK_ID 32
222
+
223
+ #define XLR_BLOCK_ID_DATA_SHORT 255
224
+ #define XLR_BLOCK_ID_DATA_LONG 254
225
+ #define XLR_BLOCK_ID_ORIGIN 253
226
+
227
+ #endif /* XLOGRECORD_H */
@@ -0,0 +1,62 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * bootstrap.h
4
+ * include file for the bootstrapping code
5
+ *
6
+ *
7
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
8
+ * Portions Copyright (c) 1994, Regents of the University of California
9
+ *
10
+ * src/include/bootstrap/bootstrap.h
11
+ *
12
+ *-------------------------------------------------------------------------
13
+ */
14
+ #ifndef BOOTSTRAP_H
15
+ #define BOOTSTRAP_H
16
+
17
+ #include "nodes/execnodes.h"
18
+
19
+
20
+ /*
21
+ * MAXATTR is the maximum number of attributes in a relation supported
22
+ * at bootstrap time (i.e., the max possible in a system table).
23
+ */
24
+ #define MAXATTR 40
25
+
26
+ #define BOOTCOL_NULL_AUTO 1
27
+ #define BOOTCOL_NULL_FORCE_NULL 2
28
+ #define BOOTCOL_NULL_FORCE_NOT_NULL 3
29
+
30
+ extern Relation boot_reldesc;
31
+ extern Form_pg_attribute attrtypes[MAXATTR];
32
+ extern int numattr;
33
+
34
+
35
+ extern void AuxiliaryProcessMain(int argc, char *argv[]) pg_attribute_noreturn();
36
+
37
+ extern void closerel(char *name);
38
+ extern void boot_openrel(char *name);
39
+
40
+ extern void DefineAttr(char *name, char *type, int attnum, int nullness);
41
+ extern void InsertOneTuple(void);
42
+ extern void InsertOneValue(char *value, int i);
43
+ extern void InsertOneNull(int i);
44
+
45
+ extern void index_register(Oid heap, Oid ind, IndexInfo *indexInfo);
46
+ extern void build_indices(void);
47
+
48
+ extern void boot_get_type_io_data(Oid typid,
49
+ int16 *typlen,
50
+ bool *typbyval,
51
+ char *typalign,
52
+ char *typdelim,
53
+ Oid *typioparam,
54
+ Oid *typinput,
55
+ Oid *typoutput);
56
+
57
+ extern int boot_yyparse(void);
58
+
59
+ extern int boot_yylex(void);
60
+ extern void boot_yyerror(const char *str) pg_attribute_noreturn();
61
+
62
+ #endif /* BOOTSTRAP_H */
@@ -0,0 +1,1334 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * c.h
4
+ * Fundamental C definitions. This is included by every .c file in
5
+ * PostgreSQL (via either postgres.h or postgres_fe.h, as appropriate).
6
+ *
7
+ * Note that the definitions here are not intended to be exposed to clients
8
+ * of the frontend interface libraries --- so we don't worry much about
9
+ * polluting the namespace with lots of stuff...
10
+ *
11
+ *
12
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1994, Regents of the University of California
14
+ *
15
+ * src/include/c.h
16
+ *
17
+ *-------------------------------------------------------------------------
18
+ */
19
+ /*
20
+ *----------------------------------------------------------------
21
+ * TABLE OF CONTENTS
22
+ *
23
+ * When adding stuff to this file, please try to put stuff
24
+ * into the relevant section, or add new sections as appropriate.
25
+ *
26
+ * section description
27
+ * ------- ------------------------------------------------
28
+ * 0) pg_config.h and standard system headers
29
+ * 1) compiler characteristics
30
+ * 2) bool, true, false
31
+ * 3) standard system types
32
+ * 4) IsValid macros for system types
33
+ * 5) offsetof, lengthof, alignment
34
+ * 6) assertions
35
+ * 7) widely useful macros
36
+ * 8) random stuff
37
+ * 9) system-specific hacks
38
+ *
39
+ * NOTE: since this file is included by both frontend and backend modules,
40
+ * it's usually wrong to put an "extern" declaration here, unless it's
41
+ * ifdef'd so that it's seen in only one case or the other.
42
+ * typedefs and macros are the kind of thing that might go here.
43
+ *
44
+ *----------------------------------------------------------------
45
+ */
46
+ #ifndef C_H
47
+ #define C_H
48
+
49
+ #include "postgres_ext.h"
50
+
51
+ /* Must undef pg_config_ext.h symbols before including pg_config.h */
52
+ #undef PG_INT64_TYPE
53
+
54
+ #include "pg_config.h"
55
+ #include "pg_config_manual.h" /* must be after pg_config.h */
56
+ #include "pg_config_os.h" /* must be before any system header files */
57
+
58
+ /* System header files that should be available everywhere in Postgres */
59
+ #include <stdio.h>
60
+ #include <stdlib.h>
61
+ #include <string.h>
62
+ #include <stddef.h>
63
+ #include <stdarg.h>
64
+ #ifdef HAVE_STRINGS_H
65
+ #include <strings.h>
66
+ #endif
67
+ #include <stdint.h>
68
+ #include <sys/types.h>
69
+ #include <errno.h>
70
+ #if defined(WIN32) || defined(__CYGWIN__)
71
+ #include <fcntl.h> /* ensure O_BINARY is available */
72
+ #endif
73
+ #include <locale.h>
74
+ #ifdef ENABLE_NLS
75
+ #include <libintl.h>
76
+ #endif
77
+
78
+
79
+ /* ----------------------------------------------------------------
80
+ * Section 1: compiler characteristics
81
+ *
82
+ * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
83
+ * ----------------------------------------------------------------
84
+ */
85
+
86
+ /*
87
+ * Disable "inline" if PG_FORCE_DISABLE_INLINE is defined.
88
+ * This is used to work around compiler bugs and might also be useful for
89
+ * investigatory purposes.
90
+ */
91
+ #ifdef PG_FORCE_DISABLE_INLINE
92
+ #undef inline
93
+ #define inline
94
+ #endif
95
+
96
+ /*
97
+ * Attribute macros
98
+ *
99
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
100
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
101
+ * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
102
+ * XLC: https://www.ibm.com/support/knowledgecenter/SSGH2K_13.1.2/com.ibm.xlc131.aix.doc/language_ref/function_attributes.html
103
+ * XLC: https://www.ibm.com/support/knowledgecenter/SSGH2K_13.1.2/com.ibm.xlc131.aix.doc/language_ref/type_attrib.html
104
+ */
105
+
106
+ /* only GCC supports the unused attribute */
107
+ #ifdef __GNUC__
108
+ #define pg_attribute_unused() __attribute__((unused))
109
+ #else
110
+ #define pg_attribute_unused()
111
+ #endif
112
+
113
+ /*
114
+ * Place this macro before functions that should be allowed to make misaligned
115
+ * accesses. Think twice before using it on non-x86-specific code!
116
+ * Testing can be done with "-fsanitize=alignment -fsanitize-trap=alignment"
117
+ * on clang, or "-fsanitize=alignment -fno-sanitize-recover=alignment" on gcc.
118
+ */
119
+ #if __clang_major__ >= 7 || __GNUC__ >= 8
120
+ #define pg_attribute_no_sanitize_alignment() __attribute__((no_sanitize("alignment")))
121
+ #else
122
+ #define pg_attribute_no_sanitize_alignment()
123
+ #endif
124
+
125
+ /*
126
+ * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
127
+ * used in assert-enabled builds, to avoid compiler warnings about unused
128
+ * variables in assert-disabled builds.
129
+ */
130
+ #ifdef USE_ASSERT_CHECKING
131
+ #define PG_USED_FOR_ASSERTS_ONLY
132
+ #else
133
+ #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
134
+ #endif
135
+
136
+ /* GCC and XLC support format attributes */
137
+ #if defined(__GNUC__) || defined(__IBMC__)
138
+ #define pg_attribute_format_arg(a) __attribute__((format_arg(a)))
139
+ #define pg_attribute_printf(f,a) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
140
+ #else
141
+ #define pg_attribute_format_arg(a)
142
+ #define pg_attribute_printf(f,a)
143
+ #endif
144
+
145
+ /* GCC, Sunpro and XLC support aligned, packed and noreturn */
146
+ #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
147
+ #define pg_attribute_aligned(a) __attribute__((aligned(a)))
148
+ #define pg_attribute_noreturn() __attribute__((noreturn))
149
+ #define pg_attribute_packed() __attribute__((packed))
150
+ #define HAVE_PG_ATTRIBUTE_NORETURN 1
151
+ #else
152
+ /*
153
+ * NB: aligned and packed are not given default definitions because they
154
+ * affect code functionality; they *must* be implemented by the compiler
155
+ * if they are to be used.
156
+ */
157
+ #define pg_attribute_noreturn()
158
+ #endif
159
+
160
+ /*
161
+ * Use "pg_attribute_always_inline" in place of "inline" for functions that
162
+ * we wish to force inlining of, even when the compiler's heuristics would
163
+ * choose not to. But, if possible, don't force inlining in unoptimized
164
+ * debug builds.
165
+ */
166
+ #if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) || defined(__IBMC__)
167
+ /* GCC > 3, Sunpro and XLC support always_inline via __attribute__ */
168
+ #define pg_attribute_always_inline __attribute__((always_inline)) inline
169
+ #elif defined(_MSC_VER)
170
+ /* MSVC has a special keyword for this */
171
+ #define pg_attribute_always_inline __forceinline
172
+ #else
173
+ /* Otherwise, the best we can do is to say "inline" */
174
+ #define pg_attribute_always_inline inline
175
+ #endif
176
+
177
+ /*
178
+ * Forcing a function not to be inlined can be useful if it's the slow path of
179
+ * a performance-critical function, or should be visible in profiles to allow
180
+ * for proper cost attribution. Note that unlike the pg_attribute_XXX macros
181
+ * above, this should be placed before the function's return type and name.
182
+ */
183
+ /* GCC, Sunpro and XLC support noinline via __attribute__ */
184
+ #if (defined(__GNUC__) && __GNUC__ > 2) || defined(__SUNPRO_C) || defined(__IBMC__)
185
+ #define pg_noinline __attribute__((noinline))
186
+ /* msvc via declspec */
187
+ #elif defined(_MSC_VER)
188
+ #define pg_noinline __declspec(noinline)
189
+ #else
190
+ #define pg_noinline
191
+ #endif
192
+
193
+ /*
194
+ * Mark a point as unreachable in a portable fashion. This should preferably
195
+ * be something that the compiler understands, to aid code generation.
196
+ * In assert-enabled builds, we prefer abort() for debugging reasons.
197
+ */
198
+ #if defined(HAVE__BUILTIN_UNREACHABLE) && !defined(USE_ASSERT_CHECKING)
199
+ #define pg_unreachable() __builtin_unreachable()
200
+ #elif defined(_MSC_VER) && !defined(USE_ASSERT_CHECKING)
201
+ #define pg_unreachable() __assume(0)
202
+ #else
203
+ #define pg_unreachable() abort()
204
+ #endif
205
+
206
+ /*
207
+ * Hints to the compiler about the likelihood of a branch. Both likely() and
208
+ * unlikely() return the boolean value of the contained expression.
209
+ *
210
+ * These should only be used sparingly, in very hot code paths. It's very easy
211
+ * to mis-estimate likelihoods.
212
+ */
213
+ #if __GNUC__ >= 3
214
+ #define likely(x) __builtin_expect((x) != 0, 1)
215
+ #define unlikely(x) __builtin_expect((x) != 0, 0)
216
+ #else
217
+ #define likely(x) ((x) != 0)
218
+ #define unlikely(x) ((x) != 0)
219
+ #endif
220
+
221
+ /*
222
+ * CppAsString
223
+ * Convert the argument to a string, using the C preprocessor.
224
+ * CppAsString2
225
+ * Convert the argument to a string, after one round of macro expansion.
226
+ * CppConcat
227
+ * Concatenate two arguments together, using the C preprocessor.
228
+ *
229
+ * Note: There used to be support here for pre-ANSI C compilers that didn't
230
+ * support # and ##. Nowadays, these macros are just for clarity and/or
231
+ * backward compatibility with existing PostgreSQL code.
232
+ */
233
+ #define CppAsString(identifier) #identifier
234
+ #define CppAsString2(x) CppAsString(x)
235
+ #define CppConcat(x, y) x##y
236
+
237
+ /*
238
+ * VA_ARGS_NARGS
239
+ * Returns the number of macro arguments it is passed.
240
+ *
241
+ * An empty argument still counts as an argument, so effectively, this is
242
+ * "one more than the number of commas in the argument list".
243
+ *
244
+ * This works for up to 63 arguments. Internally, VA_ARGS_NARGS_() is passed
245
+ * 64+N arguments, and the C99 standard only requires macros to allow up to
246
+ * 127 arguments, so we can't portably go higher. The implementation is
247
+ * pretty trivial: VA_ARGS_NARGS_() returns its 64th argument, and we set up
248
+ * the call so that that is the appropriate one of the list of constants.
249
+ * This idea is due to Laurent Deniau.
250
+ */
251
+ #define VA_ARGS_NARGS(...) \
252
+ VA_ARGS_NARGS_(__VA_ARGS__, \
253
+ 63,62,61,60, \
254
+ 59,58,57,56,55,54,53,52,51,50, \
255
+ 49,48,47,46,45,44,43,42,41,40, \
256
+ 39,38,37,36,35,34,33,32,31,30, \
257
+ 29,28,27,26,25,24,23,22,21,20, \
258
+ 19,18,17,16,15,14,13,12,11,10, \
259
+ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
260
+ #define VA_ARGS_NARGS_( \
261
+ _01,_02,_03,_04,_05,_06,_07,_08,_09,_10, \
262
+ _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
263
+ _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
264
+ _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
265
+ _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
266
+ _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
267
+ _61,_62,_63, N, ...) \
268
+ (N)
269
+
270
+ /*
271
+ * dummyret is used to set return values in macros that use ?: to make
272
+ * assignments. gcc wants these to be void, other compilers like char
273
+ */
274
+ #ifdef __GNUC__ /* GNU cc */
275
+ #define dummyret void
276
+ #else
277
+ #define dummyret char
278
+ #endif
279
+
280
+ /*
281
+ * We require C99, hence the compiler should understand flexible array
282
+ * members. However, for documentation purposes we still consider it to be
283
+ * project style to write "field[FLEXIBLE_ARRAY_MEMBER]" not just "field[]".
284
+ * When computing the size of such an object, use "offsetof(struct s, f)"
285
+ * for portability. Don't use "offsetof(struct s, f[0])", as this doesn't
286
+ * work with MSVC and with C++ compilers.
287
+ */
288
+ #define FLEXIBLE_ARRAY_MEMBER /* empty */
289
+
290
+ /* Which __func__ symbol do we have, if any? */
291
+ #ifdef HAVE_FUNCNAME__FUNC
292
+ #define PG_FUNCNAME_MACRO __func__
293
+ #else
294
+ #ifdef HAVE_FUNCNAME__FUNCTION
295
+ #define PG_FUNCNAME_MACRO __FUNCTION__
296
+ #else
297
+ #define PG_FUNCNAME_MACRO NULL
298
+ #endif
299
+ #endif
300
+
301
+
302
+ /* ----------------------------------------------------------------
303
+ * Section 2: bool, true, false
304
+ * ----------------------------------------------------------------
305
+ */
306
+
307
+ /*
308
+ * bool
309
+ * Boolean value, either true or false.
310
+ *
311
+ * We use stdbool.h if available and its bool has size 1. That's useful for
312
+ * better compiler and debugger output and for compatibility with third-party
313
+ * libraries. But PostgreSQL currently cannot deal with bool of other sizes;
314
+ * there are static assertions around the code to prevent that.
315
+ *
316
+ * For C++ compilers, we assume the compiler has a compatible built-in
317
+ * definition of bool.
318
+ *
319
+ * See also the version of this code in src/interfaces/ecpg/include/ecpglib.h.
320
+ */
321
+
322
+ #ifndef __cplusplus
323
+
324
+ #ifdef PG_USE_STDBOOL
325
+ #include <stdbool.h>
326
+ #else
327
+
328
+ #ifndef bool
329
+ typedef unsigned char bool;
330
+ #endif
331
+
332
+ #ifndef true
333
+ #define true ((bool) 1)
334
+ #endif
335
+
336
+ #ifndef false
337
+ #define false ((bool) 0)
338
+ #endif
339
+
340
+ #endif /* not PG_USE_STDBOOL */
341
+ #endif /* not C++ */
342
+
343
+
344
+ /* ----------------------------------------------------------------
345
+ * Section 3: standard system types
346
+ * ----------------------------------------------------------------
347
+ */
348
+
349
+ /*
350
+ * Pointer
351
+ * Variable holding address of any memory resident object.
352
+ *
353
+ * XXX Pointer arithmetic is done with this, so it can't be void *
354
+ * under "true" ANSI compilers.
355
+ */
356
+ typedef char *Pointer;
357
+
358
+ /*
359
+ * intN
360
+ * Signed integer, EXACTLY N BITS IN SIZE,
361
+ * used for numerical computations and the
362
+ * frontend/backend protocol.
363
+ */
364
+ #ifndef HAVE_INT8
365
+ typedef signed char int8; /* == 8 bits */
366
+ typedef signed short int16; /* == 16 bits */
367
+ typedef signed int int32; /* == 32 bits */
368
+ #endif /* not HAVE_INT8 */
369
+
370
+ /*
371
+ * uintN
372
+ * Unsigned integer, EXACTLY N BITS IN SIZE,
373
+ * used for numerical computations and the
374
+ * frontend/backend protocol.
375
+ */
376
+ #ifndef HAVE_UINT8
377
+ typedef unsigned char uint8; /* == 8 bits */
378
+ typedef unsigned short uint16; /* == 16 bits */
379
+ typedef unsigned int uint32; /* == 32 bits */
380
+ #endif /* not HAVE_UINT8 */
381
+
382
+ /*
383
+ * bitsN
384
+ * Unit of bitwise operation, AT LEAST N BITS IN SIZE.
385
+ */
386
+ typedef uint8 bits8; /* >= 8 bits */
387
+ typedef uint16 bits16; /* >= 16 bits */
388
+ typedef uint32 bits32; /* >= 32 bits */
389
+
390
+ /*
391
+ * 64-bit integers
392
+ */
393
+ #ifdef HAVE_LONG_INT_64
394
+ /* Plain "long int" fits, use it */
395
+
396
+ #ifndef HAVE_INT64
397
+ typedef long int int64;
398
+ #endif
399
+ #ifndef HAVE_UINT64
400
+ typedef unsigned long int uint64;
401
+ #endif
402
+ #define INT64CONST(x) (x##L)
403
+ #define UINT64CONST(x) (x##UL)
404
+ #elif defined(HAVE_LONG_LONG_INT_64)
405
+ /* We have working support for "long long int", use that */
406
+
407
+ #ifndef HAVE_INT64
408
+ typedef long long int int64;
409
+ #endif
410
+ #ifndef HAVE_UINT64
411
+ typedef unsigned long long int uint64;
412
+ #endif
413
+ #define INT64CONST(x) (x##LL)
414
+ #define UINT64CONST(x) (x##ULL)
415
+ #else
416
+ /* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */
417
+ #error must have a working 64-bit integer datatype
418
+ #endif
419
+
420
+ /* snprintf format strings to use for 64-bit integers */
421
+ #define INT64_FORMAT "%" INT64_MODIFIER "d"
422
+ #define UINT64_FORMAT "%" INT64_MODIFIER "u"
423
+
424
+ /*
425
+ * 128-bit signed and unsigned integers
426
+ * There currently is only limited support for such types.
427
+ * E.g. 128bit literals and snprintf are not supported; but math is.
428
+ * Also, because we exclude such types when choosing MAXIMUM_ALIGNOF,
429
+ * it must be possible to coerce the compiler to allocate them on no
430
+ * more than MAXALIGN boundaries.
431
+ */
432
+ #if defined(PG_INT128_TYPE)
433
+ #if defined(pg_attribute_aligned) || ALIGNOF_PG_INT128_TYPE <= MAXIMUM_ALIGNOF
434
+ #define HAVE_INT128 1
435
+
436
+ typedef PG_INT128_TYPE int128
437
+ #if defined(pg_attribute_aligned)
438
+ pg_attribute_aligned(MAXIMUM_ALIGNOF)
439
+ #endif
440
+ ;
441
+
442
+ typedef unsigned PG_INT128_TYPE uint128
443
+ #if defined(pg_attribute_aligned)
444
+ pg_attribute_aligned(MAXIMUM_ALIGNOF)
445
+ #endif
446
+ ;
447
+
448
+ #endif
449
+ #endif
450
+
451
+ /*
452
+ * stdint.h limits aren't guaranteed to have compatible types with our fixed
453
+ * width types. So just define our own.
454
+ */
455
+ #define PG_INT8_MIN (-0x7F-1)
456
+ #define PG_INT8_MAX (0x7F)
457
+ #define PG_UINT8_MAX (0xFF)
458
+ #define PG_INT16_MIN (-0x7FFF-1)
459
+ #define PG_INT16_MAX (0x7FFF)
460
+ #define PG_UINT16_MAX (0xFFFF)
461
+ #define PG_INT32_MIN (-0x7FFFFFFF-1)
462
+ #define PG_INT32_MAX (0x7FFFFFFF)
463
+ #define PG_UINT32_MAX (0xFFFFFFFFU)
464
+ #define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)
465
+ #define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)
466
+ #define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)
467
+
468
+ /*
469
+ * We now always use int64 timestamps, but keep this symbol defined for the
470
+ * benefit of external code that might test it.
471
+ */
472
+ #define HAVE_INT64_TIMESTAMP
473
+
474
+ /*
475
+ * Size
476
+ * Size of any memory resident object, as returned by sizeof.
477
+ */
478
+ typedef size_t Size;
479
+
480
+ /*
481
+ * Index
482
+ * Index into any memory resident array.
483
+ *
484
+ * Note:
485
+ * Indices are non negative.
486
+ */
487
+ typedef unsigned int Index;
488
+
489
+ /*
490
+ * Offset
491
+ * Offset into any memory resident array.
492
+ *
493
+ * Note:
494
+ * This differs from an Index in that an Index is always
495
+ * non negative, whereas Offset may be negative.
496
+ */
497
+ typedef signed int Offset;
498
+
499
+ /*
500
+ * Common Postgres datatype names (as used in the catalogs)
501
+ */
502
+ typedef float float4;
503
+ typedef double float8;
504
+
505
+ #ifdef USE_FLOAT8_BYVAL
506
+ #define FLOAT8PASSBYVAL true
507
+ #else
508
+ #define FLOAT8PASSBYVAL false
509
+ #endif
510
+
511
+ /*
512
+ * Oid, RegProcedure, TransactionId, SubTransactionId, MultiXactId,
513
+ * CommandId
514
+ */
515
+
516
+ /* typedef Oid is in postgres_ext.h */
517
+
518
+ /*
519
+ * regproc is the type name used in the include/catalog headers, but
520
+ * RegProcedure is the preferred name in C code.
521
+ */
522
+ typedef Oid regproc;
523
+ typedef regproc RegProcedure;
524
+
525
+ typedef uint32 TransactionId;
526
+
527
+ typedef uint32 LocalTransactionId;
528
+
529
+ typedef uint32 SubTransactionId;
530
+
531
+ #define InvalidSubTransactionId ((SubTransactionId) 0)
532
+ #define TopSubTransactionId ((SubTransactionId) 1)
533
+
534
+ /* MultiXactId must be equivalent to TransactionId, to fit in t_xmax */
535
+ typedef TransactionId MultiXactId;
536
+
537
+ typedef uint32 MultiXactOffset;
538
+
539
+ typedef uint32 CommandId;
540
+
541
+ #define FirstCommandId ((CommandId) 0)
542
+ #define InvalidCommandId (~(CommandId)0)
543
+
544
+ /*
545
+ * Array indexing support
546
+ */
547
+ #define MAXDIM 6
548
+ typedef struct
549
+ {
550
+ int indx[MAXDIM];
551
+ } IntArray;
552
+
553
+ /* ----------------
554
+ * Variable-length datatypes all share the 'struct varlena' header.
555
+ *
556
+ * NOTE: for TOASTable types, this is an oversimplification, since the value
557
+ * may be compressed or moved out-of-line. However datatype-specific routines
558
+ * are mostly content to deal with de-TOASTed values only, and of course
559
+ * client-side routines should never see a TOASTed value. But even in a
560
+ * de-TOASTed value, beware of touching vl_len_ directly, as its
561
+ * representation is no longer convenient. It's recommended that code always
562
+ * use macros VARDATA_ANY, VARSIZE_ANY, VARSIZE_ANY_EXHDR, VARDATA, VARSIZE,
563
+ * and SET_VARSIZE instead of relying on direct mentions of the struct fields.
564
+ * See postgres.h for details of the TOASTed form.
565
+ * ----------------
566
+ */
567
+ struct varlena
568
+ {
569
+ char vl_len_[4]; /* Do not touch this field directly! */
570
+ char vl_dat[FLEXIBLE_ARRAY_MEMBER]; /* Data content is here */
571
+ };
572
+
573
+ #define VARHDRSZ ((int32) sizeof(int32))
574
+
575
+ /*
576
+ * These widely-used datatypes are just a varlena header and the data bytes.
577
+ * There is no terminating null or anything like that --- the data length is
578
+ * always VARSIZE_ANY_EXHDR(ptr).
579
+ */
580
+ typedef struct varlena bytea;
581
+ typedef struct varlena text;
582
+ typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */
583
+ typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */
584
+
585
+ /*
586
+ * Specialized array types. These are physically laid out just the same
587
+ * as regular arrays (so that the regular array subscripting code works
588
+ * with them). They exist as distinct types mostly for historical reasons:
589
+ * they have nonstandard I/O behavior which we don't want to change for fear
590
+ * of breaking applications that look at the system catalogs. There is also
591
+ * an implementation issue for oidvector: it's part of the primary key for
592
+ * pg_proc, and we can't use the normal btree array support routines for that
593
+ * without circularity.
594
+ */
595
+ typedef struct
596
+ {
597
+ int32 vl_len_; /* these fields must match ArrayType! */
598
+ int ndim; /* always 1 for int2vector */
599
+ int32 dataoffset; /* always 0 for int2vector */
600
+ Oid elemtype;
601
+ int dim1;
602
+ int lbound1;
603
+ int16 values[FLEXIBLE_ARRAY_MEMBER];
604
+ } int2vector;
605
+
606
+ typedef struct
607
+ {
608
+ int32 vl_len_; /* these fields must match ArrayType! */
609
+ int ndim; /* always 1 for oidvector */
610
+ int32 dataoffset; /* always 0 for oidvector */
611
+ Oid elemtype;
612
+ int dim1;
613
+ int lbound1;
614
+ Oid values[FLEXIBLE_ARRAY_MEMBER];
615
+ } oidvector;
616
+
617
+ /*
618
+ * Representation of a Name: effectively just a C string, but null-padded to
619
+ * exactly NAMEDATALEN bytes. The use of a struct is historical.
620
+ */
621
+ typedef struct nameData
622
+ {
623
+ char data[NAMEDATALEN];
624
+ } NameData;
625
+ typedef NameData *Name;
626
+
627
+ #define NameStr(name) ((name).data)
628
+
629
+
630
+ /* ----------------------------------------------------------------
631
+ * Section 4: IsValid macros for system types
632
+ * ----------------------------------------------------------------
633
+ */
634
+ /*
635
+ * BoolIsValid
636
+ * True iff bool is valid.
637
+ */
638
+ #define BoolIsValid(boolean) ((boolean) == false || (boolean) == true)
639
+
640
+ /*
641
+ * PointerIsValid
642
+ * True iff pointer is valid.
643
+ */
644
+ #define PointerIsValid(pointer) ((const void*)(pointer) != NULL)
645
+
646
+ /*
647
+ * PointerIsAligned
648
+ * True iff pointer is properly aligned to point to the given type.
649
+ */
650
+ #define PointerIsAligned(pointer, type) \
651
+ (((uintptr_t)(pointer) % (sizeof (type))) == 0)
652
+
653
+ #define OffsetToPointer(base, offset) \
654
+ ((void *)((char *) base + offset))
655
+
656
+ #define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))
657
+
658
+ #define RegProcedureIsValid(p) OidIsValid(p)
659
+
660
+
661
+ /* ----------------------------------------------------------------
662
+ * Section 5: offsetof, lengthof, alignment
663
+ * ----------------------------------------------------------------
664
+ */
665
+ /*
666
+ * offsetof
667
+ * Offset of a structure/union field within that structure/union.
668
+ *
669
+ * XXX This is supposed to be part of stddef.h, but isn't on
670
+ * some systems (like SunOS 4).
671
+ */
672
+ #ifndef offsetof
673
+ #define offsetof(type, field) ((long) &((type *)0)->field)
674
+ #endif /* offsetof */
675
+
676
+ /*
677
+ * lengthof
678
+ * Number of elements in an array.
679
+ */
680
+ #define lengthof(array) (sizeof (array) / sizeof ((array)[0]))
681
+
682
+ /* ----------------
683
+ * Alignment macros: align a length or address appropriately for a given type.
684
+ * The fooALIGN() macros round up to a multiple of the required alignment,
685
+ * while the fooALIGN_DOWN() macros round down. The latter are more useful
686
+ * for problems like "how many X-sized structures will fit in a page?".
687
+ *
688
+ * NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
689
+ * That case seems extremely unlikely to be needed in practice, however.
690
+ *
691
+ * NOTE: MAXIMUM_ALIGNOF, and hence MAXALIGN(), intentionally exclude any
692
+ * larger-than-8-byte types the compiler might have.
693
+ * ----------------
694
+ */
695
+
696
+ #define TYPEALIGN(ALIGNVAL,LEN) \
697
+ (((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((uintptr_t) ((ALIGNVAL) - 1)))
698
+
699
+ #define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))
700
+ #define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))
701
+ #define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))
702
+ #define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))
703
+ #define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))
704
+ /* MAXALIGN covers only built-in types, not buffers */
705
+ #define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN))
706
+ #define CACHELINEALIGN(LEN) TYPEALIGN(PG_CACHE_LINE_SIZE, (LEN))
707
+
708
+ #define TYPEALIGN_DOWN(ALIGNVAL,LEN) \
709
+ (((uintptr_t) (LEN)) & ~((uintptr_t) ((ALIGNVAL) - 1)))
710
+
711
+ #define SHORTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_SHORT, (LEN))
712
+ #define INTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_INT, (LEN))
713
+ #define LONGALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_LONG, (LEN))
714
+ #define DOUBLEALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_DOUBLE, (LEN))
715
+ #define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN))
716
+ #define BUFFERALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_BUFFER, (LEN))
717
+
718
+ /*
719
+ * The above macros will not work with types wider than uintptr_t, like with
720
+ * uint64 on 32-bit platforms. That's not problem for the usual use where a
721
+ * pointer or a length is aligned, but for the odd case that you need to
722
+ * align something (potentially) wider, use TYPEALIGN64.
723
+ */
724
+ #define TYPEALIGN64(ALIGNVAL,LEN) \
725
+ (((uint64) (LEN) + ((ALIGNVAL) - 1)) & ~((uint64) ((ALIGNVAL) - 1)))
726
+
727
+ /* we don't currently need wider versions of the other ALIGN macros */
728
+ #define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
729
+
730
+
731
+ /* ----------------------------------------------------------------
732
+ * Section 6: assertions
733
+ * ----------------------------------------------------------------
734
+ */
735
+
736
+ /*
737
+ * USE_ASSERT_CHECKING, if defined, turns on all the assertions.
738
+ * - plai 9/5/90
739
+ *
740
+ * It should _NOT_ be defined in releases or in benchmark copies
741
+ */
742
+
743
+ /*
744
+ * Assert() can be used in both frontend and backend code. In frontend code it
745
+ * just calls the standard assert, if it's available. If use of assertions is
746
+ * not configured, it does nothing.
747
+ */
748
+ #ifndef USE_ASSERT_CHECKING
749
+
750
+ #define Assert(condition) ((void)true)
751
+ #define AssertMacro(condition) ((void)true)
752
+ #define AssertArg(condition) ((void)true)
753
+ #define AssertState(condition) ((void)true)
754
+ #define AssertPointerAlignment(ptr, bndr) ((void)true)
755
+ #define Trap(condition, errorType) ((void)true)
756
+ #define TrapMacro(condition, errorType) (true)
757
+
758
+ #elif defined(FRONTEND)
759
+
760
+ #include <assert.h>
761
+ #define Assert(p) assert(p)
762
+ #define AssertMacro(p) ((void) assert(p))
763
+ #define AssertArg(condition) assert(condition)
764
+ #define AssertState(condition) assert(condition)
765
+ #define AssertPointerAlignment(ptr, bndr) ((void)true)
766
+
767
+ #else /* USE_ASSERT_CHECKING && !FRONTEND */
768
+
769
+ /*
770
+ * Trap
771
+ * Generates an exception if the given condition is true.
772
+ */
773
+ #define Trap(condition, errorType) \
774
+ do { \
775
+ if (condition) \
776
+ ExceptionalCondition(#condition, (errorType), \
777
+ __FILE__, __LINE__); \
778
+ } while (0)
779
+
780
+ /*
781
+ * TrapMacro is the same as Trap but it's intended for use in macros:
782
+ *
783
+ * #define foo(x) (AssertMacro(x != 0), bar(x))
784
+ *
785
+ * Isn't CPP fun?
786
+ */
787
+ #define TrapMacro(condition, errorType) \
788
+ ((bool) (! (condition) || \
789
+ (ExceptionalCondition(#condition, (errorType), \
790
+ __FILE__, __LINE__), 0)))
791
+
792
+ #define Assert(condition) \
793
+ do { \
794
+ if (!(condition)) \
795
+ ExceptionalCondition(#condition, "FailedAssertion", \
796
+ __FILE__, __LINE__); \
797
+ } while (0)
798
+
799
+ #define AssertMacro(condition) \
800
+ ((void) ((condition) || \
801
+ (ExceptionalCondition(#condition, "FailedAssertion", \
802
+ __FILE__, __LINE__), 0)))
803
+
804
+ #define AssertArg(condition) \
805
+ do { \
806
+ if (!(condition)) \
807
+ ExceptionalCondition(#condition, "BadArgument", \
808
+ __FILE__, __LINE__); \
809
+ } while (0)
810
+
811
+ #define AssertState(condition) \
812
+ do { \
813
+ if (!(condition)) \
814
+ ExceptionalCondition(#condition, "BadState", \
815
+ __FILE__, __LINE__); \
816
+ } while (0)
817
+
818
+ /*
819
+ * Check that `ptr' is `bndr' aligned.
820
+ */
821
+ #define AssertPointerAlignment(ptr, bndr) \
822
+ Trap(TYPEALIGN(bndr, (uintptr_t)(ptr)) != (uintptr_t)(ptr), \
823
+ "UnalignedPointer")
824
+
825
+ #endif /* USE_ASSERT_CHECKING && !FRONTEND */
826
+
827
+ /*
828
+ * ExceptionalCondition is compiled into the backend whether or not
829
+ * USE_ASSERT_CHECKING is defined, so as to support use of extensions
830
+ * that are built with that #define with a backend that isn't. Hence,
831
+ * we should declare it as long as !FRONTEND.
832
+ */
833
+ #ifndef FRONTEND
834
+ extern void ExceptionalCondition(const char *conditionName,
835
+ const char *errorType,
836
+ const char *fileName, int lineNumber) pg_attribute_noreturn();
837
+ #endif
838
+
839
+ /*
840
+ * Macros to support compile-time assertion checks.
841
+ *
842
+ * If the "condition" (a compile-time-constant expression) evaluates to false,
843
+ * throw a compile error using the "errmessage" (a string literal).
844
+ *
845
+ * gcc 4.6 and up supports _Static_assert(), but there are bizarre syntactic
846
+ * placement restrictions. Macros StaticAssertStmt() and StaticAssertExpr()
847
+ * make it safe to use as a statement or in an expression, respectively.
848
+ * The macro StaticAssertDecl() is suitable for use at file scope (outside of
849
+ * any function).
850
+ *
851
+ * Otherwise we fall back on a kluge that assumes the compiler will complain
852
+ * about a negative width for a struct bit-field. This will not include a
853
+ * helpful error message, but it beats not getting an error at all.
854
+ */
855
+ #ifndef __cplusplus
856
+ #ifdef HAVE__STATIC_ASSERT
857
+ #define StaticAssertStmt(condition, errmessage) \
858
+ do { _Static_assert(condition, errmessage); } while(0)
859
+ #define StaticAssertExpr(condition, errmessage) \
860
+ ((void) ({ StaticAssertStmt(condition, errmessage); true; }))
861
+ #define StaticAssertDecl(condition, errmessage) \
862
+ _Static_assert(condition, errmessage)
863
+ #else /* !HAVE__STATIC_ASSERT */
864
+ #define StaticAssertStmt(condition, errmessage) \
865
+ ((void) sizeof(struct { int static_assert_failure : (condition) ? 1 : -1; }))
866
+ #define StaticAssertExpr(condition, errmessage) \
867
+ StaticAssertStmt(condition, errmessage)
868
+ #define StaticAssertDecl(condition, errmessage) \
869
+ extern void static_assert_func(int static_assert_failure[(condition) ? 1 : -1])
870
+ #endif /* HAVE__STATIC_ASSERT */
871
+ #else /* C++ */
872
+ #if defined(__cpp_static_assert) && __cpp_static_assert >= 200410
873
+ #define StaticAssertStmt(condition, errmessage) \
874
+ static_assert(condition, errmessage)
875
+ #define StaticAssertExpr(condition, errmessage) \
876
+ ({ static_assert(condition, errmessage); })
877
+ #define StaticAssertDecl(condition, errmessage) \
878
+ static_assert(condition, errmessage)
879
+ #else /* !__cpp_static_assert */
880
+ #define StaticAssertStmt(condition, errmessage) \
881
+ do { struct static_assert_struct { int static_assert_failure : (condition) ? 1 : -1; }; } while(0)
882
+ #define StaticAssertExpr(condition, errmessage) \
883
+ ((void) ({ StaticAssertStmt(condition, errmessage); }))
884
+ #define StaticAssertDecl(condition, errmessage) \
885
+ extern void static_assert_func(int static_assert_failure[(condition) ? 1 : -1])
886
+ #endif /* __cpp_static_assert */
887
+ #endif /* C++ */
888
+
889
+
890
+ /*
891
+ * Compile-time checks that a variable (or expression) has the specified type.
892
+ *
893
+ * AssertVariableIsOfType() can be used as a statement.
894
+ * AssertVariableIsOfTypeMacro() is intended for use in macros, eg
895
+ * #define foo(x) (AssertVariableIsOfTypeMacro(x, int), bar(x))
896
+ *
897
+ * If we don't have __builtin_types_compatible_p, we can still assert that
898
+ * the types have the same size. This is far from ideal (especially on 32-bit
899
+ * platforms) but it provides at least some coverage.
900
+ */
901
+ #ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P
902
+ #define AssertVariableIsOfType(varname, typename) \
903
+ StaticAssertStmt(__builtin_types_compatible_p(__typeof__(varname), typename), \
904
+ CppAsString(varname) " does not have type " CppAsString(typename))
905
+ #define AssertVariableIsOfTypeMacro(varname, typename) \
906
+ (StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname), typename), \
907
+ CppAsString(varname) " does not have type " CppAsString(typename)))
908
+ #else /* !HAVE__BUILTIN_TYPES_COMPATIBLE_P */
909
+ #define AssertVariableIsOfType(varname, typename) \
910
+ StaticAssertStmt(sizeof(varname) == sizeof(typename), \
911
+ CppAsString(varname) " does not have type " CppAsString(typename))
912
+ #define AssertVariableIsOfTypeMacro(varname, typename) \
913
+ (StaticAssertExpr(sizeof(varname) == sizeof(typename), \
914
+ CppAsString(varname) " does not have type " CppAsString(typename)))
915
+ #endif /* HAVE__BUILTIN_TYPES_COMPATIBLE_P */
916
+
917
+
918
+ /* ----------------------------------------------------------------
919
+ * Section 7: widely useful macros
920
+ * ----------------------------------------------------------------
921
+ */
922
+ /*
923
+ * Max
924
+ * Return the maximum of two numbers.
925
+ */
926
+ #define Max(x, y) ((x) > (y) ? (x) : (y))
927
+
928
+ /*
929
+ * Min
930
+ * Return the minimum of two numbers.
931
+ */
932
+ #define Min(x, y) ((x) < (y) ? (x) : (y))
933
+
934
+ /*
935
+ * Abs
936
+ * Return the absolute value of the argument.
937
+ */
938
+ #define Abs(x) ((x) >= 0 ? (x) : -(x))
939
+
940
+ /*
941
+ * StrNCpy
942
+ * Like standard library function strncpy(), except that result string
943
+ * is guaranteed to be null-terminated --- that is, at most N-1 bytes
944
+ * of the source string will be kept.
945
+ * Also, the macro returns no result (too hard to do that without
946
+ * evaluating the arguments multiple times, which seems worse).
947
+ *
948
+ * BTW: when you need to copy a non-null-terminated string (like a text
949
+ * datum) and add a null, do not do it with StrNCpy(..., len+1). That
950
+ * might seem to work, but it fetches one byte more than there is in the
951
+ * text object. One fine day you'll have a SIGSEGV because there isn't
952
+ * another byte before the end of memory. Don't laugh, we've had real
953
+ * live bug reports from real live users over exactly this mistake.
954
+ * Do it honestly with "memcpy(dst,src,len); dst[len] = '\0';", instead.
955
+ */
956
+ #define StrNCpy(dst,src,len) \
957
+ do \
958
+ { \
959
+ char * _dst = (dst); \
960
+ Size _len = (len); \
961
+ \
962
+ if (_len > 0) \
963
+ { \
964
+ strncpy(_dst, (src), _len); \
965
+ _dst[_len-1] = '\0'; \
966
+ } \
967
+ } while (0)
968
+
969
+
970
+ /* Get a bit mask of the bits set in non-long aligned addresses */
971
+ #define LONG_ALIGN_MASK (sizeof(long) - 1)
972
+
973
+ /*
974
+ * MemSet
975
+ * Exactly the same as standard library function memset(), but considerably
976
+ * faster for zeroing small word-aligned structures (such as parsetree nodes).
977
+ * This has to be a macro because the main point is to avoid function-call
978
+ * overhead. However, we have also found that the loop is faster than
979
+ * native libc memset() on some platforms, even those with assembler
980
+ * memset() functions. More research needs to be done, perhaps with
981
+ * MEMSET_LOOP_LIMIT tests in configure.
982
+ */
983
+ #define MemSet(start, val, len) \
984
+ do \
985
+ { \
986
+ /* must be void* because we don't know if it is integer aligned yet */ \
987
+ void *_vstart = (void *) (start); \
988
+ int _val = (val); \
989
+ Size _len = (len); \
990
+ \
991
+ if ((((uintptr_t) _vstart) & LONG_ALIGN_MASK) == 0 && \
992
+ (_len & LONG_ALIGN_MASK) == 0 && \
993
+ _val == 0 && \
994
+ _len <= MEMSET_LOOP_LIMIT && \
995
+ /* \
996
+ * If MEMSET_LOOP_LIMIT == 0, optimizer should find \
997
+ * the whole "if" false at compile time. \
998
+ */ \
999
+ MEMSET_LOOP_LIMIT != 0) \
1000
+ { \
1001
+ long *_start = (long *) _vstart; \
1002
+ long *_stop = (long *) ((char *) _start + _len); \
1003
+ while (_start < _stop) \
1004
+ *_start++ = 0; \
1005
+ } \
1006
+ else \
1007
+ memset(_vstart, _val, _len); \
1008
+ } while (0)
1009
+
1010
+ /*
1011
+ * MemSetAligned is the same as MemSet except it omits the test to see if
1012
+ * "start" is word-aligned. This is okay to use if the caller knows a-priori
1013
+ * that the pointer is suitably aligned (typically, because he just got it
1014
+ * from palloc(), which always delivers a max-aligned pointer).
1015
+ */
1016
+ #define MemSetAligned(start, val, len) \
1017
+ do \
1018
+ { \
1019
+ long *_start = (long *) (start); \
1020
+ int _val = (val); \
1021
+ Size _len = (len); \
1022
+ \
1023
+ if ((_len & LONG_ALIGN_MASK) == 0 && \
1024
+ _val == 0 && \
1025
+ _len <= MEMSET_LOOP_LIMIT && \
1026
+ MEMSET_LOOP_LIMIT != 0) \
1027
+ { \
1028
+ long *_stop = (long *) ((char *) _start + _len); \
1029
+ while (_start < _stop) \
1030
+ *_start++ = 0; \
1031
+ } \
1032
+ else \
1033
+ memset(_start, _val, _len); \
1034
+ } while (0)
1035
+
1036
+
1037
+ /*
1038
+ * MemSetTest/MemSetLoop are a variant version that allow all the tests in
1039
+ * MemSet to be done at compile time in cases where "val" and "len" are
1040
+ * constants *and* we know the "start" pointer must be word-aligned.
1041
+ * If MemSetTest succeeds, then it is okay to use MemSetLoop, otherwise use
1042
+ * MemSetAligned. Beware of multiple evaluations of the arguments when using
1043
+ * this approach.
1044
+ */
1045
+ #define MemSetTest(val, len) \
1046
+ ( ((len) & LONG_ALIGN_MASK) == 0 && \
1047
+ (len) <= MEMSET_LOOP_LIMIT && \
1048
+ MEMSET_LOOP_LIMIT != 0 && \
1049
+ (val) == 0 )
1050
+
1051
+ #define MemSetLoop(start, val, len) \
1052
+ do \
1053
+ { \
1054
+ long * _start = (long *) (start); \
1055
+ long * _stop = (long *) ((char *) _start + (Size) (len)); \
1056
+ \
1057
+ while (_start < _stop) \
1058
+ *_start++ = 0; \
1059
+ } while (0)
1060
+
1061
+ /*
1062
+ * Macros for range-checking float values before converting to integer.
1063
+ * We must be careful here that the boundary values are expressed exactly
1064
+ * in the float domain. PG_INTnn_MIN is an exact power of 2, so it will
1065
+ * be represented exactly; but PG_INTnn_MAX isn't, and might get rounded
1066
+ * off, so avoid using that.
1067
+ * The input must be rounded to an integer beforehand, typically with rint(),
1068
+ * else we might draw the wrong conclusion about close-to-the-limit values.
1069
+ * These macros will do the right thing for Inf, but not necessarily for NaN,
1070
+ * so check isnan(num) first if that's a possibility.
1071
+ */
1072
+ #define FLOAT4_FITS_IN_INT16(num) \
1073
+ ((num) >= (float4) PG_INT16_MIN && (num) < -((float4) PG_INT16_MIN))
1074
+ #define FLOAT4_FITS_IN_INT32(num) \
1075
+ ((num) >= (float4) PG_INT32_MIN && (num) < -((float4) PG_INT32_MIN))
1076
+ #define FLOAT4_FITS_IN_INT64(num) \
1077
+ ((num) >= (float4) PG_INT64_MIN && (num) < -((float4) PG_INT64_MIN))
1078
+ #define FLOAT8_FITS_IN_INT16(num) \
1079
+ ((num) >= (float8) PG_INT16_MIN && (num) < -((float8) PG_INT16_MIN))
1080
+ #define FLOAT8_FITS_IN_INT32(num) \
1081
+ ((num) >= (float8) PG_INT32_MIN && (num) < -((float8) PG_INT32_MIN))
1082
+ #define FLOAT8_FITS_IN_INT64(num) \
1083
+ ((num) >= (float8) PG_INT64_MIN && (num) < -((float8) PG_INT64_MIN))
1084
+
1085
+
1086
+ /* ----------------------------------------------------------------
1087
+ * Section 8: random stuff
1088
+ * ----------------------------------------------------------------
1089
+ */
1090
+
1091
+ #ifdef HAVE_STRUCT_SOCKADDR_UN
1092
+ #define HAVE_UNIX_SOCKETS 1
1093
+ #endif
1094
+
1095
+ /*
1096
+ * Invert the sign of a qsort-style comparison result, ie, exchange negative
1097
+ * and positive integer values, being careful not to get the wrong answer
1098
+ * for INT_MIN. The argument should be an integral variable.
1099
+ */
1100
+ #define INVERT_COMPARE_RESULT(var) \
1101
+ ((var) = ((var) < 0) ? 1 : -(var))
1102
+
1103
+ /*
1104
+ * Use this, not "char buf[BLCKSZ]", to declare a field or local variable
1105
+ * holding a page buffer, if that page might be accessed as a page and not
1106
+ * just a string of bytes. Otherwise the variable might be under-aligned,
1107
+ * causing problems on alignment-picky hardware. (In some places, we use
1108
+ * this to declare buffers even though we only pass them to read() and
1109
+ * write(), because copying to/from aligned buffers is usually faster than
1110
+ * using unaligned buffers.) We include both "double" and "int64" in the
1111
+ * union to ensure that the compiler knows the value must be MAXALIGN'ed
1112
+ * (cf. configure's computation of MAXIMUM_ALIGNOF).
1113
+ */
1114
+ typedef union PGAlignedBlock
1115
+ {
1116
+ char data[BLCKSZ];
1117
+ double force_align_d;
1118
+ int64 force_align_i64;
1119
+ } PGAlignedBlock;
1120
+
1121
+ /* Same, but for an XLOG_BLCKSZ-sized buffer */
1122
+ typedef union PGAlignedXLogBlock
1123
+ {
1124
+ char data[XLOG_BLCKSZ];
1125
+ double force_align_d;
1126
+ int64 force_align_i64;
1127
+ } PGAlignedXLogBlock;
1128
+
1129
+ /* msb for char */
1130
+ #define HIGHBIT (0x80)
1131
+ #define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT)
1132
+
1133
+ /*
1134
+ * Support macros for escaping strings. escape_backslash should be true
1135
+ * if generating a non-standard-conforming string. Prefixing a string
1136
+ * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
1137
+ * Beware of multiple evaluation of the "ch" argument!
1138
+ */
1139
+ #define SQL_STR_DOUBLE(ch, escape_backslash) \
1140
+ ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
1141
+
1142
+ #define ESCAPE_STRING_SYNTAX 'E'
1143
+
1144
+
1145
+ #define STATUS_OK (0)
1146
+ #define STATUS_ERROR (-1)
1147
+ #define STATUS_EOF (-2)
1148
+ #define STATUS_WAITING (2)
1149
+
1150
+ /*
1151
+ * gettext support
1152
+ */
1153
+
1154
+ #ifndef ENABLE_NLS
1155
+ /* stuff we'd otherwise get from <libintl.h> */
1156
+ #define gettext(x) (x)
1157
+ #define dgettext(d,x) (x)
1158
+ #define ngettext(s,p,n) ((n) == 1 ? (s) : (p))
1159
+ #define dngettext(d,s,p,n) ((n) == 1 ? (s) : (p))
1160
+ #endif
1161
+
1162
+ #define _(x) gettext(x)
1163
+
1164
+ /*
1165
+ * Use this to mark string constants as needing translation at some later
1166
+ * time, rather than immediately. This is useful for cases where you need
1167
+ * access to the original string and translated string, and for cases where
1168
+ * immediate translation is not possible, like when initializing global
1169
+ * variables.
1170
+ * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html
1171
+ */
1172
+ #define gettext_noop(x) (x)
1173
+
1174
+ /*
1175
+ * To better support parallel installations of major PostgreSQL
1176
+ * versions as well as parallel installations of major library soname
1177
+ * versions, we mangle the gettext domain name by appending those
1178
+ * version numbers. The coding rule ought to be that wherever the
1179
+ * domain name is mentioned as a literal, it must be wrapped into
1180
+ * PG_TEXTDOMAIN(). The macros below do not work on non-literals; but
1181
+ * that is somewhat intentional because it avoids having to worry
1182
+ * about multiple states of premangling and postmangling as the values
1183
+ * are being passed around.
1184
+ *
1185
+ * Make sure this matches the installation rules in nls-global.mk.
1186
+ */
1187
+ #ifdef SO_MAJOR_VERSION
1188
+ #define PG_TEXTDOMAIN(domain) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)
1189
+ #else
1190
+ #define PG_TEXTDOMAIN(domain) (domain "-" PG_MAJORVERSION)
1191
+ #endif
1192
+
1193
+ /*
1194
+ * Macro that allows to cast constness and volatile away from an expression, but doesn't
1195
+ * allow changing the underlying type. Enforcement of the latter
1196
+ * currently only works for gcc like compilers.
1197
+ *
1198
+ * Please note IT IS NOT SAFE to cast constness away if the result will ever
1199
+ * be modified (it would be undefined behaviour). Doing so anyway can cause
1200
+ * compiler misoptimizations or runtime crashes (modifying readonly memory).
1201
+ * It is only safe to use when the result will not be modified, but API
1202
+ * design or language restrictions prevent you from declaring that
1203
+ * (e.g. because a function returns both const and non-const variables).
1204
+ *
1205
+ * Note that this only works in function scope, not for global variables (it'd
1206
+ * be nice, but not trivial, to improve that).
1207
+ */
1208
+ #if defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P)
1209
+ #define unconstify(underlying_type, expr) \
1210
+ (StaticAssertExpr(__builtin_types_compatible_p(__typeof(expr), const underlying_type), \
1211
+ "wrong cast"), \
1212
+ (underlying_type) (expr))
1213
+ #define unvolatize(underlying_type, expr) \
1214
+ (StaticAssertExpr(__builtin_types_compatible_p(__typeof(expr), volatile underlying_type), \
1215
+ "wrong cast"), \
1216
+ (underlying_type) (expr))
1217
+ #else
1218
+ #define unconstify(underlying_type, expr) \
1219
+ ((underlying_type) (expr))
1220
+ #define unvolatize(underlying_type, expr) \
1221
+ ((underlying_type) (expr))
1222
+ #endif
1223
+
1224
+ /* ----------------------------------------------------------------
1225
+ * Section 9: system-specific hacks
1226
+ *
1227
+ * This should be limited to things that absolutely have to be
1228
+ * included in every source file. The port-specific header file
1229
+ * is usually a better place for this sort of thing.
1230
+ * ----------------------------------------------------------------
1231
+ */
1232
+
1233
+ /*
1234
+ * NOTE: this is also used for opening text files.
1235
+ * WIN32 treats Control-Z as EOF in files opened in text mode.
1236
+ * Therefore, we open files in binary mode on Win32 so we can read
1237
+ * literal control-Z. The other affect is that we see CRLF, but
1238
+ * that is OK because we can already handle those cleanly.
1239
+ */
1240
+ #if defined(WIN32) || defined(__CYGWIN__)
1241
+ #define PG_BINARY O_BINARY
1242
+ #define PG_BINARY_A "ab"
1243
+ #define PG_BINARY_R "rb"
1244
+ #define PG_BINARY_W "wb"
1245
+ #else
1246
+ #define PG_BINARY 0
1247
+ #define PG_BINARY_A "a"
1248
+ #define PG_BINARY_R "r"
1249
+ #define PG_BINARY_W "w"
1250
+ #endif
1251
+
1252
+ /*
1253
+ * Provide prototypes for routines not present in a particular machine's
1254
+ * standard C library.
1255
+ */
1256
+
1257
+ #if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC
1258
+ extern int fdatasync(int fildes);
1259
+ #endif
1260
+
1261
+ /* Older platforms may provide strto[u]ll functionality under other names */
1262
+ #if !defined(HAVE_STRTOLL) && defined(HAVE___STRTOLL)
1263
+ #define strtoll __strtoll
1264
+ #define HAVE_STRTOLL 1
1265
+ #endif
1266
+
1267
+ #if !defined(HAVE_STRTOLL) && defined(HAVE_STRTOQ)
1268
+ #define strtoll strtoq
1269
+ #define HAVE_STRTOLL 1
1270
+ #endif
1271
+
1272
+ #if !defined(HAVE_STRTOULL) && defined(HAVE___STRTOULL)
1273
+ #define strtoull __strtoull
1274
+ #define HAVE_STRTOULL 1
1275
+ #endif
1276
+
1277
+ #if !defined(HAVE_STRTOULL) && defined(HAVE_STRTOUQ)
1278
+ #define strtoull strtouq
1279
+ #define HAVE_STRTOULL 1
1280
+ #endif
1281
+
1282
+ #if defined(HAVE_STRTOLL) && !HAVE_DECL_STRTOLL
1283
+ extern long long strtoll(const char *str, char **endptr, int base);
1284
+ #endif
1285
+
1286
+ #if defined(HAVE_STRTOULL) && !HAVE_DECL_STRTOULL
1287
+ extern unsigned long long strtoull(const char *str, char **endptr, int base);
1288
+ #endif
1289
+
1290
+ /* no special DLL markers on most ports */
1291
+ #ifndef PGDLLIMPORT
1292
+ #define PGDLLIMPORT
1293
+ #endif
1294
+ #ifndef PGDLLEXPORT
1295
+ #define PGDLLEXPORT
1296
+ #endif
1297
+
1298
+ /*
1299
+ * The following is used as the arg list for signal handlers. Any ports
1300
+ * that take something other than an int argument should override this in
1301
+ * their pg_config_os.h file. Note that variable names are required
1302
+ * because it is used in both the prototypes as well as the definitions.
1303
+ * Note also the long name. We expect that this won't collide with
1304
+ * other names causing compiler warnings.
1305
+ */
1306
+
1307
+ #ifndef SIGNAL_ARGS
1308
+ #define SIGNAL_ARGS int postgres_signal_arg
1309
+ #endif
1310
+
1311
+ /*
1312
+ * When there is no sigsetjmp, its functionality is provided by plain
1313
+ * setjmp. Incidentally, nothing provides setjmp's functionality in
1314
+ * that case. We now support the case only on Windows.
1315
+ */
1316
+ #ifdef WIN32
1317
+ #define sigjmp_buf jmp_buf
1318
+ #define sigsetjmp(x,y) setjmp(x)
1319
+ #define siglongjmp longjmp
1320
+ #endif
1321
+
1322
+ /* EXEC_BACKEND defines */
1323
+ #ifdef EXEC_BACKEND
1324
+ #define NON_EXEC_STATIC
1325
+ #else
1326
+ #define NON_EXEC_STATIC static
1327
+ #endif
1328
+
1329
+ /* /port compatibility functions */
1330
+ #include "port.h"
1331
+
1332
+ #endif /* C_H */
1333
+ #undef StaticAssertDecl
1334
+ #define StaticAssertDecl(condition, errmessage)