gitlab-pg_query 1.3.1 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +217 -99
  3. data/README.md +92 -69
  4. data/Rakefile +85 -5
  5. data/ext/pg_query/extconf.rb +3 -40
  6. data/ext/pg_query/guc-file.c +0 -0
  7. data/ext/pg_query/include/access/amapi.h +246 -0
  8. data/ext/pg_query/include/access/attmap.h +52 -0
  9. data/ext/pg_query/include/access/attnum.h +64 -0
  10. data/ext/pg_query/include/access/clog.h +61 -0
  11. data/ext/pg_query/include/access/commit_ts.h +77 -0
  12. data/ext/pg_query/include/access/detoast.h +92 -0
  13. data/ext/pg_query/include/access/genam.h +228 -0
  14. data/ext/pg_query/include/access/gin.h +78 -0
  15. data/ext/pg_query/include/access/htup.h +89 -0
  16. data/ext/pg_query/include/access/htup_details.h +819 -0
  17. data/ext/pg_query/include/access/itup.h +161 -0
  18. data/ext/pg_query/include/access/parallel.h +82 -0
  19. data/ext/pg_query/include/access/printtup.h +35 -0
  20. data/ext/pg_query/include/access/relation.h +28 -0
  21. data/ext/pg_query/include/access/relscan.h +176 -0
  22. data/ext/pg_query/include/access/rmgr.h +35 -0
  23. data/ext/pg_query/include/access/rmgrlist.h +49 -0
  24. data/ext/pg_query/include/access/sdir.h +58 -0
  25. data/ext/pg_query/include/access/skey.h +151 -0
  26. data/ext/pg_query/include/access/stratnum.h +83 -0
  27. data/ext/pg_query/include/access/sysattr.h +29 -0
  28. data/ext/pg_query/include/access/table.h +27 -0
  29. data/ext/pg_query/include/access/tableam.h +1825 -0
  30. data/ext/pg_query/include/access/transam.h +265 -0
  31. data/ext/pg_query/include/access/tupconvert.h +51 -0
  32. data/ext/pg_query/include/access/tupdesc.h +154 -0
  33. data/ext/pg_query/include/access/tupmacs.h +247 -0
  34. data/ext/pg_query/include/access/twophase.h +61 -0
  35. data/ext/pg_query/include/access/xact.h +463 -0
  36. data/ext/pg_query/include/access/xlog.h +398 -0
  37. data/ext/pg_query/include/access/xlog_internal.h +330 -0
  38. data/ext/pg_query/include/access/xlogdefs.h +109 -0
  39. data/ext/pg_query/include/access/xloginsert.h +64 -0
  40. data/ext/pg_query/include/access/xlogreader.h +327 -0
  41. data/ext/pg_query/include/access/xlogrecord.h +227 -0
  42. data/ext/pg_query/include/bootstrap/bootstrap.h +62 -0
  43. data/ext/pg_query/include/c.h +1322 -0
  44. data/ext/pg_query/include/catalog/catalog.h +42 -0
  45. data/ext/pg_query/include/catalog/catversion.h +58 -0
  46. data/ext/pg_query/include/catalog/dependency.h +275 -0
  47. data/ext/pg_query/include/catalog/genbki.h +64 -0
  48. data/ext/pg_query/include/catalog/index.h +199 -0
  49. data/ext/pg_query/include/catalog/indexing.h +366 -0
  50. data/ext/pg_query/include/catalog/namespace.h +188 -0
  51. data/ext/pg_query/include/catalog/objectaccess.h +197 -0
  52. data/ext/pg_query/include/catalog/objectaddress.h +84 -0
  53. data/ext/pg_query/include/catalog/pg_aggregate.h +176 -0
  54. data/ext/pg_query/include/catalog/pg_aggregate_d.h +77 -0
  55. data/ext/pg_query/include/catalog/pg_am.h +60 -0
  56. data/ext/pg_query/include/catalog/pg_am_d.h +45 -0
  57. data/ext/pg_query/include/catalog/pg_attribute.h +204 -0
  58. data/ext/pg_query/include/catalog/pg_attribute_d.h +59 -0
  59. data/ext/pg_query/include/catalog/pg_authid.h +58 -0
  60. data/ext/pg_query/include/catalog/pg_authid_d.h +49 -0
  61. data/ext/pg_query/include/catalog/pg_class.h +200 -0
  62. data/ext/pg_query/include/catalog/pg_class_d.h +103 -0
  63. data/ext/pg_query/include/catalog/pg_collation.h +73 -0
  64. data/ext/pg_query/include/catalog/pg_collation_d.h +45 -0
  65. data/ext/pg_query/include/catalog/pg_constraint.h +247 -0
  66. data/ext/pg_query/include/catalog/pg_constraint_d.h +67 -0
  67. data/ext/pg_query/include/catalog/pg_control.h +250 -0
  68. data/ext/pg_query/include/catalog/pg_conversion.h +72 -0
  69. data/ext/pg_query/include/catalog/pg_conversion_d.h +35 -0
  70. data/ext/pg_query/include/catalog/pg_depend.h +73 -0
  71. data/ext/pg_query/include/catalog/pg_depend_d.h +34 -0
  72. data/ext/pg_query/include/catalog/pg_event_trigger.h +51 -0
  73. data/ext/pg_query/include/catalog/pg_event_trigger_d.h +34 -0
  74. data/ext/pg_query/include/catalog/pg_index.h +80 -0
  75. data/ext/pg_query/include/catalog/pg_index_d.h +56 -0
  76. data/ext/pg_query/include/catalog/pg_language.h +67 -0
  77. data/ext/pg_query/include/catalog/pg_language_d.h +39 -0
  78. data/ext/pg_query/include/catalog/pg_namespace.h +59 -0
  79. data/ext/pg_query/include/catalog/pg_namespace_d.h +34 -0
  80. data/ext/pg_query/include/catalog/pg_opclass.h +85 -0
  81. data/ext/pg_query/include/catalog/pg_opclass_d.h +49 -0
  82. data/ext/pg_query/include/catalog/pg_operator.h +102 -0
  83. data/ext/pg_query/include/catalog/pg_operator_d.h +106 -0
  84. data/ext/pg_query/include/catalog/pg_opfamily.h +60 -0
  85. data/ext/pg_query/include/catalog/pg_opfamily_d.h +47 -0
  86. data/ext/pg_query/include/catalog/pg_partitioned_table.h +63 -0
  87. data/ext/pg_query/include/catalog/pg_partitioned_table_d.h +35 -0
  88. data/ext/pg_query/include/catalog/pg_proc.h +211 -0
  89. data/ext/pg_query/include/catalog/pg_proc_d.h +99 -0
  90. data/ext/pg_query/include/catalog/pg_publication.h +115 -0
  91. data/ext/pg_query/include/catalog/pg_publication_d.h +36 -0
  92. data/ext/pg_query/include/catalog/pg_replication_origin.h +57 -0
  93. data/ext/pg_query/include/catalog/pg_replication_origin_d.h +29 -0
  94. data/ext/pg_query/include/catalog/pg_statistic.h +275 -0
  95. data/ext/pg_query/include/catalog/pg_statistic_d.h +194 -0
  96. data/ext/pg_query/include/catalog/pg_statistic_ext.h +74 -0
  97. data/ext/pg_query/include/catalog/pg_statistic_ext_d.h +40 -0
  98. data/ext/pg_query/include/catalog/pg_transform.h +45 -0
  99. data/ext/pg_query/include/catalog/pg_transform_d.h +32 -0
  100. data/ext/pg_query/include/catalog/pg_trigger.h +137 -0
  101. data/ext/pg_query/include/catalog/pg_trigger_d.h +106 -0
  102. data/ext/pg_query/include/catalog/pg_ts_config.h +50 -0
  103. data/ext/pg_query/include/catalog/pg_ts_config_d.h +32 -0
  104. data/ext/pg_query/include/catalog/pg_ts_dict.h +54 -0
  105. data/ext/pg_query/include/catalog/pg_ts_dict_d.h +33 -0
  106. data/ext/pg_query/include/catalog/pg_ts_parser.h +57 -0
  107. data/ext/pg_query/include/catalog/pg_ts_parser_d.h +35 -0
  108. data/ext/pg_query/include/catalog/pg_ts_template.h +48 -0
  109. data/ext/pg_query/include/catalog/pg_ts_template_d.h +32 -0
  110. data/ext/pg_query/include/catalog/pg_type.h +372 -0
  111. data/ext/pg_query/include/catalog/pg_type_d.h +285 -0
  112. data/ext/pg_query/include/catalog/storage.h +48 -0
  113. data/ext/pg_query/include/commands/async.h +54 -0
  114. data/ext/pg_query/include/commands/dbcommands.h +35 -0
  115. data/ext/pg_query/include/commands/defrem.h +173 -0
  116. data/ext/pg_query/include/commands/event_trigger.h +88 -0
  117. data/ext/pg_query/include/commands/explain.h +127 -0
  118. data/ext/pg_query/include/commands/prepare.h +61 -0
  119. data/ext/pg_query/include/commands/tablespace.h +67 -0
  120. data/ext/pg_query/include/commands/trigger.h +277 -0
  121. data/ext/pg_query/include/commands/user.h +37 -0
  122. data/ext/pg_query/include/commands/vacuum.h +293 -0
  123. data/ext/pg_query/include/commands/variable.h +38 -0
  124. data/ext/pg_query/include/common/file_perm.h +56 -0
  125. data/ext/pg_query/include/common/hashfn.h +104 -0
  126. data/ext/pg_query/include/common/ip.h +37 -0
  127. data/ext/pg_query/include/common/keywords.h +33 -0
  128. data/ext/pg_query/include/common/kwlookup.h +44 -0
  129. data/ext/pg_query/include/common/relpath.h +90 -0
  130. data/ext/pg_query/include/common/string.h +19 -0
  131. data/ext/pg_query/include/common/unicode_combining_table.h +196 -0
  132. data/ext/pg_query/include/datatype/timestamp.h +197 -0
  133. data/ext/pg_query/include/executor/execdesc.h +70 -0
  134. data/ext/pg_query/include/executor/executor.h +614 -0
  135. data/ext/pg_query/include/executor/functions.h +41 -0
  136. data/ext/pg_query/include/executor/instrument.h +101 -0
  137. data/ext/pg_query/include/executor/spi.h +175 -0
  138. data/ext/pg_query/include/executor/tablefunc.h +67 -0
  139. data/ext/pg_query/include/executor/tuptable.h +487 -0
  140. data/ext/pg_query/include/fmgr.h +775 -0
  141. data/ext/pg_query/include/funcapi.h +348 -0
  142. data/ext/pg_query/include/getaddrinfo.h +162 -0
  143. data/ext/pg_query/include/jit/jit.h +105 -0
  144. data/ext/pg_query/include/kwlist_d.h +1072 -0
  145. data/ext/pg_query/include/lib/ilist.h +727 -0
  146. data/ext/pg_query/include/lib/pairingheap.h +102 -0
  147. data/ext/pg_query/include/lib/simplehash.h +1059 -0
  148. data/ext/pg_query/include/lib/stringinfo.h +161 -0
  149. data/ext/pg_query/include/libpq/auth.h +29 -0
  150. data/ext/pg_query/include/libpq/crypt.h +46 -0
  151. data/ext/pg_query/include/libpq/hba.h +140 -0
  152. data/ext/pg_query/include/libpq/libpq-be.h +326 -0
  153. data/ext/pg_query/include/libpq/libpq.h +133 -0
  154. data/ext/pg_query/include/libpq/pqcomm.h +208 -0
  155. data/ext/pg_query/include/libpq/pqformat.h +210 -0
  156. data/ext/pg_query/include/libpq/pqsignal.h +42 -0
  157. data/ext/pg_query/include/mb/pg_wchar.h +672 -0
  158. data/ext/pg_query/include/mb/stringinfo_mb.h +24 -0
  159. data/ext/pg_query/include/miscadmin.h +476 -0
  160. data/ext/pg_query/include/nodes/bitmapset.h +122 -0
  161. data/ext/pg_query/include/nodes/execnodes.h +2520 -0
  162. data/ext/pg_query/include/nodes/extensible.h +160 -0
  163. data/ext/pg_query/include/nodes/lockoptions.h +61 -0
  164. data/ext/pg_query/include/nodes/makefuncs.h +108 -0
  165. data/ext/pg_query/include/nodes/memnodes.h +108 -0
  166. data/ext/pg_query/include/nodes/nodeFuncs.h +162 -0
  167. data/ext/pg_query/include/nodes/nodes.h +842 -0
  168. data/ext/pg_query/include/nodes/params.h +170 -0
  169. data/ext/pg_query/include/nodes/parsenodes.h +3579 -0
  170. data/ext/pg_query/include/nodes/pathnodes.h +2556 -0
  171. data/ext/pg_query/include/nodes/pg_list.h +605 -0
  172. data/ext/pg_query/include/nodes/plannodes.h +1251 -0
  173. data/ext/pg_query/include/nodes/primnodes.h +1541 -0
  174. data/ext/pg_query/include/nodes/print.h +34 -0
  175. data/ext/pg_query/include/nodes/tidbitmap.h +75 -0
  176. data/ext/pg_query/include/nodes/value.h +61 -0
  177. data/ext/pg_query/include/optimizer/cost.h +206 -0
  178. data/ext/pg_query/include/optimizer/geqo.h +88 -0
  179. data/ext/pg_query/include/optimizer/geqo_gene.h +45 -0
  180. data/ext/pg_query/include/optimizer/optimizer.h +199 -0
  181. data/ext/pg_query/include/optimizer/paths.h +249 -0
  182. data/ext/pg_query/include/optimizer/planmain.h +119 -0
  183. data/ext/pg_query/include/parser/analyze.h +49 -0
  184. data/ext/pg_query/include/parser/gram.h +1067 -0
  185. data/ext/pg_query/include/parser/gramparse.h +75 -0
  186. data/ext/pg_query/include/parser/kwlist.h +477 -0
  187. data/ext/pg_query/include/parser/parse_agg.h +68 -0
  188. data/ext/pg_query/include/parser/parse_clause.h +54 -0
  189. data/ext/pg_query/include/parser/parse_coerce.h +97 -0
  190. data/ext/pg_query/include/parser/parse_collate.h +27 -0
  191. data/ext/pg_query/include/parser/parse_expr.h +26 -0
  192. data/ext/pg_query/include/parser/parse_func.h +73 -0
  193. data/ext/pg_query/include/parser/parse_node.h +327 -0
  194. data/ext/pg_query/include/parser/parse_oper.h +67 -0
  195. data/ext/pg_query/include/parser/parse_relation.h +123 -0
  196. data/ext/pg_query/include/parser/parse_target.h +46 -0
  197. data/ext/pg_query/include/parser/parse_type.h +60 -0
  198. data/ext/pg_query/include/parser/parser.h +41 -0
  199. data/ext/pg_query/include/parser/parsetree.h +61 -0
  200. data/ext/pg_query/include/parser/scanner.h +152 -0
  201. data/ext/pg_query/include/parser/scansup.h +30 -0
  202. data/ext/pg_query/include/partitioning/partdefs.h +26 -0
  203. data/ext/pg_query/include/pg_config.h +989 -0
  204. data/ext/pg_query/include/pg_config_ext.h +8 -0
  205. data/ext/pg_query/include/pg_config_manual.h +350 -0
  206. data/ext/pg_query/include/pg_config_os.h +8 -0
  207. data/ext/pg_query/include/pg_getopt.h +56 -0
  208. data/ext/pg_query/include/pg_query.h +121 -0
  209. data/ext/pg_query/include/pg_query_enum_defs.c +2454 -0
  210. data/ext/pg_query/include/pg_query_fingerprint_conds.c +875 -0
  211. data/ext/pg_query/include/pg_query_fingerprint_defs.c +12413 -0
  212. data/ext/pg_query/include/pg_query_json_helper.c +61 -0
  213. data/ext/pg_query/include/pg_query_outfuncs_conds.c +686 -0
  214. data/ext/pg_query/include/pg_query_outfuncs_defs.c +2437 -0
  215. data/ext/pg_query/include/pg_query_readfuncs_conds.c +222 -0
  216. data/ext/pg_query/include/pg_query_readfuncs_defs.c +2878 -0
  217. data/ext/pg_query/include/pg_trace.h +17 -0
  218. data/ext/pg_query/include/pgstat.h +1487 -0
  219. data/ext/pg_query/include/pgtime.h +84 -0
  220. data/ext/pg_query/include/pl_gram.h +385 -0
  221. data/ext/pg_query/include/pl_reserved_kwlist.h +52 -0
  222. data/ext/pg_query/include/pl_reserved_kwlist_d.h +114 -0
  223. data/ext/pg_query/include/pl_unreserved_kwlist.h +112 -0
  224. data/ext/pg_query/include/pl_unreserved_kwlist_d.h +246 -0
  225. data/ext/pg_query/include/plerrcodes.h +990 -0
  226. data/ext/pg_query/include/plpgsql.h +1347 -0
  227. data/ext/pg_query/include/port.h +524 -0
  228. data/ext/pg_query/include/port/atomics.h +524 -0
  229. data/ext/pg_query/include/port/atomics/arch-arm.h +26 -0
  230. data/ext/pg_query/include/port/atomics/arch-ppc.h +254 -0
  231. data/ext/pg_query/include/port/atomics/arch-x86.h +252 -0
  232. data/ext/pg_query/include/port/atomics/fallback.h +170 -0
  233. data/ext/pg_query/include/port/atomics/generic-gcc.h +286 -0
  234. data/ext/pg_query/include/port/atomics/generic.h +401 -0
  235. data/ext/pg_query/include/port/pg_bitutils.h +226 -0
  236. data/ext/pg_query/include/port/pg_bswap.h +161 -0
  237. data/ext/pg_query/include/port/pg_crc32c.h +101 -0
  238. data/ext/pg_query/include/portability/instr_time.h +256 -0
  239. data/ext/pg_query/include/postgres.h +764 -0
  240. data/ext/pg_query/include/postgres_ext.h +74 -0
  241. data/ext/pg_query/include/postmaster/autovacuum.h +83 -0
  242. data/ext/pg_query/include/postmaster/bgworker.h +161 -0
  243. data/ext/pg_query/include/postmaster/bgworker_internals.h +64 -0
  244. data/ext/pg_query/include/postmaster/bgwriter.h +45 -0
  245. data/ext/pg_query/include/postmaster/fork_process.h +17 -0
  246. data/ext/pg_query/include/postmaster/interrupt.h +32 -0
  247. data/ext/pg_query/include/postmaster/pgarch.h +39 -0
  248. data/ext/pg_query/include/postmaster/postmaster.h +77 -0
  249. data/ext/pg_query/include/postmaster/syslogger.h +98 -0
  250. data/ext/pg_query/include/postmaster/walwriter.h +21 -0
  251. data/ext/pg_query/include/protobuf-c.h +1106 -0
  252. data/ext/pg_query/include/protobuf-c/protobuf-c.h +1106 -0
  253. data/ext/pg_query/include/protobuf/pg_query.pb-c.h +10846 -0
  254. data/ext/pg_query/include/protobuf/pg_query.pb.h +124718 -0
  255. data/ext/pg_query/include/regex/regex.h +184 -0
  256. data/ext/pg_query/include/replication/logicallauncher.h +31 -0
  257. data/ext/pg_query/include/replication/logicalproto.h +110 -0
  258. data/ext/pg_query/include/replication/logicalworker.h +19 -0
  259. data/ext/pg_query/include/replication/origin.h +73 -0
  260. data/ext/pg_query/include/replication/reorderbuffer.h +467 -0
  261. data/ext/pg_query/include/replication/slot.h +219 -0
  262. data/ext/pg_query/include/replication/syncrep.h +115 -0
  263. data/ext/pg_query/include/replication/walreceiver.h +340 -0
  264. data/ext/pg_query/include/replication/walsender.h +74 -0
  265. data/ext/pg_query/include/rewrite/prs2lock.h +46 -0
  266. data/ext/pg_query/include/rewrite/rewriteHandler.h +40 -0
  267. data/ext/pg_query/include/rewrite/rewriteManip.h +87 -0
  268. data/ext/pg_query/include/rewrite/rewriteSupport.h +26 -0
  269. data/ext/pg_query/include/storage/backendid.h +37 -0
  270. data/ext/pg_query/include/storage/block.h +121 -0
  271. data/ext/pg_query/include/storage/buf.h +46 -0
  272. data/ext/pg_query/include/storage/bufmgr.h +292 -0
  273. data/ext/pg_query/include/storage/bufpage.h +459 -0
  274. data/ext/pg_query/include/storage/condition_variable.h +62 -0
  275. data/ext/pg_query/include/storage/dsm.h +61 -0
  276. data/ext/pg_query/include/storage/dsm_impl.h +75 -0
  277. data/ext/pg_query/include/storage/fd.h +168 -0
  278. data/ext/pg_query/include/storage/ipc.h +81 -0
  279. data/ext/pg_query/include/storage/item.h +19 -0
  280. data/ext/pg_query/include/storage/itemid.h +184 -0
  281. data/ext/pg_query/include/storage/itemptr.h +206 -0
  282. data/ext/pg_query/include/storage/large_object.h +100 -0
  283. data/ext/pg_query/include/storage/latch.h +190 -0
  284. data/ext/pg_query/include/storage/lmgr.h +114 -0
  285. data/ext/pg_query/include/storage/lock.h +612 -0
  286. data/ext/pg_query/include/storage/lockdefs.h +59 -0
  287. data/ext/pg_query/include/storage/lwlock.h +232 -0
  288. data/ext/pg_query/include/storage/lwlocknames.h +51 -0
  289. data/ext/pg_query/include/storage/off.h +57 -0
  290. data/ext/pg_query/include/storage/pg_sema.h +61 -0
  291. data/ext/pg_query/include/storage/pg_shmem.h +90 -0
  292. data/ext/pg_query/include/storage/pmsignal.h +94 -0
  293. data/ext/pg_query/include/storage/predicate.h +87 -0
  294. data/ext/pg_query/include/storage/proc.h +333 -0
  295. data/ext/pg_query/include/storage/proclist_types.h +51 -0
  296. data/ext/pg_query/include/storage/procsignal.h +75 -0
  297. data/ext/pg_query/include/storage/relfilenode.h +99 -0
  298. data/ext/pg_query/include/storage/s_lock.h +1047 -0
  299. data/ext/pg_query/include/storage/sharedfileset.h +45 -0
  300. data/ext/pg_query/include/storage/shm_mq.h +85 -0
  301. data/ext/pg_query/include/storage/shm_toc.h +58 -0
  302. data/ext/pg_query/include/storage/shmem.h +81 -0
  303. data/ext/pg_query/include/storage/sinval.h +153 -0
  304. data/ext/pg_query/include/storage/sinvaladt.h +43 -0
  305. data/ext/pg_query/include/storage/smgr.h +109 -0
  306. data/ext/pg_query/include/storage/spin.h +77 -0
  307. data/ext/pg_query/include/storage/standby.h +91 -0
  308. data/ext/pg_query/include/storage/standbydefs.h +74 -0
  309. data/ext/pg_query/include/storage/sync.h +62 -0
  310. data/ext/pg_query/include/tcop/cmdtag.h +58 -0
  311. data/ext/pg_query/include/tcop/cmdtaglist.h +217 -0
  312. data/ext/pg_query/include/tcop/deparse_utility.h +108 -0
  313. data/ext/pg_query/include/tcop/dest.h +149 -0
  314. data/ext/pg_query/include/tcop/fastpath.h +21 -0
  315. data/ext/pg_query/include/tcop/pquery.h +45 -0
  316. data/ext/pg_query/include/tcop/tcopprot.h +89 -0
  317. data/ext/pg_query/include/tcop/utility.h +108 -0
  318. data/ext/pg_query/include/tsearch/ts_cache.h +98 -0
  319. data/ext/pg_query/include/utils/acl.h +312 -0
  320. data/ext/pg_query/include/utils/aclchk_internal.h +45 -0
  321. data/ext/pg_query/include/utils/array.h +458 -0
  322. data/ext/pg_query/include/utils/builtins.h +127 -0
  323. data/ext/pg_query/include/utils/bytea.h +27 -0
  324. data/ext/pg_query/include/utils/catcache.h +231 -0
  325. data/ext/pg_query/include/utils/date.h +90 -0
  326. data/ext/pg_query/include/utils/datetime.h +343 -0
  327. data/ext/pg_query/include/utils/datum.h +68 -0
  328. data/ext/pg_query/include/utils/dsa.h +123 -0
  329. data/ext/pg_query/include/utils/dynahash.h +19 -0
  330. data/ext/pg_query/include/utils/elog.h +439 -0
  331. data/ext/pg_query/include/utils/errcodes.h +352 -0
  332. data/ext/pg_query/include/utils/expandeddatum.h +159 -0
  333. data/ext/pg_query/include/utils/expandedrecord.h +231 -0
  334. data/ext/pg_query/include/utils/float.h +356 -0
  335. data/ext/pg_query/include/utils/fmgroids.h +2657 -0
  336. data/ext/pg_query/include/utils/fmgrprotos.h +2646 -0
  337. data/ext/pg_query/include/utils/fmgrtab.h +48 -0
  338. data/ext/pg_query/include/utils/guc.h +443 -0
  339. data/ext/pg_query/include/utils/guc_tables.h +272 -0
  340. data/ext/pg_query/include/utils/hsearch.h +149 -0
  341. data/ext/pg_query/include/utils/inval.h +64 -0
  342. data/ext/pg_query/include/utils/lsyscache.h +197 -0
  343. data/ext/pg_query/include/utils/memdebug.h +82 -0
  344. data/ext/pg_query/include/utils/memutils.h +225 -0
  345. data/ext/pg_query/include/utils/numeric.h +76 -0
  346. data/ext/pg_query/include/utils/palloc.h +136 -0
  347. data/ext/pg_query/include/utils/partcache.h +102 -0
  348. data/ext/pg_query/include/utils/pg_locale.h +119 -0
  349. data/ext/pg_query/include/utils/pg_lsn.h +29 -0
  350. data/ext/pg_query/include/utils/pidfile.h +56 -0
  351. data/ext/pg_query/include/utils/plancache.h +235 -0
  352. data/ext/pg_query/include/utils/portal.h +241 -0
  353. data/ext/pg_query/include/utils/probes.h +114 -0
  354. data/ext/pg_query/include/utils/ps_status.h +25 -0
  355. data/ext/pg_query/include/utils/queryenvironment.h +74 -0
  356. data/ext/pg_query/include/utils/regproc.h +28 -0
  357. data/ext/pg_query/include/utils/rel.h +644 -0
  358. data/ext/pg_query/include/utils/relcache.h +151 -0
  359. data/ext/pg_query/include/utils/reltrigger.h +81 -0
  360. data/ext/pg_query/include/utils/resowner.h +86 -0
  361. data/ext/pg_query/include/utils/rls.h +50 -0
  362. data/ext/pg_query/include/utils/ruleutils.h +44 -0
  363. data/ext/pg_query/include/utils/sharedtuplestore.h +61 -0
  364. data/ext/pg_query/include/utils/snapmgr.h +158 -0
  365. data/ext/pg_query/include/utils/snapshot.h +206 -0
  366. data/ext/pg_query/include/utils/sortsupport.h +276 -0
  367. data/ext/pg_query/include/utils/syscache.h +219 -0
  368. data/ext/pg_query/include/utils/timeout.h +88 -0
  369. data/ext/pg_query/include/utils/timestamp.h +116 -0
  370. data/ext/pg_query/include/utils/tuplesort.h +277 -0
  371. data/ext/pg_query/include/utils/tuplestore.h +91 -0
  372. data/ext/pg_query/include/utils/typcache.h +202 -0
  373. data/ext/pg_query/include/utils/tzparser.h +39 -0
  374. data/ext/pg_query/include/utils/varlena.h +39 -0
  375. data/ext/pg_query/include/utils/xml.h +84 -0
  376. data/ext/pg_query/include/xxhash.h +5445 -0
  377. data/ext/pg_query/include/xxhash/xxhash.h +5445 -0
  378. data/ext/pg_query/pg_query.c +104 -0
  379. data/ext/pg_query/pg_query.pb-c.c +37628 -0
  380. data/ext/pg_query/pg_query_deparse.c +9959 -0
  381. data/ext/pg_query/pg_query_fingerprint.c +295 -0
  382. data/ext/pg_query/pg_query_fingerprint.h +8 -0
  383. data/ext/pg_query/pg_query_internal.h +24 -0
  384. data/ext/pg_query/pg_query_json_plpgsql.c +738 -0
  385. data/ext/pg_query/pg_query_json_plpgsql.h +9 -0
  386. data/ext/pg_query/pg_query_normalize.c +439 -0
  387. data/ext/pg_query/pg_query_outfuncs.h +10 -0
  388. data/ext/pg_query/pg_query_outfuncs_json.c +297 -0
  389. data/ext/pg_query/pg_query_outfuncs_protobuf.c +237 -0
  390. data/ext/pg_query/pg_query_parse.c +148 -0
  391. data/ext/pg_query/pg_query_parse_plpgsql.c +460 -0
  392. data/ext/pg_query/pg_query_readfuncs.h +11 -0
  393. data/ext/pg_query/pg_query_readfuncs_protobuf.c +142 -0
  394. data/ext/pg_query/pg_query_ruby.c +108 -12
  395. data/ext/pg_query/pg_query_scan.c +173 -0
  396. data/ext/pg_query/pg_query_split.c +221 -0
  397. data/ext/pg_query/protobuf-c.c +3660 -0
  398. data/ext/pg_query/src_backend_catalog_namespace.c +1051 -0
  399. data/ext/pg_query/src_backend_catalog_pg_proc.c +142 -0
  400. data/ext/pg_query/src_backend_commands_define.c +117 -0
  401. data/ext/pg_query/src_backend_libpq_pqcomm.c +651 -0
  402. data/ext/pg_query/src_backend_nodes_bitmapset.c +513 -0
  403. data/ext/pg_query/src_backend_nodes_copyfuncs.c +6013 -0
  404. data/ext/pg_query/src_backend_nodes_equalfuncs.c +4003 -0
  405. data/ext/pg_query/src_backend_nodes_extensible.c +99 -0
  406. data/ext/pg_query/src_backend_nodes_list.c +922 -0
  407. data/ext/pg_query/src_backend_nodes_makefuncs.c +417 -0
  408. data/ext/pg_query/src_backend_nodes_nodeFuncs.c +1363 -0
  409. data/ext/pg_query/src_backend_nodes_value.c +84 -0
  410. data/ext/pg_query/src_backend_parser_gram.c +47456 -0
  411. data/ext/pg_query/src_backend_parser_parse_expr.c +313 -0
  412. data/ext/pg_query/src_backend_parser_parser.c +497 -0
  413. data/ext/pg_query/src_backend_parser_scan.c +7091 -0
  414. data/ext/pg_query/src_backend_parser_scansup.c +160 -0
  415. data/ext/pg_query/src_backend_postmaster_postmaster.c +2230 -0
  416. data/ext/pg_query/src_backend_storage_ipc_ipc.c +192 -0
  417. data/ext/pg_query/src_backend_storage_lmgr_s_lock.c +370 -0
  418. data/ext/pg_query/src_backend_tcop_postgres.c +776 -0
  419. data/ext/pg_query/src_backend_utils_adt_datum.c +326 -0
  420. data/ext/pg_query/src_backend_utils_adt_expandeddatum.c +98 -0
  421. data/ext/pg_query/src_backend_utils_adt_format_type.c +136 -0
  422. data/ext/pg_query/src_backend_utils_adt_ruleutils.c +1683 -0
  423. data/ext/pg_query/src_backend_utils_error_assert.c +74 -0
  424. data/ext/pg_query/src_backend_utils_error_elog.c +1748 -0
  425. data/ext/pg_query/src_backend_utils_fmgr_fmgr.c +570 -0
  426. data/ext/pg_query/src_backend_utils_hash_dynahash.c +1086 -0
  427. data/ext/pg_query/src_backend_utils_init_globals.c +168 -0
  428. data/ext/pg_query/src_backend_utils_mb_mbutils.c +839 -0
  429. data/ext/pg_query/src_backend_utils_misc_guc.c +1831 -0
  430. data/ext/pg_query/src_backend_utils_mmgr_aset.c +1560 -0
  431. data/ext/pg_query/src_backend_utils_mmgr_mcxt.c +1006 -0
  432. data/ext/pg_query/src_common_encnames.c +158 -0
  433. data/ext/pg_query/src_common_keywords.c +39 -0
  434. data/ext/pg_query/src_common_kwlist_d.h +1081 -0
  435. data/ext/pg_query/src_common_kwlookup.c +91 -0
  436. data/ext/pg_query/src_common_psprintf.c +158 -0
  437. data/ext/pg_query/src_common_string.c +86 -0
  438. data/ext/pg_query/src_common_stringinfo.c +336 -0
  439. data/ext/pg_query/src_common_wchar.c +1651 -0
  440. data/ext/pg_query/src_pl_plpgsql_src_pl_comp.c +1133 -0
  441. data/ext/pg_query/src_pl_plpgsql_src_pl_funcs.c +877 -0
  442. data/ext/pg_query/src_pl_plpgsql_src_pl_gram.c +6533 -0
  443. data/ext/pg_query/src_pl_plpgsql_src_pl_handler.c +107 -0
  444. data/ext/pg_query/src_pl_plpgsql_src_pl_reserved_kwlist_d.h +123 -0
  445. data/ext/pg_query/src_pl_plpgsql_src_pl_scanner.c +671 -0
  446. data/ext/pg_query/src_pl_plpgsql_src_pl_unreserved_kwlist_d.h +255 -0
  447. data/ext/pg_query/src_port_erand48.c +127 -0
  448. data/ext/pg_query/src_port_pg_bitutils.c +246 -0
  449. data/ext/pg_query/src_port_pgsleep.c +69 -0
  450. data/ext/pg_query/src_port_pgstrcasecmp.c +83 -0
  451. data/ext/pg_query/src_port_qsort.c +240 -0
  452. data/ext/pg_query/src_port_random.c +31 -0
  453. data/ext/pg_query/src_port_snprintf.c +1449 -0
  454. data/ext/pg_query/src_port_strerror.c +324 -0
  455. data/ext/pg_query/src_port_strnlen.c +39 -0
  456. data/ext/pg_query/xxhash.c +43 -0
  457. data/lib/pg_query.rb +7 -4
  458. data/lib/pg_query/constants.rb +21 -0
  459. data/lib/pg_query/deparse.rb +15 -1581
  460. data/lib/pg_query/filter_columns.rb +88 -85
  461. data/lib/pg_query/fingerprint.rb +122 -87
  462. data/lib/pg_query/json_field_names.rb +1402 -0
  463. data/lib/pg_query/node.rb +31 -0
  464. data/lib/pg_query/param_refs.rb +42 -37
  465. data/lib/pg_query/parse.rb +220 -203
  466. data/lib/pg_query/parse_error.rb +1 -1
  467. data/lib/pg_query/pg_query_pb.rb +3211 -0
  468. data/lib/pg_query/scan.rb +23 -0
  469. data/lib/pg_query/treewalker.rb +24 -40
  470. data/lib/pg_query/truncate.rb +71 -42
  471. data/lib/pg_query/version.rb +2 -2
  472. metadata +472 -11
  473. data/ext/pg_query/pg_query_ruby.h +0 -10
  474. data/lib/pg_query/deep_dup.rb +0 -16
  475. data/lib/pg_query/deparse/alter_table.rb +0 -42
  476. data/lib/pg_query/deparse/interval.rb +0 -105
  477. data/lib/pg_query/deparse/keywords.rb +0 -159
  478. data/lib/pg_query/deparse/rename.rb +0 -41
  479. data/lib/pg_query/legacy_parsetree.rb +0 -109
  480. data/lib/pg_query/node_types.rb +0 -296
@@ -0,0 +1,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