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,99 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - GetExtensibleNodeMethods
4
+ * - GetExtensibleNodeEntry
5
+ * - extensible_node_methods
6
+ *--------------------------------------------------------------------
7
+ */
8
+
9
+ /*-------------------------------------------------------------------------
10
+ *
11
+ * extensible.c
12
+ * Support for extensible node types
13
+ *
14
+ * Loadable modules can define what are in effect new types of nodes using
15
+ * the routines in this file. All such nodes are flagged T_ExtensibleNode,
16
+ * with the extnodename field distinguishing the specific type. Use
17
+ * RegisterExtensibleNodeMethods to register a new type of extensible node,
18
+ * and GetExtensibleNodeMethods to get information about a previously
19
+ * registered type of extensible node.
20
+ *
21
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
22
+ * Portions Copyright (c) 1994, Regents of the University of California
23
+ *
24
+ * IDENTIFICATION
25
+ * src/backend/nodes/extensible.c
26
+ *
27
+ *-------------------------------------------------------------------------
28
+ */
29
+ #include "postgres.h"
30
+
31
+ #include "nodes/extensible.h"
32
+ #include "utils/hsearch.h"
33
+
34
+ static __thread HTAB *extensible_node_methods = NULL;
35
+
36
+
37
+
38
+ typedef struct
39
+ {
40
+ char extnodename[EXTNODENAME_MAX_LEN];
41
+ const void *extnodemethods;
42
+ } ExtensibleNodeEntry;
43
+
44
+ /*
45
+ * An internal function to register a new callback structure
46
+ */
47
+
48
+
49
+ /*
50
+ * Register a new type of extensible node.
51
+ */
52
+
53
+
54
+ /*
55
+ * Register a new type of custom scan node
56
+ */
57
+
58
+
59
+ /*
60
+ * An internal routine to get an ExtensibleNodeEntry by the given identifier
61
+ */
62
+ static const void *
63
+ GetExtensibleNodeEntry(HTAB *htable, const char *extnodename, bool missing_ok)
64
+ {
65
+ ExtensibleNodeEntry *entry = NULL;
66
+
67
+ if (htable != NULL)
68
+ entry = (ExtensibleNodeEntry *) hash_search(htable,
69
+ extnodename,
70
+ HASH_FIND, NULL);
71
+ if (!entry)
72
+ {
73
+ if (missing_ok)
74
+ return NULL;
75
+ ereport(ERROR,
76
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
77
+ errmsg("ExtensibleNodeMethods \"%s\" was not registered",
78
+ extnodename)));
79
+ }
80
+
81
+ return entry->extnodemethods;
82
+ }
83
+
84
+ /*
85
+ * Get the methods for a given type of extensible node.
86
+ */
87
+ const ExtensibleNodeMethods *
88
+ GetExtensibleNodeMethods(const char *extnodename, bool missing_ok)
89
+ {
90
+ return (const ExtensibleNodeMethods *)
91
+ GetExtensibleNodeEntry(extensible_node_methods,
92
+ extnodename,
93
+ missing_ok);
94
+ }
95
+
96
+ /*
97
+ * Get the methods for a given name of CustomScanMethods
98
+ */
99
+
@@ -0,0 +1,922 @@
1
+ /*--------------------------------------------------------------------
2
+ * Symbols referenced in this file:
3
+ * - lappend
4
+ * - new_list
5
+ * - new_tail_cell
6
+ * - enlarge_list
7
+ * - check_list_invariants
8
+ * - list_make1_impl
9
+ * - list_make2_impl
10
+ * - list_concat
11
+ * - list_copy
12
+ * - lcons
13
+ * - new_head_cell
14
+ * - list_make3_impl
15
+ * - list_make4_impl
16
+ * - list_delete_cell
17
+ * - list_delete_nth_cell
18
+ * - list_free
19
+ * - list_free_private
20
+ * - list_copy_deep
21
+ * - list_copy_tail
22
+ * - list_truncate
23
+ *--------------------------------------------------------------------
24
+ */
25
+
26
+ /*-------------------------------------------------------------------------
27
+ *
28
+ * list.c
29
+ * implementation for PostgreSQL generic list package
30
+ *
31
+ * See comments in pg_list.h.
32
+ *
33
+ *
34
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
35
+ * Portions Copyright (c) 1994, Regents of the University of California
36
+ *
37
+ *
38
+ * IDENTIFICATION
39
+ * src/backend/nodes/list.c
40
+ *
41
+ *-------------------------------------------------------------------------
42
+ */
43
+ #include "postgres.h"
44
+
45
+ #include "nodes/pg_list.h"
46
+ #include "port/pg_bitutils.h"
47
+ #include "utils/memdebug.h"
48
+ #include "utils/memutils.h"
49
+
50
+
51
+ /*
52
+ * The previous List implementation, since it used a separate palloc chunk
53
+ * for each cons cell, had the property that adding or deleting list cells
54
+ * did not move the storage of other existing cells in the list. Quite a
55
+ * bit of existing code depended on that, by retaining ListCell pointers
56
+ * across such operations on a list. There is no such guarantee in this
57
+ * implementation, so instead we have debugging support that is meant to
58
+ * help flush out now-broken assumptions. Defining DEBUG_LIST_MEMORY_USAGE
59
+ * while building this file causes the List operations to forcibly move
60
+ * all cells in a list whenever a cell is added or deleted. In combination
61
+ * with MEMORY_CONTEXT_CHECKING and/or Valgrind, this can usually expose
62
+ * broken code. It's a bit expensive though, as there's many more palloc
63
+ * cycles and a lot more data-copying than in a default build.
64
+ *
65
+ * By default, we enable this when building for Valgrind.
66
+ */
67
+ #ifdef USE_VALGRIND
68
+ #define DEBUG_LIST_MEMORY_USAGE
69
+ #endif
70
+
71
+ /* Overhead for the fixed part of a List header, measured in ListCells */
72
+ #define LIST_HEADER_OVERHEAD \
73
+ ((int) ((offsetof(List, initial_elements) - 1) / sizeof(ListCell) + 1))
74
+
75
+ /*
76
+ * Macros to simplify writing assertions about the type of a list; a
77
+ * NIL list is considered to be an empty list of any type.
78
+ */
79
+ #define IsPointerList(l) ((l) == NIL || IsA((l), List))
80
+ #define IsIntegerList(l) ((l) == NIL || IsA((l), IntList))
81
+ #define IsOidList(l) ((l) == NIL || IsA((l), OidList))
82
+
83
+ #ifdef USE_ASSERT_CHECKING
84
+ /*
85
+ * Check that the specified List is valid (so far as we can tell).
86
+ */
87
+ static void
88
+ check_list_invariants(const List *list)
89
+ {
90
+ if (list == NIL)
91
+ return;
92
+
93
+ Assert(list->length > 0);
94
+ Assert(list->length <= list->max_length);
95
+ Assert(list->elements != NULL);
96
+
97
+ Assert(list->type == T_List ||
98
+ list->type == T_IntList ||
99
+ list->type == T_OidList);
100
+ }
101
+ #else
102
+ #define check_list_invariants(l) ((void) 0)
103
+ #endif /* USE_ASSERT_CHECKING */
104
+
105
+ /*
106
+ * Return a freshly allocated List with room for at least min_size cells.
107
+ *
108
+ * Since empty non-NIL lists are invalid, new_list() sets the initial length
109
+ * to min_size, effectively marking that number of cells as valid; the caller
110
+ * is responsible for filling in their data.
111
+ */
112
+ static List *
113
+ new_list(NodeTag type, int min_size)
114
+ {
115
+ List *newlist;
116
+ int max_size;
117
+
118
+ Assert(min_size > 0);
119
+
120
+ /*
121
+ * We allocate all the requested cells, and possibly some more, as part of
122
+ * the same palloc request as the List header. This is a big win for the
123
+ * typical case of short fixed-length lists. It can lose if we allocate a
124
+ * moderately long list and then it gets extended; we'll be wasting more
125
+ * initial_elements[] space than if we'd made the header small. However,
126
+ * rounding up the request as we do in the normal code path provides some
127
+ * defense against small extensions.
128
+ */
129
+
130
+ #ifndef DEBUG_LIST_MEMORY_USAGE
131
+
132
+ /*
133
+ * Normally, we set up a list with some extra cells, to allow it to grow
134
+ * without a repalloc. Prefer cell counts chosen to make the total
135
+ * allocation a power-of-2, since palloc would round it up to that anyway.
136
+ * (That stops being true for very large allocations, but very long lists
137
+ * are infrequent, so it doesn't seem worth special logic for such cases.)
138
+ *
139
+ * The minimum allocation is 8 ListCell units, providing either 4 or 5
140
+ * available ListCells depending on the machine's word width. Counting
141
+ * palloc's overhead, this uses the same amount of space as a one-cell
142
+ * list did in the old implementation, and less space for any longer list.
143
+ *
144
+ * We needn't worry about integer overflow; no caller passes min_size
145
+ * that's more than twice the size of an existing list, so the size limits
146
+ * within palloc will ensure that we don't overflow here.
147
+ */
148
+ max_size = pg_nextpower2_32(Max(8, min_size + LIST_HEADER_OVERHEAD));
149
+ max_size -= LIST_HEADER_OVERHEAD;
150
+ #else
151
+
152
+ /*
153
+ * For debugging, don't allow any extra space. This forces any cell
154
+ * addition to go through enlarge_list() and thus move the existing data.
155
+ */
156
+ max_size = min_size;
157
+ #endif
158
+
159
+ newlist = (List *) palloc(offsetof(List, initial_elements) +
160
+ max_size * sizeof(ListCell));
161
+ newlist->type = type;
162
+ newlist->length = min_size;
163
+ newlist->max_length = max_size;
164
+ newlist->elements = newlist->initial_elements;
165
+
166
+ return newlist;
167
+ }
168
+
169
+ /*
170
+ * Enlarge an existing non-NIL List to have room for at least min_size cells.
171
+ *
172
+ * This does *not* update list->length, as some callers would find that
173
+ * inconvenient. (list->length had better be the correct number of existing
174
+ * valid cells, though.)
175
+ */
176
+ static void
177
+ enlarge_list(List *list, int min_size)
178
+ {
179
+ int new_max_len;
180
+
181
+ Assert(min_size > list->max_length); /* else we shouldn't be here */
182
+
183
+ #ifndef DEBUG_LIST_MEMORY_USAGE
184
+
185
+ /*
186
+ * As above, we prefer power-of-two total allocations; but here we need
187
+ * not account for list header overhead.
188
+ */
189
+
190
+ /* clamp the minimum value to 16, a semi-arbitrary small power of 2 */
191
+ new_max_len = pg_nextpower2_32(Max(16, min_size));
192
+
193
+ #else
194
+ /* As above, don't allocate anything extra */
195
+ new_max_len = min_size;
196
+ #endif
197
+
198
+ if (list->elements == list->initial_elements)
199
+ {
200
+ /*
201
+ * Replace original in-line allocation with a separate palloc block.
202
+ * Ensure it is in the same memory context as the List header. (The
203
+ * previous List implementation did not offer any guarantees about
204
+ * keeping all list cells in the same context, but it seems reasonable
205
+ * to create such a guarantee now.)
206
+ */
207
+ list->elements = (ListCell *)
208
+ MemoryContextAlloc(GetMemoryChunkContext(list),
209
+ new_max_len * sizeof(ListCell));
210
+ memcpy(list->elements, list->initial_elements,
211
+ list->length * sizeof(ListCell));
212
+
213
+ /*
214
+ * We must not move the list header, so it's unsafe to try to reclaim
215
+ * the initial_elements[] space via repalloc. In debugging builds,
216
+ * however, we can clear that space and/or mark it inaccessible.
217
+ * (wipe_mem includes VALGRIND_MAKE_MEM_NOACCESS.)
218
+ */
219
+ #ifdef CLOBBER_FREED_MEMORY
220
+ wipe_mem(list->initial_elements,
221
+ list->max_length * sizeof(ListCell));
222
+ #else
223
+ VALGRIND_MAKE_MEM_NOACCESS(list->initial_elements,
224
+ list->max_length * sizeof(ListCell));
225
+ #endif
226
+ }
227
+ else
228
+ {
229
+ #ifndef DEBUG_LIST_MEMORY_USAGE
230
+ /* Normally, let repalloc deal with enlargement */
231
+ list->elements = (ListCell *) repalloc(list->elements,
232
+ new_max_len * sizeof(ListCell));
233
+ #else
234
+ /*
235
+ * repalloc() might enlarge the space in-place, which we don't want
236
+ * for debugging purposes, so forcibly move the data somewhere else.
237
+ */
238
+ ListCell *newelements;
239
+
240
+ newelements = (ListCell *)
241
+ MemoryContextAlloc(GetMemoryChunkContext(list),
242
+ new_max_len * sizeof(ListCell));
243
+ memcpy(newelements, list->elements,
244
+ list->length * sizeof(ListCell));
245
+ pfree(list->elements);
246
+ list->elements = newelements;
247
+ #endif
248
+ }
249
+
250
+ list->max_length = new_max_len;
251
+ }
252
+
253
+ /*
254
+ * Convenience functions to construct short Lists from given values.
255
+ * (These are normally invoked via the list_makeN macros.)
256
+ */
257
+ List *
258
+ list_make1_impl(NodeTag t, ListCell datum1)
259
+ {
260
+ List *list = new_list(t, 1);
261
+
262
+ list->elements[0] = datum1;
263
+ check_list_invariants(list);
264
+ return list;
265
+ }
266
+
267
+ List *
268
+ list_make2_impl(NodeTag t, ListCell datum1, ListCell datum2)
269
+ {
270
+ List *list = new_list(t, 2);
271
+
272
+ list->elements[0] = datum1;
273
+ list->elements[1] = datum2;
274
+ check_list_invariants(list);
275
+ return list;
276
+ }
277
+
278
+ List *
279
+ list_make3_impl(NodeTag t, ListCell datum1, ListCell datum2,
280
+ ListCell datum3)
281
+ {
282
+ List *list = new_list(t, 3);
283
+
284
+ list->elements[0] = datum1;
285
+ list->elements[1] = datum2;
286
+ list->elements[2] = datum3;
287
+ check_list_invariants(list);
288
+ return list;
289
+ }
290
+
291
+ List *
292
+ list_make4_impl(NodeTag t, ListCell datum1, ListCell datum2,
293
+ ListCell datum3, ListCell datum4)
294
+ {
295
+ List *list = new_list(t, 4);
296
+
297
+ list->elements[0] = datum1;
298
+ list->elements[1] = datum2;
299
+ list->elements[2] = datum3;
300
+ list->elements[3] = datum4;
301
+ check_list_invariants(list);
302
+ return list;
303
+ }
304
+
305
+ /*
306
+ * Make room for a new head cell in the given (non-NIL) list.
307
+ *
308
+ * The data in the new head cell is undefined; the caller should be
309
+ * sure to fill it in
310
+ */
311
+ static void
312
+ new_head_cell(List *list)
313
+ {
314
+ /* Enlarge array if necessary */
315
+ if (list->length >= list->max_length)
316
+ enlarge_list(list, list->length + 1);
317
+ /* Now shove the existing data over */
318
+ memmove(&list->elements[1], &list->elements[0],
319
+ list->length * sizeof(ListCell));
320
+ list->length++;
321
+ }
322
+
323
+ /*
324
+ * Make room for a new tail cell in the given (non-NIL) list.
325
+ *
326
+ * The data in the new tail cell is undefined; the caller should be
327
+ * sure to fill it in
328
+ */
329
+ static void
330
+ new_tail_cell(List *list)
331
+ {
332
+ /* Enlarge array if necessary */
333
+ if (list->length >= list->max_length)
334
+ enlarge_list(list, list->length + 1);
335
+ list->length++;
336
+ }
337
+
338
+ /*
339
+ * Append a pointer to the list. A pointer to the modified list is
340
+ * returned. Note that this function may or may not destructively
341
+ * modify the list; callers should always use this function's return
342
+ * value, rather than continuing to use the pointer passed as the
343
+ * first argument.
344
+ */
345
+ List *
346
+ lappend(List *list, void *datum)
347
+ {
348
+ Assert(IsPointerList(list));
349
+
350
+ if (list == NIL)
351
+ list = new_list(T_List, 1);
352
+ else
353
+ new_tail_cell(list);
354
+
355
+ lfirst(list_tail(list)) = datum;
356
+ check_list_invariants(list);
357
+ return list;
358
+ }
359
+
360
+ /*
361
+ * Append an integer to the specified list. See lappend()
362
+ */
363
+
364
+
365
+ /*
366
+ * Append an OID to the specified list. See lappend()
367
+ */
368
+
369
+
370
+ /*
371
+ * Make room for a new cell at position 'pos' (measured from 0).
372
+ * The data in the cell is left undefined, and must be filled in by the
373
+ * caller. 'list' is assumed to be non-NIL, and 'pos' must be a valid
374
+ * list position, ie, 0 <= pos <= list's length.
375
+ * Returns address of the new cell.
376
+ */
377
+
378
+
379
+ /*
380
+ * Insert the given datum at position 'pos' (measured from 0) in the list.
381
+ * 'pos' must be valid, ie, 0 <= pos <= list's length.
382
+ */
383
+
384
+
385
+
386
+
387
+
388
+
389
+ /*
390
+ * Prepend a new element to the list. A pointer to the modified list
391
+ * is returned. Note that this function may or may not destructively
392
+ * modify the list; callers should always use this function's return
393
+ * value, rather than continuing to use the pointer passed as the
394
+ * second argument.
395
+ *
396
+ * Caution: before Postgres 8.0, the original List was unmodified and
397
+ * could be considered to retain its separate identity. This is no longer
398
+ * the case.
399
+ */
400
+ List *
401
+ lcons(void *datum, List *list)
402
+ {
403
+ Assert(IsPointerList(list));
404
+
405
+ if (list == NIL)
406
+ list = new_list(T_List, 1);
407
+ else
408
+ new_head_cell(list);
409
+
410
+ lfirst(list_head(list)) = datum;
411
+ check_list_invariants(list);
412
+ return list;
413
+ }
414
+
415
+ /*
416
+ * Prepend an integer to the list. See lcons()
417
+ */
418
+
419
+
420
+ /*
421
+ * Prepend an OID to the list. See lcons()
422
+ */
423
+
424
+
425
+ /*
426
+ * Concatenate list2 to the end of list1, and return list1.
427
+ *
428
+ * This is equivalent to lappend'ing each element of list2, in order, to list1.
429
+ * list1 is destructively changed, list2 is not. (However, in the case of
430
+ * pointer lists, list1 and list2 will point to the same structures.)
431
+ *
432
+ * Callers should be sure to use the return value as the new pointer to the
433
+ * concatenated list: the 'list1' input pointer may or may not be the same
434
+ * as the returned pointer.
435
+ */
436
+ List *
437
+ list_concat(List *list1, const List *list2)
438
+ {
439
+ int new_len;
440
+
441
+ if (list1 == NIL)
442
+ return list_copy(list2);
443
+ if (list2 == NIL)
444
+ return list1;
445
+
446
+ Assert(list1->type == list2->type);
447
+
448
+ new_len = list1->length + list2->length;
449
+ /* Enlarge array if necessary */
450
+ if (new_len > list1->max_length)
451
+ enlarge_list(list1, new_len);
452
+
453
+ /* Even if list1 == list2, using memcpy should be safe here */
454
+ memcpy(&list1->elements[list1->length], &list2->elements[0],
455
+ list2->length * sizeof(ListCell));
456
+ list1->length = new_len;
457
+
458
+ check_list_invariants(list1);
459
+ return list1;
460
+ }
461
+
462
+ /*
463
+ * Form a new list by concatenating the elements of list1 and list2.
464
+ *
465
+ * Neither input list is modified. (However, if they are pointer lists,
466
+ * the output list will point to the same structures.)
467
+ *
468
+ * This is equivalent to, but more efficient than,
469
+ * list_concat(list_copy(list1), list2).
470
+ * Note that some pre-v13 code might list_copy list2 as well, but that's
471
+ * pointless now.
472
+ */
473
+
474
+
475
+ /*
476
+ * Truncate 'list' to contain no more than 'new_size' elements. This
477
+ * modifies the list in-place! Despite this, callers should use the
478
+ * pointer returned by this function to refer to the newly truncated
479
+ * list -- it may or may not be the same as the pointer that was
480
+ * passed.
481
+ *
482
+ * Note that any cells removed by list_truncate() are NOT pfree'd.
483
+ */
484
+ List *
485
+ list_truncate(List *list, int new_size)
486
+ {
487
+ if (new_size <= 0)
488
+ return NIL; /* truncate to zero length */
489
+
490
+ /* If asked to effectively extend the list, do nothing */
491
+ if (new_size < list_length(list))
492
+ list->length = new_size;
493
+
494
+ /*
495
+ * Note: unlike the individual-list-cell deletion functions, we don't move
496
+ * the list cells to new storage, even in DEBUG_LIST_MEMORY_USAGE mode.
497
+ * This is because none of them can move in this operation, so just like
498
+ * in the old cons-cell-based implementation, this function doesn't
499
+ * invalidate any pointers to cells of the list. This is also the reason
500
+ * for not wiping the memory of the deleted cells: the old code didn't
501
+ * free them either. Perhaps later we'll tighten this up.
502
+ */
503
+
504
+ return list;
505
+ }
506
+
507
+ /*
508
+ * Return true iff 'datum' is a member of the list. Equality is
509
+ * determined via equal(), so callers should ensure that they pass a
510
+ * Node as 'datum'.
511
+ */
512
+
513
+
514
+ /*
515
+ * Return true iff 'datum' is a member of the list. Equality is
516
+ * determined by using simple pointer comparison.
517
+ */
518
+
519
+
520
+ /*
521
+ * Return true iff the integer 'datum' is a member of the list.
522
+ */
523
+
524
+
525
+ /*
526
+ * Return true iff the OID 'datum' is a member of the list.
527
+ */
528
+
529
+
530
+ /*
531
+ * Delete the n'th cell (counting from 0) in list.
532
+ *
533
+ * The List is pfree'd if this was the last member.
534
+ */
535
+ List *
536
+ list_delete_nth_cell(List *list, int n)
537
+ {
538
+ check_list_invariants(list);
539
+
540
+ Assert(n >= 0 && n < list->length);
541
+
542
+ /*
543
+ * If we're about to delete the last node from the list, free the whole
544
+ * list instead and return NIL, which is the only valid representation of
545
+ * a zero-length list.
546
+ */
547
+ if (list->length == 1)
548
+ {
549
+ list_free(list);
550
+ return NIL;
551
+ }
552
+
553
+ /*
554
+ * Otherwise, we normally just collapse out the removed element. But for
555
+ * debugging purposes, move the whole list contents someplace else.
556
+ *
557
+ * (Note that we *must* keep the contents in the same memory context.)
558
+ */
559
+ #ifndef DEBUG_LIST_MEMORY_USAGE
560
+ memmove(&list->elements[n], &list->elements[n + 1],
561
+ (list->length - 1 - n) * sizeof(ListCell));
562
+ list->length--;
563
+ #else
564
+ {
565
+ ListCell *newelems;
566
+ int newmaxlen = list->length - 1;
567
+
568
+ newelems = (ListCell *)
569
+ MemoryContextAlloc(GetMemoryChunkContext(list),
570
+ newmaxlen * sizeof(ListCell));
571
+ memcpy(newelems, list->elements, n * sizeof(ListCell));
572
+ memcpy(&newelems[n], &list->elements[n + 1],
573
+ (list->length - 1 - n) * sizeof(ListCell));
574
+ if (list->elements != list->initial_elements)
575
+ pfree(list->elements);
576
+ else
577
+ {
578
+ /*
579
+ * As in enlarge_list(), clear the initial_elements[] space and/or
580
+ * mark it inaccessible.
581
+ */
582
+ #ifdef CLOBBER_FREED_MEMORY
583
+ wipe_mem(list->initial_elements,
584
+ list->max_length * sizeof(ListCell));
585
+ #else
586
+ VALGRIND_MAKE_MEM_NOACCESS(list->initial_elements,
587
+ list->max_length * sizeof(ListCell));
588
+ #endif
589
+ }
590
+ list->elements = newelems;
591
+ list->max_length = newmaxlen;
592
+ list->length--;
593
+ check_list_invariants(list);
594
+ }
595
+ #endif
596
+
597
+ return list;
598
+ }
599
+
600
+ /*
601
+ * Delete 'cell' from 'list'.
602
+ *
603
+ * The List is pfree'd if this was the last member. However, we do not
604
+ * touch any data the cell might've been pointing to.
605
+ */
606
+ List *
607
+ list_delete_cell(List *list, ListCell *cell)
608
+ {
609
+ return list_delete_nth_cell(list, cell - list->elements);
610
+ }
611
+
612
+ /*
613
+ * Delete the first cell in list that matches datum, if any.
614
+ * Equality is determined via equal().
615
+ */
616
+
617
+
618
+ /* As above, but use simple pointer equality */
619
+
620
+
621
+ /* As above, but for integers */
622
+
623
+
624
+ /* As above, but for OIDs */
625
+
626
+
627
+ /*
628
+ * Delete the first element of the list.
629
+ *
630
+ * This is useful to replace the Lisp-y code "list = lnext(list);" in cases
631
+ * where the intent is to alter the list rather than just traverse it.
632
+ * Beware that the list is modified, whereas the Lisp-y coding leaves
633
+ * the original list head intact in case there's another pointer to it.
634
+ */
635
+
636
+
637
+ /*
638
+ * Delete the last element of the list.
639
+ *
640
+ * This is the opposite of list_delete_first(), but is noticeably cheaper
641
+ * with a long list, since no data need be moved.
642
+ */
643
+
644
+
645
+ /*
646
+ * Generate the union of two lists. This is calculated by copying
647
+ * list1 via list_copy(), then adding to it all the members of list2
648
+ * that aren't already in list1.
649
+ *
650
+ * Whether an element is already a member of the list is determined
651
+ * via equal().
652
+ *
653
+ * The returned list is newly-allocated, although the content of the
654
+ * cells is the same (i.e. any pointed-to objects are not copied).
655
+ *
656
+ * NB: this function will NOT remove any duplicates that are present
657
+ * in list1 (so it only performs a "union" if list1 is known unique to
658
+ * start with). Also, if you are about to write "x = list_union(x, y)"
659
+ * you probably want to use list_concat_unique() instead to avoid wasting
660
+ * the storage of the old x list.
661
+ *
662
+ * This function could probably be implemented a lot faster if it is a
663
+ * performance bottleneck.
664
+ */
665
+
666
+
667
+ /*
668
+ * This variant of list_union() determines duplicates via simple
669
+ * pointer comparison.
670
+ */
671
+
672
+
673
+ /*
674
+ * This variant of list_union() operates upon lists of integers.
675
+ */
676
+
677
+
678
+ /*
679
+ * This variant of list_union() operates upon lists of OIDs.
680
+ */
681
+
682
+
683
+ /*
684
+ * Return a list that contains all the cells that are in both list1 and
685
+ * list2. The returned list is freshly allocated via palloc(), but the
686
+ * cells themselves point to the same objects as the cells of the
687
+ * input lists.
688
+ *
689
+ * Duplicate entries in list1 will not be suppressed, so it's only a true
690
+ * "intersection" if list1 is known unique beforehand.
691
+ *
692
+ * This variant works on lists of pointers, and determines list
693
+ * membership via equal(). Note that the list1 member will be pointed
694
+ * to in the result.
695
+ */
696
+
697
+
698
+ /*
699
+ * As list_intersection but operates on lists of integers.
700
+ */
701
+
702
+
703
+ /*
704
+ * Return a list that contains all the cells in list1 that are not in
705
+ * list2. The returned list is freshly allocated via palloc(), but the
706
+ * cells themselves point to the same objects as the cells of the
707
+ * input lists.
708
+ *
709
+ * This variant works on lists of pointers, and determines list
710
+ * membership via equal()
711
+ */
712
+
713
+
714
+ /*
715
+ * This variant of list_difference() determines list membership via
716
+ * simple pointer equality.
717
+ */
718
+
719
+
720
+ /*
721
+ * This variant of list_difference() operates upon lists of integers.
722
+ */
723
+
724
+
725
+ /*
726
+ * This variant of list_difference() operates upon lists of OIDs.
727
+ */
728
+
729
+
730
+ /*
731
+ * Append datum to list, but only if it isn't already in the list.
732
+ *
733
+ * Whether an element is already a member of the list is determined
734
+ * via equal().
735
+ */
736
+
737
+
738
+ /*
739
+ * This variant of list_append_unique() determines list membership via
740
+ * simple pointer equality.
741
+ */
742
+
743
+
744
+ /*
745
+ * This variant of list_append_unique() operates upon lists of integers.
746
+ */
747
+
748
+
749
+ /*
750
+ * This variant of list_append_unique() operates upon lists of OIDs.
751
+ */
752
+
753
+
754
+ /*
755
+ * Append to list1 each member of list2 that isn't already in list1.
756
+ *
757
+ * Whether an element is already a member of the list is determined
758
+ * via equal().
759
+ *
760
+ * This is almost the same functionality as list_union(), but list1 is
761
+ * modified in-place rather than being copied. However, callers of this
762
+ * function may have strict ordering expectations -- i.e. that the relative
763
+ * order of those list2 elements that are not duplicates is preserved.
764
+ */
765
+
766
+
767
+ /*
768
+ * This variant of list_concat_unique() determines list membership via
769
+ * simple pointer equality.
770
+ */
771
+
772
+
773
+ /*
774
+ * This variant of list_concat_unique() operates upon lists of integers.
775
+ */
776
+
777
+
778
+ /*
779
+ * This variant of list_concat_unique() operates upon lists of OIDs.
780
+ */
781
+
782
+
783
+ /*
784
+ * Remove adjacent duplicates in a list of OIDs.
785
+ *
786
+ * It is caller's responsibility to have sorted the list to bring duplicates
787
+ * together, perhaps via list_sort(list, list_oid_cmp).
788
+ */
789
+
790
+
791
+ /*
792
+ * Free all storage in a list, and optionally the pointed-to elements
793
+ */
794
+ static void
795
+ list_free_private(List *list, bool deep)
796
+ {
797
+ if (list == NIL)
798
+ return; /* nothing to do */
799
+
800
+ check_list_invariants(list);
801
+
802
+ if (deep)
803
+ {
804
+ for (int i = 0; i < list->length; i++)
805
+ pfree(lfirst(&list->elements[i]));
806
+ }
807
+ if (list->elements != list->initial_elements)
808
+ pfree(list->elements);
809
+ pfree(list);
810
+ }
811
+
812
+ /*
813
+ * Free all the cells of the list, as well as the list itself. Any
814
+ * objects that are pointed-to by the cells of the list are NOT
815
+ * free'd.
816
+ *
817
+ * On return, the argument to this function has been freed, so the
818
+ * caller would be wise to set it to NIL for safety's sake.
819
+ */
820
+ void
821
+ list_free(List *list)
822
+ {
823
+ list_free_private(list, false);
824
+ }
825
+
826
+ /*
827
+ * Free all the cells of the list, the list itself, and all the
828
+ * objects pointed-to by the cells of the list (each element in the
829
+ * list must contain a pointer to a palloc()'d region of memory!)
830
+ *
831
+ * On return, the argument to this function has been freed, so the
832
+ * caller would be wise to set it to NIL for safety's sake.
833
+ */
834
+
835
+
836
+ /*
837
+ * Return a shallow copy of the specified list.
838
+ */
839
+ List *
840
+ list_copy(const List *oldlist)
841
+ {
842
+ List *newlist;
843
+
844
+ if (oldlist == NIL)
845
+ return NIL;
846
+
847
+ newlist = new_list(oldlist->type, oldlist->length);
848
+ memcpy(newlist->elements, oldlist->elements,
849
+ newlist->length * sizeof(ListCell));
850
+
851
+ check_list_invariants(newlist);
852
+ return newlist;
853
+ }
854
+
855
+ /*
856
+ * Return a shallow copy of the specified list, without the first N elements.
857
+ */
858
+ List *
859
+ list_copy_tail(const List *oldlist, int nskip)
860
+ {
861
+ List *newlist;
862
+
863
+ if (nskip < 0)
864
+ nskip = 0; /* would it be better to elog? */
865
+
866
+ if (oldlist == NIL || nskip >= oldlist->length)
867
+ return NIL;
868
+
869
+ newlist = new_list(oldlist->type, oldlist->length - nskip);
870
+ memcpy(newlist->elements, &oldlist->elements[nskip],
871
+ newlist->length * sizeof(ListCell));
872
+
873
+ check_list_invariants(newlist);
874
+ return newlist;
875
+ }
876
+
877
+ /*
878
+ * Return a deep copy of the specified list.
879
+ *
880
+ * The list elements are copied via copyObject(), so that this function's
881
+ * idea of a "deep" copy is considerably deeper than what list_free_deep()
882
+ * means by the same word.
883
+ */
884
+ List *
885
+ list_copy_deep(const List *oldlist)
886
+ {
887
+ List *newlist;
888
+
889
+ if (oldlist == NIL)
890
+ return NIL;
891
+
892
+ /* This is only sensible for pointer Lists */
893
+ Assert(IsA(oldlist, List));
894
+
895
+ newlist = new_list(oldlist->type, oldlist->length);
896
+ for (int i = 0; i < newlist->length; i++)
897
+ lfirst(&newlist->elements[i]) =
898
+ copyObjectImpl(lfirst(&oldlist->elements[i]));
899
+
900
+ check_list_invariants(newlist);
901
+ return newlist;
902
+ }
903
+
904
+ /*
905
+ * Sort a list according to the specified comparator function.
906
+ *
907
+ * The list is sorted in-place.
908
+ *
909
+ * The comparator function is declared to receive arguments of type
910
+ * const ListCell *; this allows it to use lfirst() and variants
911
+ * without casting its arguments. Otherwise it behaves the same as
912
+ * the comparator function for standard qsort().
913
+ *
914
+ * Like qsort(), this provides no guarantees about sort stability
915
+ * for equal keys.
916
+ */
917
+
918
+
919
+ /*
920
+ * list_sort comparator for sorting a list into ascending OID order.
921
+ */
922
+