pg_query 1.1.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (478) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +163 -52
  3. data/README.md +80 -69
  4. data/Rakefile +82 -1
  5. data/ext/pg_query/extconf.rb +3 -31
  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 +988 -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 +9953 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +292 -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 +437 -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 +16 -1117
  460. data/lib/pg_query/filter_columns.rb +86 -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 -200
  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 +64 -43
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +473 -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/legacy_parsetree.rb +0 -109
  478. data/lib/pg_query/node_types.rb +0 -284
@@ -0,0 +1,142 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - function_parse_error_transpose
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * pg_proc.c
10
+ * routines to support manipulation of the pg_proc relation
11
+ *
12
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
13
+ * Portions Copyright (c) 1994, Regents of the University of California
14
+ *
15
+ *
16
+ * IDENTIFICATION
17
+ * src/backend/catalog/pg_proc.c
18
+ *
19
+ *-------------------------------------------------------------------------
20
+ */
21
+ #include "postgres.h"
22
+
23
+ #include "access/htup_details.h"
24
+ #include "access/table.h"
25
+ #include "access/xact.h"
26
+ #include "catalog/catalog.h"
27
+ #include "catalog/dependency.h"
28
+ #include "catalog/indexing.h"
29
+ #include "catalog/objectaccess.h"
30
+ #include "catalog/pg_language.h"
31
+ #include "catalog/pg_namespace.h"
32
+ #include "catalog/pg_proc.h"
33
+ #include "catalog/pg_transform.h"
34
+ #include "catalog/pg_type.h"
35
+ #include "commands/defrem.h"
36
+ #include "executor/functions.h"
37
+ #include "funcapi.h"
38
+ #include "mb/pg_wchar.h"
39
+ #include "miscadmin.h"
40
+ #include "nodes/nodeFuncs.h"
41
+ #include "parser/parse_coerce.h"
42
+ #include "parser/parse_type.h"
43
+ #include "tcop/pquery.h"
44
+ #include "tcop/tcopprot.h"
45
+ #include "utils/acl.h"
46
+ #include "utils/builtins.h"
47
+ #include "utils/lsyscache.h"
48
+ #include "utils/regproc.h"
49
+ #include "utils/rel.h"
50
+ #include "utils/syscache.h"
51
+
52
+
53
+ typedef struct
54
+ {
55
+ char *proname;
56
+ char *prosrc;
57
+ } parse_error_callback_arg;
58
+
59
+ static void sql_function_parse_error_callback(void *arg);
60
+ static int match_prosrc_to_query(const char *prosrc, const char *queryText,
61
+ int cursorpos);
62
+ static bool match_prosrc_to_literal(const char *prosrc, const char *literal,
63
+ int cursorpos, int *newcursorpos);
64
+
65
+
66
+ /* ----------------------------------------------------------------
67
+ * ProcedureCreate
68
+ *
69
+ * Note: allParameterTypes, parameterModes, parameterNames, trftypes, and proconfig
70
+ * are either arrays of the proper types or NULL. We declare them Datum,
71
+ * not "ArrayType *", to avoid importing array.h into pg_proc.h.
72
+ * ----------------------------------------------------------------
73
+ */
74
+
75
+
76
+
77
+
78
+ /*
79
+ * Validator for internal functions
80
+ *
81
+ * Check that the given internal function name (the "prosrc" value) is
82
+ * a known builtin function.
83
+ */
84
+
85
+
86
+
87
+
88
+ /*
89
+ * Validator for C language functions
90
+ *
91
+ * Make sure that the library file exists, is loadable, and contains
92
+ * the specified link symbol. Also check for a valid function
93
+ * information record.
94
+ */
95
+
96
+
97
+
98
+ /*
99
+ * Validator for SQL language functions
100
+ *
101
+ * Parse it here in order to be sure that it contains no syntax errors.
102
+ */
103
+
104
+
105
+ /*
106
+ * Error context callback for handling errors in SQL function definitions
107
+ */
108
+
109
+
110
+ /*
111
+ * Adjust a syntax error occurring inside the function body of a CREATE
112
+ * FUNCTION or DO command. This can be used by any function validator or
113
+ * anonymous-block handler, not only for SQL-language functions.
114
+ * It is assumed that the syntax error position is initially relative to the
115
+ * function body string (as passed in). If possible, we adjust the position
116
+ * to reference the original command text; if we can't manage that, we set
117
+ * up an "internal query" syntax error instead.
118
+ *
119
+ * Returns true if a syntax error was processed, false if not.
120
+ */
121
+ bool function_parse_error_transpose(const char *prosrc) { return false; }
122
+
123
+
124
+ /*
125
+ * Try to locate the string literal containing the function body in the
126
+ * given text of the CREATE FUNCTION or DO command. If successful, return
127
+ * the character (not byte) index within the command corresponding to the
128
+ * given character index within the literal. If not successful, return 0.
129
+ */
130
+
131
+
132
+ /*
133
+ * Try to match the given source text to a single-quoted literal.
134
+ * If successful, adjust newcursorpos to correspond to the character
135
+ * (not byte) index corresponding to cursorpos in the source text.
136
+ *
137
+ * At entry, literal points just past a ' character. We must check for the
138
+ * trailing quote.
139
+ */
140
+
141
+
142
+
@@ -0,0 +1,117 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - defGetInt32
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * define.c
10
+ * Support routines for various kinds of object creation.
11
+ *
12
+ *
13
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
14
+ * Portions Copyright (c) 1994, Regents of the University of California
15
+ *
16
+ *
17
+ * IDENTIFICATION
18
+ * src/backend/commands/define.c
19
+ *
20
+ * DESCRIPTION
21
+ * The "DefineFoo" routines take the parse tree and pick out the
22
+ * appropriate arguments/flags, passing the results to the
23
+ * corresponding "FooDefine" routines (in src/catalog) that do
24
+ * the actual catalog-munging. These routines also verify permission
25
+ * of the user to execute the command.
26
+ *
27
+ * NOTES
28
+ * These things must be defined and committed in the following order:
29
+ * "create function":
30
+ * input/output, recv/send procedures
31
+ * "create type":
32
+ * type
33
+ * "create operator":
34
+ * operators
35
+ *
36
+ *
37
+ *-------------------------------------------------------------------------
38
+ */
39
+ #include "postgres.h"
40
+
41
+ #include <ctype.h>
42
+ #include <math.h>
43
+
44
+ #include "catalog/namespace.h"
45
+ #include "commands/defrem.h"
46
+ #include "nodes/makefuncs.h"
47
+ #include "parser/parse_type.h"
48
+ #include "parser/scansup.h"
49
+ #include "utils/builtins.h"
50
+
51
+ /*
52
+ * Extract a string value (otherwise uninterpreted) from a DefElem.
53
+ */
54
+
55
+
56
+ /*
57
+ * Extract a numeric value (actually double) from a DefElem.
58
+ */
59
+
60
+
61
+ /*
62
+ * Extract a boolean value from a DefElem.
63
+ */
64
+
65
+
66
+ /*
67
+ * Extract an int32 value from a DefElem.
68
+ */
69
+ int32
70
+ defGetInt32(DefElem *def)
71
+ {
72
+ if (def->arg == NULL)
73
+ ereport(ERROR,
74
+ (errcode(ERRCODE_SYNTAX_ERROR),
75
+ errmsg("%s requires an integer value",
76
+ def->defname)));
77
+ switch (nodeTag(def->arg))
78
+ {
79
+ case T_Integer:
80
+ return (int32) intVal(def->arg);
81
+ default:
82
+ ereport(ERROR,
83
+ (errcode(ERRCODE_SYNTAX_ERROR),
84
+ errmsg("%s requires an integer value",
85
+ def->defname)));
86
+ }
87
+ return 0; /* keep compiler quiet */
88
+ }
89
+
90
+ /*
91
+ * Extract an int64 value from a DefElem.
92
+ */
93
+
94
+
95
+ /*
96
+ * Extract a possibly-qualified name (as a List of Strings) from a DefElem.
97
+ */
98
+
99
+
100
+ /*
101
+ * Extract a TypeName from a DefElem.
102
+ *
103
+ * Note: we do not accept a List arg here, because the parser will only
104
+ * return a bare List when the name looks like an operator name.
105
+ */
106
+
107
+
108
+ /*
109
+ * Extract a type length indicator (either absolute bytes, or
110
+ * -1 for "variable") from a DefElem.
111
+ */
112
+
113
+
114
+ /*
115
+ * Extract a list of string values (otherwise uninterpreted) from a DefElem.
116
+ */
117
+
@@ -0,0 +1,651 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - PqCommMethods
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * pqcomm.c
10
+ * Communication functions between the Frontend and the Backend
11
+ *
12
+ * These routines handle the low-level details of communication between
13
+ * frontend and backend. They just shove data across the communication
14
+ * channel, and are ignorant of the semantics of the data --- or would be,
15
+ * except for major brain damage in the design of the old COPY OUT protocol.
16
+ * Unfortunately, COPY OUT was designed to commandeer the communication
17
+ * channel (it just transfers data without wrapping it into messages).
18
+ * No other messages can be sent while COPY OUT is in progress; and if the
19
+ * copy is aborted by an ereport(ERROR), we need to close out the copy so that
20
+ * the frontend gets back into sync. Therefore, these routines have to be
21
+ * aware of COPY OUT state. (New COPY-OUT is message-based and does *not*
22
+ * set the DoingCopyOut flag.)
23
+ *
24
+ * NOTE: generally, it's a bad idea to emit outgoing messages directly with
25
+ * pq_putbytes(), especially if the message would require multiple calls
26
+ * to send. Instead, use the routines in pqformat.c to construct the message
27
+ * in a buffer and then emit it in one call to pq_putmessage. This ensures
28
+ * that the channel will not be clogged by an incomplete message if execution
29
+ * is aborted by ereport(ERROR) partway through the message. The only
30
+ * non-libpq code that should call pq_putbytes directly is old-style COPY OUT.
31
+ *
32
+ * At one time, libpq was shared between frontend and backend, but now
33
+ * the backend's "backend/libpq" is quite separate from "interfaces/libpq".
34
+ * All that remains is similarities of names to trap the unwary...
35
+ *
36
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
37
+ * Portions Copyright (c) 1994, Regents of the University of California
38
+ *
39
+ * src/backend/libpq/pqcomm.c
40
+ *
41
+ *-------------------------------------------------------------------------
42
+ */
43
+
44
+ /*------------------------
45
+ * INTERFACE ROUTINES
46
+ *
47
+ * setup/teardown:
48
+ * StreamServerPort - Open postmaster's server port
49
+ * StreamConnection - Create new connection with client
50
+ * StreamClose - Close a client/backend connection
51
+ * TouchSocketFiles - Protect socket files against /tmp cleaners
52
+ * pq_init - initialize libpq at backend startup
53
+ * socket_comm_reset - reset libpq during error recovery
54
+ * socket_close - shutdown libpq at backend exit
55
+ *
56
+ * low-level I/O:
57
+ * pq_getbytes - get a known number of bytes from connection
58
+ * pq_getstring - get a null terminated string from connection
59
+ * pq_getmessage - get a message with length word from connection
60
+ * pq_getbyte - get next byte from connection
61
+ * pq_peekbyte - peek at next byte from connection
62
+ * pq_putbytes - send bytes to connection (not flushed until pq_flush)
63
+ * pq_flush - flush pending output
64
+ * pq_flush_if_writable - flush pending output if writable without blocking
65
+ * pq_getbyte_if_available - get a byte if available without blocking
66
+ *
67
+ * message-level I/O (and old-style-COPY-OUT cruft):
68
+ * pq_putmessage - send a normal message (suppressed in COPY OUT mode)
69
+ * pq_putmessage_noblock - buffer a normal message (suppressed in COPY OUT)
70
+ * pq_startcopyout - inform libpq that a COPY OUT transfer is beginning
71
+ * pq_endcopyout - end a COPY OUT transfer
72
+ *
73
+ *------------------------
74
+ */
75
+ #include "postgres.h"
76
+
77
+ #include <signal.h>
78
+ #include <fcntl.h>
79
+ #include <grp.h>
80
+ #include <unistd.h>
81
+ #include <sys/file.h>
82
+ #include <sys/socket.h>
83
+ #include <sys/stat.h>
84
+ #include <sys/time.h>
85
+ #include <netdb.h>
86
+ #include <netinet/in.h>
87
+ #ifdef HAVE_NETINET_TCP_H
88
+ #include <netinet/tcp.h>
89
+ #endif
90
+ #include <utime.h>
91
+ #ifdef _MSC_VER /* mstcpip.h is missing on mingw */
92
+ #include <mstcpip.h>
93
+ #endif
94
+
95
+ #include "common/ip.h"
96
+ #include "libpq/libpq.h"
97
+ #include "miscadmin.h"
98
+ #include "port/pg_bswap.h"
99
+ #include "storage/ipc.h"
100
+ #include "utils/guc.h"
101
+ #include "utils/memutils.h"
102
+
103
+ /*
104
+ * Cope with the various platform-specific ways to spell TCP keepalive socket
105
+ * options. This doesn't cover Windows, which as usual does its own thing.
106
+ */
107
+ #if defined(TCP_KEEPIDLE)
108
+ /* TCP_KEEPIDLE is the name of this option on Linux and *BSD */
109
+ #define PG_TCP_KEEPALIVE_IDLE TCP_KEEPIDLE
110
+ #define PG_TCP_KEEPALIVE_IDLE_STR "TCP_KEEPIDLE"
111
+ #elif defined(TCP_KEEPALIVE_THRESHOLD)
112
+ /* TCP_KEEPALIVE_THRESHOLD is the name of this option on Solaris >= 11 */
113
+ #define PG_TCP_KEEPALIVE_IDLE TCP_KEEPALIVE_THRESHOLD
114
+ #define PG_TCP_KEEPALIVE_IDLE_STR "TCP_KEEPALIVE_THRESHOLD"
115
+ #elif defined(TCP_KEEPALIVE) && defined(__darwin__)
116
+ /* TCP_KEEPALIVE is the name of this option on macOS */
117
+ /* Caution: Solaris has this symbol but it means something different */
118
+ #define PG_TCP_KEEPALIVE_IDLE TCP_KEEPALIVE
119
+ #define PG_TCP_KEEPALIVE_IDLE_STR "TCP_KEEPALIVE"
120
+ #endif
121
+
122
+ /*
123
+ * Configuration options
124
+ */
125
+
126
+
127
+
128
+ /* Where the Unix socket files are (list of palloc'd strings) */
129
+
130
+
131
+ /*
132
+ * Buffers for low-level I/O.
133
+ *
134
+ * The receive buffer is fixed size. Send buffer is usually 8k, but can be
135
+ * enlarged by pq_putmessage_noblock() if the message doesn't fit otherwise.
136
+ */
137
+
138
+ #define PQ_SEND_BUFFER_SIZE 8192
139
+ #define PQ_RECV_BUFFER_SIZE 8192
140
+
141
+
142
+ /* Size send buffer */
143
+ /* Next index to store a byte in PqSendBuffer */
144
+ /* Next index to send a byte in PqSendBuffer */
145
+
146
+
147
+ /* Next index to read a byte from PqRecvBuffer */
148
+ /* End of data available in PqRecvBuffer */
149
+
150
+ /*
151
+ * Message status
152
+ */
153
+ /* busy sending data to the client */
154
+ /* in the middle of reading a message */
155
+ /* in old-protocol COPY OUT processing */
156
+
157
+
158
+ /* Internal functions */
159
+ static void socket_comm_reset(void);
160
+ static void socket_close(int code, Datum arg);
161
+ static void socket_set_nonblocking(bool nonblocking);
162
+ static int socket_flush(void);
163
+ static int socket_flush_if_writable(void);
164
+ static bool socket_is_send_pending(void);
165
+ static int socket_putmessage(char msgtype, const char *s, size_t len);
166
+ static void socket_putmessage_noblock(char msgtype, const char *s, size_t len);
167
+ static void socket_startcopyout(void);
168
+ static void socket_endcopyout(bool errorAbort);
169
+ static int internal_putbytes(const char *s, size_t len);
170
+ static int internal_flush(void);
171
+
172
+ #ifdef HAVE_UNIX_SOCKETS
173
+ static int Lock_AF_UNIX(const char *unixSocketDir, const char *unixSocketPath);
174
+ static int Setup_AF_UNIX(const char *sock_path);
175
+ #endif /* HAVE_UNIX_SOCKETS */
176
+
177
+
178
+
179
+ const PQcommMethods *PqCommMethods = NULL;
180
+
181
+
182
+
183
+
184
+
185
+ /* --------------------------------
186
+ * pq_init - initialize libpq at backend startup
187
+ * --------------------------------
188
+ */
189
+ #ifndef WIN32
190
+ #endif
191
+
192
+ /* --------------------------------
193
+ * socket_comm_reset - reset libpq during error recovery
194
+ *
195
+ * This is called from error recovery at the outer idle loop. It's
196
+ * just to get us out of trouble if we somehow manage to elog() from
197
+ * inside a pqcomm.c routine (which ideally will never happen, but...)
198
+ * --------------------------------
199
+ */
200
+
201
+
202
+ /* --------------------------------
203
+ * socket_close - shutdown libpq at backend exit
204
+ *
205
+ * This is the one pg_on_exit_callback in place during BackendInitialize().
206
+ * That function's unusual signal handling constrains that this callback be
207
+ * safe to run at any instant.
208
+ * --------------------------------
209
+ */
210
+ #ifdef ENABLE_GSS
211
+ #endif /* ENABLE_GSS */
212
+
213
+
214
+
215
+ /*
216
+ * Streams -- wrapper around Unix socket system calls
217
+ *
218
+ *
219
+ * Stream functions are used for vanilla TCP connection protocol.
220
+ */
221
+
222
+
223
+ /*
224
+ * StreamServerPort -- open a "listening" port to accept connections.
225
+ *
226
+ * family should be AF_UNIX or AF_UNSPEC; portNumber is the port number.
227
+ * For AF_UNIX ports, hostName should be NULL and unixSocketDir must be
228
+ * specified. For TCP ports, hostName is either NULL for all interfaces or
229
+ * the interface to listen on, and unixSocketDir is ignored (can be NULL).
230
+ *
231
+ * Successfully opened sockets are added to the ListenSocket[] array (of
232
+ * length MaxListen), at the first position that isn't PGINVALID_SOCKET.
233
+ *
234
+ * RETURNS: STATUS_OK or STATUS_ERROR
235
+ */
236
+
237
+ #ifdef HAVE_UNIX_SOCKETS
238
+ #endif
239
+ #if !defined(WIN32) || defined(IPV6_V6ONLY)
240
+ #endif
241
+ #ifdef HAVE_UNIX_SOCKETS
242
+ #endif /* HAVE_UNIX_SOCKETS */
243
+ #ifdef HAVE_IPV6
244
+ #endif
245
+ #ifdef HAVE_UNIX_SOCKETS
246
+ #endif
247
+ #ifdef HAVE_UNIX_SOCKETS
248
+ #endif
249
+ #ifndef WIN32
250
+ #endif
251
+ #ifdef IPV6_V6ONLY
252
+ #endif
253
+ #ifdef HAVE_UNIX_SOCKETS
254
+ #endif
255
+ #ifdef HAVE_UNIX_SOCKETS
256
+ #endif
257
+
258
+
259
+ #ifdef HAVE_UNIX_SOCKETS
260
+
261
+ /*
262
+ * Lock_AF_UNIX -- configure unix socket file path
263
+ */
264
+
265
+
266
+
267
+ /*
268
+ * Setup_AF_UNIX -- configure unix socket permissions
269
+ */
270
+ #ifdef WIN32
271
+ #else
272
+ #endif
273
+ #endif /* HAVE_UNIX_SOCKETS */
274
+
275
+
276
+ /*
277
+ * StreamConnection -- create a new connection with client using
278
+ * server port. Set port->sock to the FD of the new connection.
279
+ *
280
+ * ASSUME: that this doesn't need to be non-blocking because
281
+ * the Postmaster uses select() to tell when the server master
282
+ * socket is ready for accept().
283
+ *
284
+ * RETURNS: STATUS_OK or STATUS_ERROR
285
+ */
286
+ #ifdef WIN32
287
+ #endif
288
+ #ifdef TCP_NODELAY
289
+ #endif
290
+ #ifdef WIN32
291
+ #endif
292
+
293
+ /*
294
+ * StreamClose -- close a client/backend connection
295
+ *
296
+ * NOTE: this is NOT used to terminate a session; it is just used to release
297
+ * the file descriptor in a process that should no longer have the socket
298
+ * open. (For example, the postmaster calls this after passing ownership
299
+ * of the connection to a child process.) It is expected that someone else
300
+ * still has the socket open. So, we only want to close the descriptor,
301
+ * we do NOT want to send anything to the far end.
302
+ */
303
+
304
+
305
+ /*
306
+ * TouchSocketFiles -- mark socket files as recently accessed
307
+ *
308
+ * This routine should be called every so often to ensure that the socket
309
+ * files have a recent mod date (ordinary operations on sockets usually won't
310
+ * change the mod date). That saves them from being removed by
311
+ * overenthusiastic /tmp-directory-cleaner daemons. (Another reason we should
312
+ * never have put the socket file in /tmp...)
313
+ */
314
+
315
+
316
+ /*
317
+ * RemoveSocketFiles -- unlink socket files at postmaster shutdown
318
+ */
319
+
320
+
321
+
322
+ /* --------------------------------
323
+ * Low-level I/O routines begin here.
324
+ *
325
+ * These routines communicate with a frontend client across a connection
326
+ * already established by the preceding routines.
327
+ * --------------------------------
328
+ */
329
+
330
+ /* --------------------------------
331
+ * socket_set_nonblocking - set socket blocking/non-blocking
332
+ *
333
+ * Sets the socket non-blocking if nonblocking is true, or sets it
334
+ * blocking otherwise.
335
+ * --------------------------------
336
+ */
337
+
338
+
339
+ /* --------------------------------
340
+ * pq_recvbuf - load some bytes into the input buffer
341
+ *
342
+ * returns 0 if OK, EOF if trouble
343
+ * --------------------------------
344
+ */
345
+
346
+
347
+ /* --------------------------------
348
+ * pq_getbyte - get a single byte from connection, or return EOF
349
+ * --------------------------------
350
+ */
351
+
352
+
353
+ /* --------------------------------
354
+ * pq_peekbyte - peek at next byte from connection
355
+ *
356
+ * Same as pq_getbyte() except we don't advance the pointer.
357
+ * --------------------------------
358
+ */
359
+
360
+
361
+ /* --------------------------------
362
+ * pq_getbyte_if_available - get a single byte from connection,
363
+ * if available
364
+ *
365
+ * The received byte is stored in *c. Returns 1 if a byte was read,
366
+ * 0 if no data was available, or EOF if trouble.
367
+ * --------------------------------
368
+ */
369
+
370
+
371
+ /* --------------------------------
372
+ * pq_getbytes - get a known number of bytes from connection
373
+ *
374
+ * returns 0 if OK, EOF if trouble
375
+ * --------------------------------
376
+ */
377
+
378
+
379
+ /* --------------------------------
380
+ * pq_discardbytes - throw away a known number of bytes
381
+ *
382
+ * same as pq_getbytes except we do not copy the data to anyplace.
383
+ * this is used for resynchronizing after read errors.
384
+ *
385
+ * returns 0 if OK, EOF if trouble
386
+ * --------------------------------
387
+ */
388
+
389
+
390
+ /* --------------------------------
391
+ * pq_getstring - get a null terminated string from connection
392
+ *
393
+ * The return value is placed in an expansible StringInfo, which has
394
+ * already been initialized by the caller.
395
+ *
396
+ * This is used only for dealing with old-protocol clients. The idea
397
+ * is to produce a StringInfo that looks the same as we would get from
398
+ * pq_getmessage() with a newer client; we will then process it with
399
+ * pq_getmsgstring. Therefore, no character set conversion is done here,
400
+ * even though this is presumably useful only for text.
401
+ *
402
+ * returns 0 if OK, EOF if trouble
403
+ * --------------------------------
404
+ */
405
+
406
+
407
+
408
+ /* --------------------------------
409
+ * pq_startmsgread - begin reading a message from the client.
410
+ *
411
+ * This must be called before any of the pq_get* functions.
412
+ * --------------------------------
413
+ */
414
+
415
+
416
+
417
+ /* --------------------------------
418
+ * pq_endmsgread - finish reading message.
419
+ *
420
+ * This must be called after reading a V2 protocol message with
421
+ * pq_getstring() and friends, to indicate that we have read the whole
422
+ * message. In V3 protocol, pq_getmessage() does this implicitly.
423
+ * --------------------------------
424
+ */
425
+
426
+
427
+ /* --------------------------------
428
+ * pq_is_reading_msg - are we currently reading a message?
429
+ *
430
+ * This is used in error recovery at the outer idle loop to detect if we have
431
+ * lost protocol sync, and need to terminate the connection. pq_startmsgread()
432
+ * will check for that too, but it's nicer to detect it earlier.
433
+ * --------------------------------
434
+ */
435
+
436
+
437
+ /* --------------------------------
438
+ * pq_getmessage - get a message with length word from connection
439
+ *
440
+ * The return value is placed in an expansible StringInfo, which has
441
+ * already been initialized by the caller.
442
+ * Only the message body is placed in the StringInfo; the length word
443
+ * is removed. Also, s->cursor is initialized to zero for convenience
444
+ * in scanning the message contents.
445
+ *
446
+ * If maxlen is not zero, it is an upper limit on the length of the
447
+ * message we are willing to accept. We abort the connection (by
448
+ * returning EOF) if client tries to send more than that.
449
+ *
450
+ * returns 0 if OK, EOF if trouble
451
+ * --------------------------------
452
+ */
453
+
454
+
455
+
456
+ /* --------------------------------
457
+ * pq_putbytes - send bytes to connection (not flushed until pq_flush)
458
+ *
459
+ * returns 0 if OK, EOF if trouble
460
+ * --------------------------------
461
+ */
462
+
463
+
464
+
465
+
466
+ /* --------------------------------
467
+ * socket_flush - flush pending output
468
+ *
469
+ * returns 0 if OK, EOF if trouble
470
+ * --------------------------------
471
+ */
472
+
473
+
474
+ /* --------------------------------
475
+ * internal_flush - flush pending output
476
+ *
477
+ * Returns 0 if OK (meaning everything was sent, or operation would block
478
+ * and the socket is in non-blocking mode), or EOF if trouble.
479
+ * --------------------------------
480
+ */
481
+
482
+
483
+ /* --------------------------------
484
+ * pq_flush_if_writable - flush pending output if writable without blocking
485
+ *
486
+ * Returns 0 if OK, or EOF if trouble.
487
+ * --------------------------------
488
+ */
489
+
490
+
491
+ /* --------------------------------
492
+ * socket_is_send_pending - is there any pending data in the output buffer?
493
+ * --------------------------------
494
+ */
495
+
496
+
497
+ /* --------------------------------
498
+ * Message-level I/O routines begin here.
499
+ *
500
+ * These routines understand about the old-style COPY OUT protocol.
501
+ * --------------------------------
502
+ */
503
+
504
+
505
+ /* --------------------------------
506
+ * socket_putmessage - send a normal message (suppressed in COPY OUT mode)
507
+ *
508
+ * If msgtype is not '\0', it is a message type code to place before
509
+ * the message body. If msgtype is '\0', then the message has no type
510
+ * code (this is only valid in pre-3.0 protocols).
511
+ *
512
+ * len is the length of the message body data at *s. In protocol 3.0
513
+ * and later, a message length word (equal to len+4 because it counts
514
+ * itself too) is inserted by this routine.
515
+ *
516
+ * All normal messages are suppressed while old-style COPY OUT is in
517
+ * progress. (In practice only a few notice messages might get emitted
518
+ * then; dropping them is annoying, but at least they will still appear
519
+ * in the postmaster log.)
520
+ *
521
+ * We also suppress messages generated while pqcomm.c is busy. This
522
+ * avoids any possibility of messages being inserted within other
523
+ * messages. The only known trouble case arises if SIGQUIT occurs
524
+ * during a pqcomm.c routine --- quickdie() will try to send a warning
525
+ * message, and the most reasonable approach seems to be to drop it.
526
+ *
527
+ * returns 0 if OK, EOF if trouble
528
+ * --------------------------------
529
+ */
530
+
531
+
532
+ /* --------------------------------
533
+ * pq_putmessage_noblock - like pq_putmessage, but never blocks
534
+ *
535
+ * If the output buffer is too small to hold the message, the buffer
536
+ * is enlarged.
537
+ */
538
+
539
+
540
+
541
+ /* --------------------------------
542
+ * socket_startcopyout - inform libpq that an old-style COPY OUT transfer
543
+ * is beginning
544
+ * --------------------------------
545
+ */
546
+
547
+
548
+ /* --------------------------------
549
+ * socket_endcopyout - end an old-style COPY OUT transfer
550
+ *
551
+ * If errorAbort is indicated, we are aborting a COPY OUT due to an error,
552
+ * and must send a terminator line. Since a partial data line might have
553
+ * been emitted, send a couple of newlines first (the first one could
554
+ * get absorbed by a backslash...) Note that old-style COPY OUT does
555
+ * not allow binary transfers, so a textual terminator is always correct.
556
+ * --------------------------------
557
+ */
558
+
559
+
560
+ /*
561
+ * Support for TCP Keepalive parameters
562
+ */
563
+
564
+ /*
565
+ * On Windows, we need to set both idle and interval at the same time.
566
+ * We also cannot reset them to the default (setting to zero will
567
+ * actually set them to zero, not default), therefore we fallback to
568
+ * the out-of-the-box default instead.
569
+ */
570
+ #if defined(WIN32) && defined(SIO_KEEPALIVE_VALS)
571
+ static int
572
+ pq_setkeepaliveswin32(Port *port, int idle, int interval)
573
+ {
574
+ struct tcp_keepalive ka;
575
+ DWORD retsize;
576
+
577
+ if (idle <= 0)
578
+ idle = 2 * 60 * 60; /* default = 2 hours */
579
+ if (interval <= 0)
580
+ interval = 1; /* default = 1 second */
581
+
582
+ ka.onoff = 1;
583
+ ka.keepalivetime = idle * 1000;
584
+ ka.keepaliveinterval = interval * 1000;
585
+
586
+ if (WSAIoctl(port->sock,
587
+ SIO_KEEPALIVE_VALS,
588
+ (LPVOID) &ka,
589
+ sizeof(ka),
590
+ NULL,
591
+ 0,
592
+ &retsize,
593
+ NULL,
594
+ NULL)
595
+ != 0)
596
+ {
597
+ elog(LOG, "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui",
598
+ WSAGetLastError());
599
+ return STATUS_ERROR;
600
+ }
601
+ if (port->keepalives_idle != idle)
602
+ port->keepalives_idle = idle;
603
+ if (port->keepalives_interval != interval)
604
+ port->keepalives_interval = interval;
605
+ return STATUS_OK;
606
+ }
607
+ #endif
608
+
609
+ #if defined(PG_TCP_KEEPALIVE_IDLE) || defined(SIO_KEEPALIVE_VALS)
610
+ #ifndef WIN32
611
+ #else /* WIN32 */
612
+ #endif /* WIN32 */
613
+ #else
614
+ #endif
615
+
616
+ #if defined(PG_TCP_KEEPALIVE_IDLE) || defined(SIO_KEEPALIVE_VALS)
617
+ #ifndef WIN32
618
+ #else /* WIN32 */
619
+ #endif
620
+ #else
621
+ #endif
622
+
623
+ #if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS)
624
+ #ifndef WIN32
625
+ #else
626
+ #endif /* WIN32 */
627
+ #else
628
+ #endif
629
+
630
+ #if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS)
631
+ #ifndef WIN32
632
+ #else /* WIN32 */
633
+ #endif
634
+ #else
635
+ #endif
636
+
637
+ #ifdef TCP_KEEPCNT
638
+ #else
639
+ #endif
640
+
641
+ #ifdef TCP_KEEPCNT
642
+ #else
643
+ #endif
644
+
645
+ #ifdef TCP_USER_TIMEOUT
646
+ #else
647
+ #endif
648
+
649
+ #ifdef TCP_USER_TIMEOUT
650
+ #else
651
+ #endif