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,313 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - operator_precedence_warning
4
+ *--------------------------------------------------------------------
5
+ */
6
+
7
+ /*-------------------------------------------------------------------------
8
+ *
9
+ * parse_expr.c
10
+ * handle expressions in parser
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/parser/parse_expr.c
18
+ *
19
+ *-------------------------------------------------------------------------
20
+ */
21
+
22
+ #include "postgres.h"
23
+
24
+ #include "catalog/pg_type.h"
25
+ #include "commands/dbcommands.h"
26
+ #include "miscadmin.h"
27
+ #include "nodes/makefuncs.h"
28
+ #include "nodes/nodeFuncs.h"
29
+ #include "optimizer/optimizer.h"
30
+ #include "parser/analyze.h"
31
+ #include "parser/parse_agg.h"
32
+ #include "parser/parse_clause.h"
33
+ #include "parser/parse_coerce.h"
34
+ #include "parser/parse_collate.h"
35
+ #include "parser/parse_expr.h"
36
+ #include "parser/parse_func.h"
37
+ #include "parser/parse_oper.h"
38
+ #include "parser/parse_relation.h"
39
+ #include "parser/parse_target.h"
40
+ #include "parser/parse_type.h"
41
+ #include "utils/builtins.h"
42
+ #include "utils/date.h"
43
+ #include "utils/lsyscache.h"
44
+ #include "utils/timestamp.h"
45
+ #include "utils/xml.h"
46
+
47
+ /* GUC parameters */
48
+ __thread bool operator_precedence_warning = false;
49
+
50
+
51
+
52
+ /*
53
+ * Node-type groups for operator precedence warnings
54
+ * We use zero for everything not otherwise classified
55
+ */
56
+ #define PREC_GROUP_POSTFIX_IS 1 /* postfix IS tests (NullTest, etc) */
57
+ #define PREC_GROUP_INFIX_IS 2 /* infix IS (IS DISTINCT FROM, etc) */
58
+ #define PREC_GROUP_LESS 3 /* < > */
59
+ #define PREC_GROUP_EQUAL 4 /* = */
60
+ #define PREC_GROUP_LESS_EQUAL 5 /* <= >= <> */
61
+ #define PREC_GROUP_LIKE 6 /* LIKE ILIKE SIMILAR */
62
+ #define PREC_GROUP_BETWEEN 7 /* BETWEEN */
63
+ #define PREC_GROUP_IN 8 /* IN */
64
+ #define PREC_GROUP_NOT_LIKE 9 /* NOT LIKE/ILIKE/SIMILAR */
65
+ #define PREC_GROUP_NOT_BETWEEN 10 /* NOT BETWEEN */
66
+ #define PREC_GROUP_NOT_IN 11 /* NOT IN */
67
+ #define PREC_GROUP_POSTFIX_OP 12 /* generic postfix operators */
68
+ #define PREC_GROUP_INFIX_OP 13 /* generic infix operators */
69
+ #define PREC_GROUP_PREFIX_OP 14 /* generic prefix operators */
70
+
71
+ /*
72
+ * Map precedence groupings to old precedence ordering
73
+ *
74
+ * Old precedence order:
75
+ * 1. NOT
76
+ * 2. =
77
+ * 3. < >
78
+ * 4. LIKE ILIKE SIMILAR
79
+ * 5. BETWEEN
80
+ * 6. IN
81
+ * 7. generic postfix Op
82
+ * 8. generic Op, including <= => <>
83
+ * 9. generic prefix Op
84
+ * 10. IS tests (NullTest, BooleanTest, etc)
85
+ *
86
+ * NOT BETWEEN etc map to BETWEEN etc when considered as being on the left,
87
+ * but to NOT when considered as being on the right, because of the buggy
88
+ * precedence handling of those productions in the old grammar.
89
+ */
90
+
91
+
92
+
93
+ static Node *transformExprRecurse(ParseState *pstate, Node *expr);
94
+ static Node *transformParamRef(ParseState *pstate, ParamRef *pref);
95
+ static Node *transformAExprOp(ParseState *pstate, A_Expr *a);
96
+ static Node *transformAExprOpAny(ParseState *pstate, A_Expr *a);
97
+ static Node *transformAExprOpAll(ParseState *pstate, A_Expr *a);
98
+ static Node *transformAExprDistinct(ParseState *pstate, A_Expr *a);
99
+ static Node *transformAExprNullIf(ParseState *pstate, A_Expr *a);
100
+ static Node *transformAExprOf(ParseState *pstate, A_Expr *a);
101
+ static Node *transformAExprIn(ParseState *pstate, A_Expr *a);
102
+ static Node *transformAExprBetween(ParseState *pstate, A_Expr *a);
103
+ static Node *transformBoolExpr(ParseState *pstate, BoolExpr *a);
104
+ static Node *transformFuncCall(ParseState *pstate, FuncCall *fn);
105
+ static Node *transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref);
106
+ static Node *transformCaseExpr(ParseState *pstate, CaseExpr *c);
107
+ static Node *transformSubLink(ParseState *pstate, SubLink *sublink);
108
+ static Node *transformArrayExpr(ParseState *pstate, A_ArrayExpr *a,
109
+ Oid array_type, Oid element_type, int32 typmod);
110
+ static Node *transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault);
111
+ static Node *transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c);
112
+ static Node *transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m);
113
+ static Node *transformSQLValueFunction(ParseState *pstate,
114
+ SQLValueFunction *svf);
115
+ static Node *transformXmlExpr(ParseState *pstate, XmlExpr *x);
116
+ static Node *transformXmlSerialize(ParseState *pstate, XmlSerialize *xs);
117
+ static Node *transformBooleanTest(ParseState *pstate, BooleanTest *b);
118
+ static Node *transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr);
119
+ static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref);
120
+ static Node *transformWholeRowRef(ParseState *pstate,
121
+ ParseNamespaceItem *nsitem,
122
+ int sublevels_up, int location);
123
+ static Node *transformIndirection(ParseState *pstate, A_Indirection *ind);
124
+ static Node *transformTypeCast(ParseState *pstate, TypeCast *tc);
125
+ static Node *transformCollateClause(ParseState *pstate, CollateClause *c);
126
+ static Node *make_row_comparison_op(ParseState *pstate, List *opname,
127
+ List *largs, List *rargs, int location);
128
+ static Node *make_row_distinct_op(ParseState *pstate, List *opname,
129
+ RowExpr *lrow, RowExpr *rrow, int location);
130
+ static Expr *make_distinct_op(ParseState *pstate, List *opname,
131
+ Node *ltree, Node *rtree, int location);
132
+ static Node *make_nulltest_from_distinct(ParseState *pstate,
133
+ A_Expr *distincta, Node *arg);
134
+ static int operator_precedence_group(Node *node, const char **nodename);
135
+ static void emit_precedence_warnings(ParseState *pstate,
136
+ int opgroup, const char *opname,
137
+ Node *lchild, Node *rchild,
138
+ int location);
139
+
140
+
141
+ /*
142
+ * transformExpr -
143
+ * Analyze and transform expressions. Type checking and type casting is
144
+ * done here. This processing converts the raw grammar output into
145
+ * expression trees with fully determined semantics.
146
+ */
147
+
148
+
149
+
150
+
151
+ /*
152
+ * helper routine for delivering "column does not exist" error message
153
+ *
154
+ * (Usually we don't have to work this hard, but the general case of field
155
+ * selection from an arbitrary node needs it.)
156
+ */
157
+
158
+
159
+
160
+
161
+ /*
162
+ * Transform a ColumnRef.
163
+ *
164
+ * If you find yourself changing this code, see also ExpandColumnRefStar.
165
+ */
166
+
167
+
168
+
169
+
170
+ /* Test whether an a_expr is a plain NULL constant or not */
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+ /*
184
+ * Checking an expression for match to a list of type names. Will result
185
+ * in a boolean constant node.
186
+ */
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+ /*
204
+ * transformArrayExpr
205
+ *
206
+ * If the caller specifies the target type, the resulting array will
207
+ * be of exactly that type. Otherwise we try to infer a common type
208
+ * for the elements using select_common_type().
209
+ */
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+ /*
229
+ * Construct a whole-row reference to represent the notation "relation.*".
230
+ */
231
+
232
+
233
+ /*
234
+ * Handle an explicit CAST construct.
235
+ *
236
+ * Transform the argument, look up the type name, and apply any necessary
237
+ * coercion function(s).
238
+ */
239
+
240
+
241
+ /*
242
+ * Handle an explicit COLLATE clause.
243
+ *
244
+ * Transform the argument, and look up the collation name.
245
+ */
246
+
247
+
248
+ /*
249
+ * Transform a "row compare-op row" construct
250
+ *
251
+ * The inputs are lists of already-transformed expressions.
252
+ * As with coerce_type, pstate may be NULL if no special unknown-Param
253
+ * processing is wanted.
254
+ *
255
+ * The output may be a single OpExpr, an AND or OR combination of OpExprs,
256
+ * or a RowCompareExpr. In all cases it is guaranteed to return boolean.
257
+ * The AND, OR, and RowCompareExpr cases further imply things about the
258
+ * behavior of the operators (ie, they behave as =, <>, or < <= > >=).
259
+ */
260
+
261
+
262
+ /*
263
+ * Transform a "row IS DISTINCT FROM row" construct
264
+ *
265
+ * The input RowExprs are already transformed
266
+ */
267
+
268
+
269
+ /*
270
+ * make the node for an IS DISTINCT FROM operator
271
+ */
272
+
273
+
274
+ /*
275
+ * Produce a NullTest node from an IS [NOT] DISTINCT FROM NULL construct
276
+ *
277
+ * "arg" is the untransformed other argument
278
+ */
279
+
280
+
281
+ /*
282
+ * Identify node's group for operator precedence warnings
283
+ *
284
+ * For items in nonzero groups, also return a suitable node name into *nodename
285
+ *
286
+ * Note: group zero is used for nodes that are higher or lower precedence
287
+ * than everything that changed precedence; we need never issue warnings
288
+ * related to such nodes.
289
+ */
290
+
291
+
292
+ /*
293
+ * helper routine for delivering 9.4-to-9.5 operator precedence warnings
294
+ *
295
+ * opgroup/opname/location represent some parent node
296
+ * lchild, rchild are its left and right children (either could be NULL)
297
+ *
298
+ * This should be called before transforming the child nodes, since if a
299
+ * precedence-driven parsing change has occurred in a query that used to work,
300
+ * it's quite possible that we'll get a semantic failure while analyzing the
301
+ * child expression. We want to produce the warning before that happens.
302
+ * In any case, operator_precedence_group() expects untransformed input.
303
+ */
304
+
305
+
306
+ /*
307
+ * Produce a string identifying an expression by kind.
308
+ *
309
+ * Note: when practical, use a simple SQL keyword for the result. If that
310
+ * doesn't work well, check call sites to see whether custom error message
311
+ * strings are required.
312
+ */
313
+
@@ -0,0 +1,497 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - raw_parser
4
+ * - base_yylex
5
+ * - check_uescapechar
6
+ * - str_udeescape
7
+ * - hexval
8
+ * - check_unicode_value
9
+ * - raw_parser
10
+ *--------------------------------------------------------------------
11
+ */
12
+
13
+ /*-------------------------------------------------------------------------
14
+ *
15
+ * parser.c
16
+ * Main entry point/driver for PostgreSQL grammar
17
+ *
18
+ * Note that the grammar is not allowed to perform any table access
19
+ * (since we need to be able to do basic parsing even while inside an
20
+ * aborted transaction). Therefore, the data structures returned by
21
+ * the grammar are "raw" parsetrees that still need to be analyzed by
22
+ * analyze.c and related files.
23
+ *
24
+ *
25
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
26
+ * Portions Copyright (c) 1994, Regents of the University of California
27
+ *
28
+ * IDENTIFICATION
29
+ * src/backend/parser/parser.c
30
+ *
31
+ *-------------------------------------------------------------------------
32
+ */
33
+
34
+ #include "postgres.h"
35
+
36
+ #include "mb/pg_wchar.h"
37
+ #include "parser/gramparse.h"
38
+ #include "parser/parser.h"
39
+ #include "parser/scansup.h"
40
+
41
+ static bool check_uescapechar(unsigned char escape);
42
+ static char *str_udeescape(const char *str, char escape,
43
+ int position, core_yyscan_t yyscanner);
44
+
45
+
46
+ /*
47
+ * raw_parser
48
+ * Given a query in string form, do lexical and grammatical analysis.
49
+ *
50
+ * Returns a list of raw (un-analyzed) parse trees. The immediate elements
51
+ * of the list are always RawStmt nodes.
52
+ */
53
+ List *
54
+ raw_parser(const char *str)
55
+ {
56
+ core_yyscan_t yyscanner;
57
+ base_yy_extra_type yyextra;
58
+ int yyresult;
59
+
60
+ /* initialize the flex scanner */
61
+ yyscanner = scanner_init(str, &yyextra.core_yy_extra,
62
+ &ScanKeywords, ScanKeywordTokens);
63
+
64
+ /* base_yylex() only needs this much initialization */
65
+ yyextra.have_lookahead = false;
66
+
67
+ /* initialize the bison parser */
68
+ parser_init(&yyextra);
69
+
70
+ /* Parse! */
71
+ yyresult = base_yyparse(yyscanner);
72
+
73
+ /* Clean up (release memory) */
74
+ scanner_finish(yyscanner);
75
+
76
+ if (yyresult) /* error */
77
+ return NIL;
78
+
79
+ return yyextra.parsetree;
80
+ }
81
+
82
+
83
+ /*
84
+ * Intermediate filter between parser and core lexer (core_yylex in scan.l).
85
+ *
86
+ * This filter is needed because in some cases the standard SQL grammar
87
+ * requires more than one token lookahead. We reduce these cases to one-token
88
+ * lookahead by replacing tokens here, in order to keep the grammar LALR(1).
89
+ *
90
+ * Using a filter is simpler than trying to recognize multiword tokens
91
+ * directly in scan.l, because we'd have to allow for comments between the
92
+ * words. Furthermore it's not clear how to do that without re-introducing
93
+ * scanner backtrack, which would cost more performance than this filter
94
+ * layer does.
95
+ *
96
+ * We also use this filter to convert UIDENT and USCONST sequences into
97
+ * plain IDENT and SCONST tokens. While that could be handled by additional
98
+ * productions in the main grammar, it's more efficient to do it like this.
99
+ *
100
+ * The filter also provides a convenient place to translate between
101
+ * the core_YYSTYPE and YYSTYPE representations (which are really the
102
+ * same thing anyway, but notationally they're different).
103
+ */
104
+ int
105
+ base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner)
106
+ {
107
+ base_yy_extra_type *yyextra = pg_yyget_extra(yyscanner);
108
+ int cur_token;
109
+ int next_token;
110
+ int cur_token_length;
111
+ YYLTYPE cur_yylloc;
112
+
113
+ /* Get next token --- we might already have it */
114
+ if (yyextra->have_lookahead)
115
+ {
116
+ cur_token = yyextra->lookahead_token;
117
+ lvalp->core_yystype = yyextra->lookahead_yylval;
118
+ *llocp = yyextra->lookahead_yylloc;
119
+ *(yyextra->lookahead_end) = yyextra->lookahead_hold_char;
120
+ yyextra->have_lookahead = false;
121
+ }
122
+ else
123
+ cur_token = core_yylex(&(lvalp->core_yystype), llocp, yyscanner);
124
+
125
+ /*
126
+ * If this token isn't one that requires lookahead, just return it. If it
127
+ * does, determine the token length. (We could get that via strlen(), but
128
+ * since we have such a small set of possibilities, hardwiring seems
129
+ * feasible and more efficient --- at least for the fixed-length cases.)
130
+ */
131
+ switch (cur_token)
132
+ {
133
+ case NOT:
134
+ cur_token_length = 3;
135
+ break;
136
+ case NULLS_P:
137
+ cur_token_length = 5;
138
+ break;
139
+ case WITH:
140
+ cur_token_length = 4;
141
+ break;
142
+ case UIDENT:
143
+ case USCONST:
144
+ cur_token_length = strlen(yyextra->core_yy_extra.scanbuf + *llocp);
145
+ break;
146
+ case SQL_COMMENT:
147
+ case C_COMMENT:
148
+ return base_yylex(lvalp, llocp, yyscanner);
149
+ default:
150
+ return cur_token;
151
+ }
152
+
153
+ /*
154
+ * Identify end+1 of current token. core_yylex() has temporarily stored a
155
+ * '\0' here, and will undo that when we call it again. We need to redo
156
+ * it to fully revert the lookahead call for error reporting purposes.
157
+ */
158
+ yyextra->lookahead_end = yyextra->core_yy_extra.scanbuf +
159
+ *llocp + cur_token_length;
160
+ Assert(*(yyextra->lookahead_end) == '\0');
161
+
162
+ /*
163
+ * Save and restore *llocp around the call. It might look like we could
164
+ * avoid this by just passing &lookahead_yylloc to core_yylex(), but that
165
+ * does not work because flex actually holds onto the last-passed pointer
166
+ * internally, and will use that for error reporting. We need any error
167
+ * reports to point to the current token, not the next one.
168
+ */
169
+ cur_yylloc = *llocp;
170
+
171
+ /* Get next token, saving outputs into lookahead variables */
172
+ next_token = core_yylex(&(yyextra->lookahead_yylval), llocp, yyscanner);
173
+ yyextra->lookahead_token = next_token;
174
+ yyextra->lookahead_yylloc = *llocp;
175
+
176
+ *llocp = cur_yylloc;
177
+
178
+ /* Now revert the un-truncation of the current token */
179
+ yyextra->lookahead_hold_char = *(yyextra->lookahead_end);
180
+ *(yyextra->lookahead_end) = '\0';
181
+
182
+ yyextra->have_lookahead = true;
183
+
184
+ /* Replace cur_token if needed, based on lookahead */
185
+ switch (cur_token)
186
+ {
187
+ case NOT:
188
+ /* Replace NOT by NOT_LA if it's followed by BETWEEN, IN, etc */
189
+ switch (next_token)
190
+ {
191
+ case BETWEEN:
192
+ case IN_P:
193
+ case LIKE:
194
+ case ILIKE:
195
+ case SIMILAR:
196
+ cur_token = NOT_LA;
197
+ break;
198
+ }
199
+ break;
200
+
201
+ case NULLS_P:
202
+ /* Replace NULLS_P by NULLS_LA if it's followed by FIRST or LAST */
203
+ switch (next_token)
204
+ {
205
+ case FIRST_P:
206
+ case LAST_P:
207
+ cur_token = NULLS_LA;
208
+ break;
209
+ }
210
+ break;
211
+
212
+ case WITH:
213
+ /* Replace WITH by WITH_LA if it's followed by TIME or ORDINALITY */
214
+ switch (next_token)
215
+ {
216
+ case TIME:
217
+ case ORDINALITY:
218
+ cur_token = WITH_LA;
219
+ break;
220
+ }
221
+ break;
222
+
223
+ case UIDENT:
224
+ case USCONST:
225
+ /* Look ahead for UESCAPE */
226
+ if (next_token == UESCAPE)
227
+ {
228
+ /* Yup, so get third token, which had better be SCONST */
229
+ const char *escstr;
230
+
231
+ /* Again save and restore *llocp */
232
+ cur_yylloc = *llocp;
233
+
234
+ /* Un-truncate current token so errors point to third token */
235
+ *(yyextra->lookahead_end) = yyextra->lookahead_hold_char;
236
+
237
+ /* Get third token */
238
+ next_token = core_yylex(&(yyextra->lookahead_yylval),
239
+ llocp, yyscanner);
240
+
241
+ /* If we throw error here, it will point to third token */
242
+ if (next_token != SCONST)
243
+ scanner_yyerror("UESCAPE must be followed by a simple string literal",
244
+ yyscanner);
245
+
246
+ escstr = yyextra->lookahead_yylval.str;
247
+ if (strlen(escstr) != 1 || !check_uescapechar(escstr[0]))
248
+ scanner_yyerror("invalid Unicode escape character",
249
+ yyscanner);
250
+
251
+ /* Now restore *llocp; errors will point to first token */
252
+ *llocp = cur_yylloc;
253
+
254
+ /* Apply Unicode conversion */
255
+ lvalp->core_yystype.str =
256
+ str_udeescape(lvalp->core_yystype.str,
257
+ escstr[0],
258
+ *llocp,
259
+ yyscanner);
260
+
261
+ /*
262
+ * We don't need to revert the un-truncation of UESCAPE. What
263
+ * we do want to do is clear have_lookahead, thereby consuming
264
+ * all three tokens.
265
+ */
266
+ yyextra->have_lookahead = false;
267
+ }
268
+ else
269
+ {
270
+ /* No UESCAPE, so convert using default escape character */
271
+ lvalp->core_yystype.str =
272
+ str_udeescape(lvalp->core_yystype.str,
273
+ '\\',
274
+ *llocp,
275
+ yyscanner);
276
+ }
277
+
278
+ if (cur_token == UIDENT)
279
+ {
280
+ /* It's an identifier, so truncate as appropriate */
281
+ truncate_identifier(lvalp->core_yystype.str,
282
+ strlen(lvalp->core_yystype.str),
283
+ true);
284
+ cur_token = IDENT;
285
+ }
286
+ else if (cur_token == USCONST)
287
+ {
288
+ cur_token = SCONST;
289
+ }
290
+ break;
291
+ }
292
+
293
+ return cur_token;
294
+ }
295
+
296
+ /* convert hex digit (caller should have verified that) to value */
297
+ static unsigned int
298
+ hexval(unsigned char c)
299
+ {
300
+ if (c >= '0' && c <= '9')
301
+ return c - '0';
302
+ if (c >= 'a' && c <= 'f')
303
+ return c - 'a' + 0xA;
304
+ if (c >= 'A' && c <= 'F')
305
+ return c - 'A' + 0xA;
306
+ elog(ERROR, "invalid hexadecimal digit");
307
+ return 0; /* not reached */
308
+ }
309
+
310
+ /* is Unicode code point acceptable? */
311
+ static void
312
+ check_unicode_value(pg_wchar c)
313
+ {
314
+ if (!is_valid_unicode_codepoint(c))
315
+ ereport(ERROR,
316
+ (errcode(ERRCODE_SYNTAX_ERROR),
317
+ errmsg("invalid Unicode escape value")));
318
+ }
319
+
320
+ /* is 'escape' acceptable as Unicode escape character (UESCAPE syntax) ? */
321
+ static bool
322
+ check_uescapechar(unsigned char escape)
323
+ {
324
+ if (isxdigit(escape)
325
+ || escape == '+'
326
+ || escape == '\''
327
+ || escape == '"'
328
+ || scanner_isspace(escape))
329
+ return false;
330
+ else
331
+ return true;
332
+ }
333
+
334
+ /*
335
+ * Process Unicode escapes in "str", producing a palloc'd plain string
336
+ *
337
+ * escape: the escape character to use
338
+ * position: start position of U&'' or U&"" string token
339
+ * yyscanner: context information needed for error reports
340
+ */
341
+ static char *
342
+ str_udeescape(const char *str, char escape,
343
+ int position, core_yyscan_t yyscanner)
344
+ {
345
+ const char *in;
346
+ char *new,
347
+ *out;
348
+ size_t new_len;
349
+ pg_wchar pair_first = 0;
350
+ ScannerCallbackState scbstate;
351
+
352
+ /*
353
+ * Guesstimate that result will be no longer than input, but allow enough
354
+ * padding for Unicode conversion.
355
+ */
356
+ new_len = strlen(str) + MAX_UNICODE_EQUIVALENT_STRING + 1;
357
+ new = palloc(new_len);
358
+
359
+ in = str;
360
+ out = new;
361
+ while (*in)
362
+ {
363
+ /* Enlarge string if needed */
364
+ size_t out_dist = out - new;
365
+
366
+ if (out_dist > new_len - (MAX_UNICODE_EQUIVALENT_STRING + 1))
367
+ {
368
+ new_len *= 2;
369
+ new = repalloc(new, new_len);
370
+ out = new + out_dist;
371
+ }
372
+
373
+ if (in[0] == escape)
374
+ {
375
+ /*
376
+ * Any errors reported while processing this escape sequence will
377
+ * have an error cursor pointing at the escape.
378
+ */
379
+ setup_scanner_errposition_callback(&scbstate, yyscanner,
380
+ in - str + position + 3); /* 3 for U&" */
381
+ if (in[1] == escape)
382
+ {
383
+ if (pair_first)
384
+ goto invalid_pair;
385
+ *out++ = escape;
386
+ in += 2;
387
+ }
388
+ else if (isxdigit((unsigned char) in[1]) &&
389
+ isxdigit((unsigned char) in[2]) &&
390
+ isxdigit((unsigned char) in[3]) &&
391
+ isxdigit((unsigned char) in[4]))
392
+ {
393
+ pg_wchar unicode;
394
+
395
+ unicode = (hexval(in[1]) << 12) +
396
+ (hexval(in[2]) << 8) +
397
+ (hexval(in[3]) << 4) +
398
+ hexval(in[4]);
399
+ check_unicode_value(unicode);
400
+ if (pair_first)
401
+ {
402
+ if (is_utf16_surrogate_second(unicode))
403
+ {
404
+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);
405
+ pair_first = 0;
406
+ }
407
+ else
408
+ goto invalid_pair;
409
+ }
410
+ else if (is_utf16_surrogate_second(unicode))
411
+ goto invalid_pair;
412
+
413
+ if (is_utf16_surrogate_first(unicode))
414
+ pair_first = unicode;
415
+ else
416
+ {
417
+ pg_unicode_to_server(unicode, (unsigned char *) out);
418
+ out += strlen(out);
419
+ }
420
+ in += 5;
421
+ }
422
+ else if (in[1] == '+' &&
423
+ isxdigit((unsigned char) in[2]) &&
424
+ isxdigit((unsigned char) in[3]) &&
425
+ isxdigit((unsigned char) in[4]) &&
426
+ isxdigit((unsigned char) in[5]) &&
427
+ isxdigit((unsigned char) in[6]) &&
428
+ isxdigit((unsigned char) in[7]))
429
+ {
430
+ pg_wchar unicode;
431
+
432
+ unicode = (hexval(in[2]) << 20) +
433
+ (hexval(in[3]) << 16) +
434
+ (hexval(in[4]) << 12) +
435
+ (hexval(in[5]) << 8) +
436
+ (hexval(in[6]) << 4) +
437
+ hexval(in[7]);
438
+ check_unicode_value(unicode);
439
+ if (pair_first)
440
+ {
441
+ if (is_utf16_surrogate_second(unicode))
442
+ {
443
+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);
444
+ pair_first = 0;
445
+ }
446
+ else
447
+ goto invalid_pair;
448
+ }
449
+ else if (is_utf16_surrogate_second(unicode))
450
+ goto invalid_pair;
451
+
452
+ if (is_utf16_surrogate_first(unicode))
453
+ pair_first = unicode;
454
+ else
455
+ {
456
+ pg_unicode_to_server(unicode, (unsigned char *) out);
457
+ out += strlen(out);
458
+ }
459
+ in += 8;
460
+ }
461
+ else
462
+ ereport(ERROR,
463
+ (errcode(ERRCODE_SYNTAX_ERROR),
464
+ errmsg("invalid Unicode escape"),
465
+ errhint("Unicode escapes must be \\XXXX or \\+XXXXXX.")));
466
+
467
+ cancel_scanner_errposition_callback(&scbstate);
468
+ }
469
+ else
470
+ {
471
+ if (pair_first)
472
+ goto invalid_pair;
473
+
474
+ *out++ = *in++;
475
+ }
476
+ }
477
+
478
+ /* unfinished surrogate pair? */
479
+ if (pair_first)
480
+ goto invalid_pair;
481
+
482
+ *out = '\0';
483
+ return new;
484
+
485
+ /*
486
+ * We might get here with the error callback active, or not. Call
487
+ * scanner_errposition to make sure an error cursor appears; if the
488
+ * callback is active, this is duplicative but harmless.
489
+ */
490
+ invalid_pair:
491
+ ereport(ERROR,
492
+ (errcode(ERRCODE_SYNTAX_ERROR),
493
+ errmsg("invalid Unicode surrogate pair"),
494
+ scanner_errposition(in - str + position + 3, /* 3 for U&" */
495
+ yyscanner)));
496
+ return NULL; /* keep compiler quiet */
497
+ }