embedded-postgres 18.6.0__py3-none-win_amd64.whl

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 (1378) hide show
  1. embedded_postgres/__init__.py +2 -0
  2. embedded_postgres/_commands.py +71 -0
  3. embedded_postgres/pginstall/bin/clusterdb.exe +0 -0
  4. embedded_postgres/pginstall/bin/createdb.exe +0 -0
  5. embedded_postgres/pginstall/bin/createuser.exe +0 -0
  6. embedded_postgres/pginstall/bin/dropdb.exe +0 -0
  7. embedded_postgres/pginstall/bin/dropuser.exe +0 -0
  8. embedded_postgres/pginstall/bin/ecpg.exe +0 -0
  9. embedded_postgres/pginstall/bin/initdb.exe +0 -0
  10. embedded_postgres/pginstall/bin/libecpg.dll +0 -0
  11. embedded_postgres/pginstall/bin/libecpg_compat.dll +0 -0
  12. embedded_postgres/pginstall/bin/libpgtypes.dll +0 -0
  13. embedded_postgres/pginstall/bin/libpq.dll +0 -0
  14. embedded_postgres/pginstall/bin/oid2name.exe +0 -0
  15. embedded_postgres/pginstall/bin/pg_amcheck.exe +0 -0
  16. embedded_postgres/pginstall/bin/pg_archivecleanup.exe +0 -0
  17. embedded_postgres/pginstall/bin/pg_basebackup.exe +0 -0
  18. embedded_postgres/pginstall/bin/pg_checksums.exe +0 -0
  19. embedded_postgres/pginstall/bin/pg_combinebackup.exe +0 -0
  20. embedded_postgres/pginstall/bin/pg_config.exe +0 -0
  21. embedded_postgres/pginstall/bin/pg_controldata.exe +0 -0
  22. embedded_postgres/pginstall/bin/pg_createsubscriber.exe +0 -0
  23. embedded_postgres/pginstall/bin/pg_ctl.exe +0 -0
  24. embedded_postgres/pginstall/bin/pg_dump.exe +0 -0
  25. embedded_postgres/pginstall/bin/pg_dumpall.exe +0 -0
  26. embedded_postgres/pginstall/bin/pg_isready.exe +0 -0
  27. embedded_postgres/pginstall/bin/pg_receivewal.exe +0 -0
  28. embedded_postgres/pginstall/bin/pg_recvlogical.exe +0 -0
  29. embedded_postgres/pginstall/bin/pg_resetwal.exe +0 -0
  30. embedded_postgres/pginstall/bin/pg_restore.exe +0 -0
  31. embedded_postgres/pginstall/bin/pg_rewind.exe +0 -0
  32. embedded_postgres/pginstall/bin/pg_test_fsync.exe +0 -0
  33. embedded_postgres/pginstall/bin/pg_test_timing.exe +0 -0
  34. embedded_postgres/pginstall/bin/pg_upgrade.exe +0 -0
  35. embedded_postgres/pginstall/bin/pg_verifybackup.exe +0 -0
  36. embedded_postgres/pginstall/bin/pg_waldump.exe +0 -0
  37. embedded_postgres/pginstall/bin/pg_walsummary.exe +0 -0
  38. embedded_postgres/pginstall/bin/pgbench.exe +0 -0
  39. embedded_postgres/pginstall/bin/postgres.exe +0 -0
  40. embedded_postgres/pginstall/bin/psql.exe +0 -0
  41. embedded_postgres/pginstall/bin/reindexdb.exe +0 -0
  42. embedded_postgres/pginstall/bin/vacuumdb.exe +0 -0
  43. embedded_postgres/pginstall/bin/vacuumlo.exe +0 -0
  44. embedded_postgres/pginstall/include/ecpg_config.h +9 -0
  45. embedded_postgres/pginstall/include/ecpg_informix.h +90 -0
  46. embedded_postgres/pginstall/include/ecpgerrno.h +80 -0
  47. embedded_postgres/pginstall/include/ecpglib.h +79 -0
  48. embedded_postgres/pginstall/include/ecpgtype.h +109 -0
  49. embedded_postgres/pginstall/include/informix/esql/datetime.h +14 -0
  50. embedded_postgres/pginstall/include/informix/esql/decimal.h +13 -0
  51. embedded_postgres/pginstall/include/informix/esql/sqltypes.h +59 -0
  52. embedded_postgres/pginstall/include/internal/c.h +1364 -0
  53. embedded_postgres/pginstall/include/internal/fe-auth-sasl.h +153 -0
  54. embedded_postgres/pginstall/include/internal/libpq/pqcomm.h +175 -0
  55. embedded_postgres/pginstall/include/internal/libpq/protocol.h +89 -0
  56. embedded_postgres/pginstall/include/internal/libpq-int.h +980 -0
  57. embedded_postgres/pginstall/include/internal/port.h +565 -0
  58. embedded_postgres/pginstall/include/internal/postgres_fe.h +34 -0
  59. embedded_postgres/pginstall/include/internal/pqexpbuffer.h +192 -0
  60. embedded_postgres/pginstall/include/libpq/libpq-fs.h +24 -0
  61. embedded_postgres/pginstall/include/libpq-events.h +94 -0
  62. embedded_postgres/pginstall/include/libpq-fe.h +837 -0
  63. embedded_postgres/pginstall/include/pg_config.h +824 -0
  64. embedded_postgres/pginstall/include/pg_config_manual.h +363 -0
  65. embedded_postgres/pginstall/include/pg_config_os.h +59 -0
  66. embedded_postgres/pginstall/include/pgtypes.h +17 -0
  67. embedded_postgres/pginstall/include/pgtypes_date.h +32 -0
  68. embedded_postgres/pginstall/include/pgtypes_error.h +18 -0
  69. embedded_postgres/pginstall/include/pgtypes_interval.h +40 -0
  70. embedded_postgres/pginstall/include/pgtypes_numeric.h +69 -0
  71. embedded_postgres/pginstall/include/pgtypes_timestamp.h +31 -0
  72. embedded_postgres/pginstall/include/postgres_ext.h +74 -0
  73. embedded_postgres/pginstall/include/server/access/amapi.h +332 -0
  74. embedded_postgres/pginstall/include/server/access/amvalidate.h +40 -0
  75. embedded_postgres/pginstall/include/server/access/attmap.h +54 -0
  76. embedded_postgres/pginstall/include/server/access/attnum.h +64 -0
  77. embedded_postgres/pginstall/include/server/access/brin.h +58 -0
  78. embedded_postgres/pginstall/include/server/access/brin_internal.h +116 -0
  79. embedded_postgres/pginstall/include/server/access/brin_page.h +96 -0
  80. embedded_postgres/pginstall/include/server/access/brin_pageops.h +38 -0
  81. embedded_postgres/pginstall/include/server/access/brin_revmap.h +41 -0
  82. embedded_postgres/pginstall/include/server/access/brin_tuple.h +112 -0
  83. embedded_postgres/pginstall/include/server/access/brin_xlog.h +151 -0
  84. embedded_postgres/pginstall/include/server/access/bufmask.h +32 -0
  85. embedded_postgres/pginstall/include/server/access/clog.h +62 -0
  86. embedded_postgres/pginstall/include/server/access/cmptype.h +44 -0
  87. embedded_postgres/pginstall/include/server/access/commit_ts.h +73 -0
  88. embedded_postgres/pginstall/include/server/access/detoast.h +82 -0
  89. embedded_postgres/pginstall/include/server/access/genam.h +278 -0
  90. embedded_postgres/pginstall/include/server/access/generic_xlog.h +45 -0
  91. embedded_postgres/pginstall/include/server/access/gin.h +106 -0
  92. embedded_postgres/pginstall/include/server/access/gin_private.h +506 -0
  93. embedded_postgres/pginstall/include/server/access/gin_tuple.h +44 -0
  94. embedded_postgres/pginstall/include/server/access/ginblock.h +346 -0
  95. embedded_postgres/pginstall/include/server/access/ginxlog.h +216 -0
  96. embedded_postgres/pginstall/include/server/access/gist.h +253 -0
  97. embedded_postgres/pginstall/include/server/access/gist_private.h +571 -0
  98. embedded_postgres/pginstall/include/server/access/gistscan.h +24 -0
  99. embedded_postgres/pginstall/include/server/access/gistxlog.h +117 -0
  100. embedded_postgres/pginstall/include/server/access/hash.h +490 -0
  101. embedded_postgres/pginstall/include/server/access/hash_xlog.h +270 -0
  102. embedded_postgres/pginstall/include/server/access/heapam.h +455 -0
  103. embedded_postgres/pginstall/include/server/access/heapam_xlog.h +538 -0
  104. embedded_postgres/pginstall/include/server/access/heaptoast.h +149 -0
  105. embedded_postgres/pginstall/include/server/access/hio.h +62 -0
  106. embedded_postgres/pginstall/include/server/access/htup.h +89 -0
  107. embedded_postgres/pginstall/include/server/access/htup_details.h +923 -0
  108. embedded_postgres/pginstall/include/server/access/itup.h +186 -0
  109. embedded_postgres/pginstall/include/server/access/multixact.h +161 -0
  110. embedded_postgres/pginstall/include/server/access/nbtree.h +1367 -0
  111. embedded_postgres/pginstall/include/server/access/nbtxlog.h +367 -0
  112. embedded_postgres/pginstall/include/server/access/parallel.h +81 -0
  113. embedded_postgres/pginstall/include/server/access/printsimple.h +23 -0
  114. embedded_postgres/pginstall/include/server/access/printtup.h +35 -0
  115. embedded_postgres/pginstall/include/server/access/relation.h +28 -0
  116. embedded_postgres/pginstall/include/server/access/reloptions.h +260 -0
  117. embedded_postgres/pginstall/include/server/access/relscan.h +217 -0
  118. embedded_postgres/pginstall/include/server/access/rewriteheap.h +57 -0
  119. embedded_postgres/pginstall/include/server/access/rmgr.h +62 -0
  120. embedded_postgres/pginstall/include/server/access/rmgrdesc_utils.h +22 -0
  121. embedded_postgres/pginstall/include/server/access/rmgrlist.h +49 -0
  122. embedded_postgres/pginstall/include/server/access/sdir.h +67 -0
  123. embedded_postgres/pginstall/include/server/access/sequence.h +23 -0
  124. embedded_postgres/pginstall/include/server/access/session.h +44 -0
  125. embedded_postgres/pginstall/include/server/access/skey.h +151 -0
  126. embedded_postgres/pginstall/include/server/access/slru.h +218 -0
  127. embedded_postgres/pginstall/include/server/access/spgist.h +229 -0
  128. embedded_postgres/pginstall/include/server/access/spgist_private.h +549 -0
  129. embedded_postgres/pginstall/include/server/access/spgxlog.h +259 -0
  130. embedded_postgres/pginstall/include/server/access/stratnum.h +85 -0
  131. embedded_postgres/pginstall/include/server/access/subtrans.h +26 -0
  132. embedded_postgres/pginstall/include/server/access/syncscan.h +30 -0
  133. embedded_postgres/pginstall/include/server/access/sysattr.h +29 -0
  134. embedded_postgres/pginstall/include/server/access/table.h +28 -0
  135. embedded_postgres/pginstall/include/server/access/tableam.h +2060 -0
  136. embedded_postgres/pginstall/include/server/access/tidstore.h +54 -0
  137. embedded_postgres/pginstall/include/server/access/timeline.h +44 -0
  138. embedded_postgres/pginstall/include/server/access/toast_compression.h +73 -0
  139. embedded_postgres/pginstall/include/server/access/toast_helper.h +116 -0
  140. embedded_postgres/pginstall/include/server/access/toast_internals.h +63 -0
  141. embedded_postgres/pginstall/include/server/access/transam.h +418 -0
  142. embedded_postgres/pginstall/include/server/access/tsmapi.h +82 -0
  143. embedded_postgres/pginstall/include/server/access/tupconvert.h +54 -0
  144. embedded_postgres/pginstall/include/server/access/tupdesc.h +251 -0
  145. embedded_postgres/pginstall/include/server/access/tupdesc_details.h +28 -0
  146. embedded_postgres/pginstall/include/server/access/tupmacs.h +235 -0
  147. embedded_postgres/pginstall/include/server/access/twophase.h +70 -0
  148. embedded_postgres/pginstall/include/server/access/twophase_rmgr.h +40 -0
  149. embedded_postgres/pginstall/include/server/access/valid.h +58 -0
  150. embedded_postgres/pginstall/include/server/access/visibilitymap.h +48 -0
  151. embedded_postgres/pginstall/include/server/access/visibilitymapdefs.h +34 -0
  152. embedded_postgres/pginstall/include/server/access/xact.h +536 -0
  153. embedded_postgres/pginstall/include/server/access/xlog.h +317 -0
  154. embedded_postgres/pginstall/include/server/access/xlog_internal.h +405 -0
  155. embedded_postgres/pginstall/include/server/access/xlogarchive.h +35 -0
  156. embedded_postgres/pginstall/include/server/access/xlogbackup.h +43 -0
  157. embedded_postgres/pginstall/include/server/access/xlogdefs.h +83 -0
  158. embedded_postgres/pginstall/include/server/access/xloginsert.h +68 -0
  159. embedded_postgres/pginstall/include/server/access/xlogprefetcher.h +55 -0
  160. embedded_postgres/pginstall/include/server/access/xlogreader.h +444 -0
  161. embedded_postgres/pginstall/include/server/access/xlogrecord.h +248 -0
  162. embedded_postgres/pginstall/include/server/access/xlogrecovery.h +158 -0
  163. embedded_postgres/pginstall/include/server/access/xlogstats.h +43 -0
  164. embedded_postgres/pginstall/include/server/access/xlogutils.h +123 -0
  165. embedded_postgres/pginstall/include/server/archive/archive_module.h +67 -0
  166. embedded_postgres/pginstall/include/server/archive/shell_archive.h +24 -0
  167. embedded_postgres/pginstall/include/server/bootstrap/bootstrap.h +69 -0
  168. embedded_postgres/pginstall/include/server/c.h +1364 -0
  169. embedded_postgres/pginstall/include/server/catalog/binary_upgrade.h +38 -0
  170. embedded_postgres/pginstall/include/server/catalog/catalog.h +48 -0
  171. embedded_postgres/pginstall/include/server/catalog/catversion.h +62 -0
  172. embedded_postgres/pginstall/include/server/catalog/dependency.h +234 -0
  173. embedded_postgres/pginstall/include/server/catalog/genbki.h +149 -0
  174. embedded_postgres/pginstall/include/server/catalog/heap.h +168 -0
  175. embedded_postgres/pginstall/include/server/catalog/index.h +220 -0
  176. embedded_postgres/pginstall/include/server/catalog/indexing.h +54 -0
  177. embedded_postgres/pginstall/include/server/catalog/namespace.h +189 -0
  178. embedded_postgres/pginstall/include/server/catalog/objectaccess.h +267 -0
  179. embedded_postgres/pginstall/include/server/catalog/objectaddress.h +93 -0
  180. embedded_postgres/pginstall/include/server/catalog/partition.h +34 -0
  181. embedded_postgres/pginstall/include/server/catalog/pg_aggregate.h +182 -0
  182. embedded_postgres/pginstall/include/server/catalog/pg_aggregate_d.h +85 -0
  183. embedded_postgres/pginstall/include/server/catalog/pg_am.h +66 -0
  184. embedded_postgres/pginstall/include/server/catalog/pg_am_d.h +54 -0
  185. embedded_postgres/pginstall/include/server/catalog/pg_amop.h +105 -0
  186. embedded_postgres/pginstall/include/server/catalog/pg_amop_d.h +51 -0
  187. embedded_postgres/pginstall/include/server/catalog/pg_amproc.h +75 -0
  188. embedded_postgres/pginstall/include/server/catalog/pg_amproc_d.h +42 -0
  189. embedded_postgres/pginstall/include/server/catalog/pg_attrdef.h +69 -0
  190. embedded_postgres/pginstall/include/server/catalog/pg_attrdef_d.h +40 -0
  191. embedded_postgres/pginstall/include/server/catalog/pg_attribute.h +234 -0
  192. embedded_postgres/pginstall/include/server/catalog/pg_attribute_d.h +69 -0
  193. embedded_postgres/pginstall/include/server/catalog/pg_auth_members.h +56 -0
  194. embedded_postgres/pginstall/include/server/catalog/pg_auth_members_d.h +46 -0
  195. embedded_postgres/pginstall/include/server/catalog/pg_authid.h +64 -0
  196. embedded_postgres/pginstall/include/server/catalog/pg_authid_d.h +66 -0
  197. embedded_postgres/pginstall/include/server/catalog/pg_cast.h +106 -0
  198. embedded_postgres/pginstall/include/server/catalog/pg_cast_d.h +71 -0
  199. embedded_postgres/pginstall/include/server/catalog/pg_class.h +238 -0
  200. embedded_postgres/pginstall/include/server/catalog/pg_class_d.h +140 -0
  201. embedded_postgres/pginstall/include/server/catalog/pg_collation.h +106 -0
  202. embedded_postgres/pginstall/include/server/catalog/pg_collation_d.h +72 -0
  203. embedded_postgres/pginstall/include/server/catalog/pg_constraint.h +301 -0
  204. embedded_postgres/pginstall/include/server/catalog/pg_constraint_d.h +83 -0
  205. embedded_postgres/pginstall/include/server/catalog/pg_control.h +266 -0
  206. embedded_postgres/pginstall/include/server/catalog/pg_conversion.h +79 -0
  207. embedded_postgres/pginstall/include/server/catalog/pg_conversion_d.h +45 -0
  208. embedded_postgres/pginstall/include/server/catalog/pg_database.h +129 -0
  209. embedded_postgres/pginstall/include/server/catalog/pg_database_d.h +60 -0
  210. embedded_postgres/pginstall/include/server/catalog/pg_db_role_setting.h +61 -0
  211. embedded_postgres/pginstall/include/server/catalog/pg_db_role_setting_d.h +40 -0
  212. embedded_postgres/pginstall/include/server/catalog/pg_default_acl.h +75 -0
  213. embedded_postgres/pginstall/include/server/catalog/pg_default_acl_d.h +54 -0
  214. embedded_postgres/pginstall/include/server/catalog/pg_depend.h +77 -0
  215. embedded_postgres/pginstall/include/server/catalog/pg_depend_d.h +43 -0
  216. embedded_postgres/pginstall/include/server/catalog/pg_description.h +73 -0
  217. embedded_postgres/pginstall/include/server/catalog/pg_description_d.h +39 -0
  218. embedded_postgres/pginstall/include/server/catalog/pg_enum.h +69 -0
  219. embedded_postgres/pginstall/include/server/catalog/pg_enum_d.h +41 -0
  220. embedded_postgres/pginstall/include/server/catalog/pg_event_trigger.h +60 -0
  221. embedded_postgres/pginstall/include/server/catalog/pg_event_trigger_d.h +43 -0
  222. embedded_postgres/pginstall/include/server/catalog/pg_extension.h +62 -0
  223. embedded_postgres/pginstall/include/server/catalog/pg_extension_d.h +44 -0
  224. embedded_postgres/pginstall/include/server/catalog/pg_foreign_data_wrapper.h +61 -0
  225. embedded_postgres/pginstall/include/server/catalog/pg_foreign_data_wrapper_d.h +43 -0
  226. embedded_postgres/pginstall/include/server/catalog/pg_foreign_server.h +58 -0
  227. embedded_postgres/pginstall/include/server/catalog/pg_foreign_server_d.h +44 -0
  228. embedded_postgres/pginstall/include/server/catalog/pg_foreign_table.h +51 -0
  229. embedded_postgres/pginstall/include/server/catalog/pg_foreign_table_d.h +38 -0
  230. embedded_postgres/pginstall/include/server/catalog/pg_index.h +94 -0
  231. embedded_postgres/pginstall/include/server/catalog/pg_index_d.h +68 -0
  232. embedded_postgres/pginstall/include/server/catalog/pg_inherits.h +67 -0
  233. embedded_postgres/pginstall/include/server/catalog/pg_inherits_d.h +40 -0
  234. embedded_postgres/pginstall/include/server/catalog/pg_init_privs.h +83 -0
  235. embedded_postgres/pginstall/include/server/catalog/pg_init_privs_d.h +40 -0
  236. embedded_postgres/pginstall/include/server/catalog/pg_language.h +75 -0
  237. embedded_postgres/pginstall/include/server/catalog/pg_language_d.h +48 -0
  238. embedded_postgres/pginstall/include/server/catalog/pg_largeobject.h +55 -0
  239. embedded_postgres/pginstall/include/server/catalog/pg_largeobject_d.h +38 -0
  240. embedded_postgres/pginstall/include/server/catalog/pg_largeobject_metadata.h +51 -0
  241. embedded_postgres/pginstall/include/server/catalog/pg_largeobject_metadata_d.h +38 -0
  242. embedded_postgres/pginstall/include/server/catalog/pg_namespace.h +67 -0
  243. embedded_postgres/pginstall/include/server/catalog/pg_namespace_d.h +43 -0
  244. embedded_postgres/pginstall/include/server/catalog/pg_opclass.h +91 -0
  245. embedded_postgres/pginstall/include/server/catalog/pg_opclass_d.h +58 -0
  246. embedded_postgres/pginstall/include/server/catalog/pg_operator.h +124 -0
  247. embedded_postgres/pginstall/include/server/catalog/pg_operator_d.h +153 -0
  248. embedded_postgres/pginstall/include/server/catalog/pg_opfamily.h +67 -0
  249. embedded_postgres/pginstall/include/server/catalog/pg_opfamily_d.h +58 -0
  250. embedded_postgres/pginstall/include/server/catalog/pg_parameter_acl.h +62 -0
  251. embedded_postgres/pginstall/include/server/catalog/pg_parameter_acl_d.h +41 -0
  252. embedded_postgres/pginstall/include/server/catalog/pg_partitioned_table.h +76 -0
  253. embedded_postgres/pginstall/include/server/catalog/pg_partitioned_table_d.h +43 -0
  254. embedded_postgres/pginstall/include/server/catalog/pg_policy.h +58 -0
  255. embedded_postgres/pginstall/include/server/catalog/pg_policy_d.h +44 -0
  256. embedded_postgres/pginstall/include/server/catalog/pg_proc.h +224 -0
  257. embedded_postgres/pginstall/include/server/catalog/pg_proc_d.h +108 -0
  258. embedded_postgres/pginstall/include/server/catalog/pg_publication.h +194 -0
  259. embedded_postgres/pginstall/include/server/catalog/pg_publication_d.h +57 -0
  260. embedded_postgres/pginstall/include/server/catalog/pg_publication_namespace.h +50 -0
  261. embedded_postgres/pginstall/include/server/catalog/pg_publication_namespace_d.h +39 -0
  262. embedded_postgres/pginstall/include/server/catalog/pg_publication_rel.h +57 -0
  263. embedded_postgres/pginstall/include/server/catalog/pg_publication_rel_d.h +42 -0
  264. embedded_postgres/pginstall/include/server/catalog/pg_range.h +75 -0
  265. embedded_postgres/pginstall/include/server/catalog/pg_range_d.h +43 -0
  266. embedded_postgres/pginstall/include/server/catalog/pg_replication_origin.h +63 -0
  267. embedded_postgres/pginstall/include/server/catalog/pg_replication_origin_d.h +38 -0
  268. embedded_postgres/pginstall/include/server/catalog/pg_rewrite.h +61 -0
  269. embedded_postgres/pginstall/include/server/catalog/pg_rewrite_d.h +44 -0
  270. embedded_postgres/pginstall/include/server/catalog/pg_seclabel.h +45 -0
  271. embedded_postgres/pginstall/include/server/catalog/pg_seclabel_d.h +40 -0
  272. embedded_postgres/pginstall/include/server/catalog/pg_sequence.h +46 -0
  273. embedded_postgres/pginstall/include/server/catalog/pg_sequence_d.h +43 -0
  274. embedded_postgres/pginstall/include/server/catalog/pg_shdepend.h +78 -0
  275. embedded_postgres/pginstall/include/server/catalog/pg_shdepend_d.h +43 -0
  276. embedded_postgres/pginstall/include/server/catalog/pg_shdescription.h +65 -0
  277. embedded_postgres/pginstall/include/server/catalog/pg_shdescription_d.h +40 -0
  278. embedded_postgres/pginstall/include/server/catalog/pg_shseclabel.h +46 -0
  279. embedded_postgres/pginstall/include/server/catalog/pg_shseclabel_d.h +42 -0
  280. embedded_postgres/pginstall/include/server/catalog/pg_statistic.h +288 -0
  281. embedded_postgres/pginstall/include/server/catalog/pg_statistic_d.h +206 -0
  282. embedded_postgres/pginstall/include/server/catalog/pg_statistic_ext.h +91 -0
  283. embedded_postgres/pginstall/include/server/catalog/pg_statistic_ext_d.h +52 -0
  284. embedded_postgres/pginstall/include/server/catalog/pg_statistic_ext_data.h +61 -0
  285. embedded_postgres/pginstall/include/server/catalog/pg_statistic_ext_data_d.h +41 -0
  286. embedded_postgres/pginstall/include/server/catalog/pg_subscription.h +190 -0
  287. embedded_postgres/pginstall/include/server/catalog/pg_subscription_d.h +93 -0
  288. embedded_postgres/pginstall/include/server/catalog/pg_subscription_rel.h +95 -0
  289. embedded_postgres/pginstall/include/server/catalog/pg_subscription_rel_d.h +58 -0
  290. embedded_postgres/pginstall/include/server/catalog/pg_tablespace.h +57 -0
  291. embedded_postgres/pginstall/include/server/catalog/pg_tablespace_d.h +45 -0
  292. embedded_postgres/pginstall/include/server/catalog/pg_transform.h +51 -0
  293. embedded_postgres/pginstall/include/server/catalog/pg_transform_d.h +41 -0
  294. embedded_postgres/pginstall/include/server/catalog/pg_trigger.h +153 -0
  295. embedded_postgres/pginstall/include/server/catalog/pg_trigger_d.h +116 -0
  296. embedded_postgres/pginstall/include/server/catalog/pg_ts_config.h +56 -0
  297. embedded_postgres/pginstall/include/server/catalog/pg_ts_config_d.h +41 -0
  298. embedded_postgres/pginstall/include/server/catalog/pg_ts_config_map.h +51 -0
  299. embedded_postgres/pginstall/include/server/catalog/pg_ts_config_map_d.h +39 -0
  300. embedded_postgres/pginstall/include/server/catalog/pg_ts_dict.h +62 -0
  301. embedded_postgres/pginstall/include/server/catalog/pg_ts_dict_d.h +42 -0
  302. embedded_postgres/pginstall/include/server/catalog/pg_ts_parser.h +63 -0
  303. embedded_postgres/pginstall/include/server/catalog/pg_ts_parser_d.h +44 -0
  304. embedded_postgres/pginstall/include/server/catalog/pg_ts_template.h +54 -0
  305. embedded_postgres/pginstall/include/server/catalog/pg_ts_template_d.h +41 -0
  306. embedded_postgres/pginstall/include/server/catalog/pg_type.h +407 -0
  307. embedded_postgres/pginstall/include/server/catalog/pg_type_d.h +331 -0
  308. embedded_postgres/pginstall/include/server/catalog/pg_user_mapping.h +58 -0
  309. embedded_postgres/pginstall/include/server/catalog/pg_user_mapping_d.h +40 -0
  310. embedded_postgres/pginstall/include/server/catalog/schemapg.h +242 -0
  311. embedded_postgres/pginstall/include/server/catalog/storage.h +50 -0
  312. embedded_postgres/pginstall/include/server/catalog/storage_xlog.h +59 -0
  313. embedded_postgres/pginstall/include/server/catalog/syscache_ids.h +106 -0
  314. embedded_postgres/pginstall/include/server/catalog/syscache_info.h +581 -0
  315. embedded_postgres/pginstall/include/server/catalog/system_fk_info.h +253 -0
  316. embedded_postgres/pginstall/include/server/catalog/toasting.h +30 -0
  317. embedded_postgres/pginstall/include/server/commands/alter.h +34 -0
  318. embedded_postgres/pginstall/include/server/commands/async.h +52 -0
  319. embedded_postgres/pginstall/include/server/commands/cluster.h +51 -0
  320. embedded_postgres/pginstall/include/server/commands/collationcmds.h +25 -0
  321. embedded_postgres/pginstall/include/server/commands/comment.h +45 -0
  322. embedded_postgres/pginstall/include/server/commands/conversioncmds.h +23 -0
  323. embedded_postgres/pginstall/include/server/commands/copy.h +130 -0
  324. embedded_postgres/pginstall/include/server/commands/copyapi.h +105 -0
  325. embedded_postgres/pginstall/include/server/commands/copyfrom_internal.h +197 -0
  326. embedded_postgres/pginstall/include/server/commands/createas.h +34 -0
  327. embedded_postgres/pginstall/include/server/commands/dbcommands.h +37 -0
  328. embedded_postgres/pginstall/include/server/commands/dbcommands_xlog.h +60 -0
  329. embedded_postgres/pginstall/include/server/commands/defrem.h +165 -0
  330. embedded_postgres/pginstall/include/server/commands/discard.h +20 -0
  331. embedded_postgres/pginstall/include/server/commands/event_trigger.h +97 -0
  332. embedded_postgres/pginstall/include/server/commands/explain.h +84 -0
  333. embedded_postgres/pginstall/include/server/commands/explain_dr.h +32 -0
  334. embedded_postgres/pginstall/include/server/commands/explain_format.h +58 -0
  335. embedded_postgres/pginstall/include/server/commands/explain_state.h +100 -0
  336. embedded_postgres/pginstall/include/server/commands/extension.h +60 -0
  337. embedded_postgres/pginstall/include/server/commands/lockcmds.h +24 -0
  338. embedded_postgres/pginstall/include/server/commands/matview.h +36 -0
  339. embedded_postgres/pginstall/include/server/commands/policy.h +38 -0
  340. embedded_postgres/pginstall/include/server/commands/portalcmds.h +34 -0
  341. embedded_postgres/pginstall/include/server/commands/prepare.h +62 -0
  342. embedded_postgres/pginstall/include/server/commands/proclang.h +23 -0
  343. embedded_postgres/pginstall/include/server/commands/progress.h +160 -0
  344. embedded_postgres/pginstall/include/server/commands/publicationcmds.h +43 -0
  345. embedded_postgres/pginstall/include/server/commands/schemacmds.h +29 -0
  346. embedded_postgres/pginstall/include/server/commands/seclabel.h +34 -0
  347. embedded_postgres/pginstall/include/server/commands/sequence.h +70 -0
  348. embedded_postgres/pginstall/include/server/commands/subscriptioncmds.h +31 -0
  349. embedded_postgres/pginstall/include/server/commands/tablecmds.h +110 -0
  350. embedded_postgres/pginstall/include/server/commands/tablespace.h +71 -0
  351. embedded_postgres/pginstall/include/server/commands/trigger.h +292 -0
  352. embedded_postgres/pginstall/include/server/commands/typecmds.h +64 -0
  353. embedded_postgres/pginstall/include/server/commands/user.h +43 -0
  354. embedded_postgres/pginstall/include/server/commands/vacuum.h +410 -0
  355. embedded_postgres/pginstall/include/server/commands/view.h +25 -0
  356. embedded_postgres/pginstall/include/server/common/archive.h +21 -0
  357. embedded_postgres/pginstall/include/server/common/base64.h +19 -0
  358. embedded_postgres/pginstall/include/server/common/blkreftable.h +116 -0
  359. embedded_postgres/pginstall/include/server/common/checksum_helper.h +72 -0
  360. embedded_postgres/pginstall/include/server/common/compression.h +53 -0
  361. embedded_postgres/pginstall/include/server/common/config_info.h +21 -0
  362. embedded_postgres/pginstall/include/server/common/connect.h +28 -0
  363. embedded_postgres/pginstall/include/server/common/controldata_utils.h +21 -0
  364. embedded_postgres/pginstall/include/server/common/cryptohash.h +39 -0
  365. embedded_postgres/pginstall/include/server/common/fe_memutils.h +101 -0
  366. embedded_postgres/pginstall/include/server/common/file_perm.h +56 -0
  367. embedded_postgres/pginstall/include/server/common/file_utils.h +66 -0
  368. embedded_postgres/pginstall/include/server/common/hashfn.h +119 -0
  369. embedded_postgres/pginstall/include/server/common/hashfn_unstable.h +407 -0
  370. embedded_postgres/pginstall/include/server/common/hmac.h +30 -0
  371. embedded_postgres/pginstall/include/server/common/int.h +742 -0
  372. embedded_postgres/pginstall/include/server/common/int128.h +276 -0
  373. embedded_postgres/pginstall/include/server/common/ip.h +33 -0
  374. embedded_postgres/pginstall/include/server/common/jsonapi.h +267 -0
  375. embedded_postgres/pginstall/include/server/common/keywords.h +29 -0
  376. embedded_postgres/pginstall/include/server/common/kwlookup.h +44 -0
  377. embedded_postgres/pginstall/include/server/common/link-canary.h +17 -0
  378. embedded_postgres/pginstall/include/server/common/logging.h +163 -0
  379. embedded_postgres/pginstall/include/server/common/md5.h +37 -0
  380. embedded_postgres/pginstall/include/server/common/oauth-common.h +19 -0
  381. embedded_postgres/pginstall/include/server/common/openssl.h +43 -0
  382. embedded_postgres/pginstall/include/server/common/parse_manifest.h +57 -0
  383. embedded_postgres/pginstall/include/server/common/percentrepl.h +18 -0
  384. embedded_postgres/pginstall/include/server/common/pg_lzcompress.h +93 -0
  385. embedded_postgres/pginstall/include/server/common/pg_prng.h +62 -0
  386. embedded_postgres/pginstall/include/server/common/relpath.h +154 -0
  387. embedded_postgres/pginstall/include/server/common/restricted_token.h +24 -0
  388. embedded_postgres/pginstall/include/server/common/saslprep.h +30 -0
  389. embedded_postgres/pginstall/include/server/common/scram-common.h +70 -0
  390. embedded_postgres/pginstall/include/server/common/sha1.h +21 -0
  391. embedded_postgres/pginstall/include/server/common/sha2.h +32 -0
  392. embedded_postgres/pginstall/include/server/common/shortest_dec.h +63 -0
  393. embedded_postgres/pginstall/include/server/common/string.h +44 -0
  394. embedded_postgres/pginstall/include/server/common/unicode_case.h +35 -0
  395. embedded_postgres/pginstall/include/server/common/unicode_case_table.h +13630 -0
  396. embedded_postgres/pginstall/include/server/common/unicode_category.h +91 -0
  397. embedded_postgres/pginstall/include/server/common/unicode_category_table.h +7153 -0
  398. embedded_postgres/pginstall/include/server/common/unicode_east_asian_fw_table.h +126 -0
  399. embedded_postgres/pginstall/include/server/common/unicode_nonspacing_table.h +338 -0
  400. embedded_postgres/pginstall/include/server/common/unicode_norm.h +39 -0
  401. embedded_postgres/pginstall/include/server/common/unicode_norm_hashfunc.h +3016 -0
  402. embedded_postgres/pginstall/include/server/common/unicode_norm_table.h +9202 -0
  403. embedded_postgres/pginstall/include/server/common/unicode_normprops_table.h +8025 -0
  404. embedded_postgres/pginstall/include/server/common/unicode_version.h +14 -0
  405. embedded_postgres/pginstall/include/server/common/username.h +15 -0
  406. embedded_postgres/pginstall/include/server/datatype/timestamp.h +269 -0
  407. embedded_postgres/pginstall/include/server/executor/execAsync.h +25 -0
  408. embedded_postgres/pginstall/include/server/executor/execExpr.h +924 -0
  409. embedded_postgres/pginstall/include/server/executor/execParallel.h +51 -0
  410. embedded_postgres/pginstall/include/server/executor/execPartition.h +143 -0
  411. embedded_postgres/pginstall/include/server/executor/execScan.h +254 -0
  412. embedded_postgres/pginstall/include/server/executor/execdebug.h +130 -0
  413. embedded_postgres/pginstall/include/server/executor/execdesc.h +70 -0
  414. embedded_postgres/pginstall/include/server/executor/executor.h +789 -0
  415. embedded_postgres/pginstall/include/server/executor/functions.h +55 -0
  416. embedded_postgres/pginstall/include/server/executor/hashjoin.h +365 -0
  417. embedded_postgres/pginstall/include/server/executor/instrument.h +121 -0
  418. embedded_postgres/pginstall/include/server/executor/nodeAgg.h +341 -0
  419. embedded_postgres/pginstall/include/server/executor/nodeAppend.h +30 -0
  420. embedded_postgres/pginstall/include/server/executor/nodeBitmapAnd.h +24 -0
  421. embedded_postgres/pginstall/include/server/executor/nodeBitmapHeapscan.h +33 -0
  422. embedded_postgres/pginstall/include/server/executor/nodeBitmapIndexscan.h +30 -0
  423. embedded_postgres/pginstall/include/server/executor/nodeBitmapOr.h +24 -0
  424. embedded_postgres/pginstall/include/server/executor/nodeCtescan.h +23 -0
  425. embedded_postgres/pginstall/include/server/executor/nodeCustom.h +42 -0
  426. embedded_postgres/pginstall/include/server/executor/nodeForeignscan.h +38 -0
  427. embedded_postgres/pginstall/include/server/executor/nodeFunctionscan.h +23 -0
  428. embedded_postgres/pginstall/include/server/executor/nodeGather.h +24 -0
  429. embedded_postgres/pginstall/include/server/executor/nodeGatherMerge.h +26 -0
  430. embedded_postgres/pginstall/include/server/executor/nodeGroup.h +23 -0
  431. embedded_postgres/pginstall/include/server/executor/nodeHash.h +75 -0
  432. embedded_postgres/pginstall/include/server/executor/nodeHashjoin.h +34 -0
  433. embedded_postgres/pginstall/include/server/executor/nodeIncrementalSort.h +28 -0
  434. embedded_postgres/pginstall/include/server/executor/nodeIndexonlyscan.h +37 -0
  435. embedded_postgres/pginstall/include/server/executor/nodeIndexscan.h +48 -0
  436. embedded_postgres/pginstall/include/server/executor/nodeLimit.h +23 -0
  437. embedded_postgres/pginstall/include/server/executor/nodeLockRows.h +23 -0
  438. embedded_postgres/pginstall/include/server/executor/nodeMaterial.h +25 -0
  439. embedded_postgres/pginstall/include/server/executor/nodeMemoize.h +32 -0
  440. embedded_postgres/pginstall/include/server/executor/nodeMergeAppend.h +23 -0
  441. embedded_postgres/pginstall/include/server/executor/nodeMergejoin.h +23 -0
  442. embedded_postgres/pginstall/include/server/executor/nodeModifyTable.h +33 -0
  443. embedded_postgres/pginstall/include/server/executor/nodeNamedtuplestorescan.h +22 -0
  444. embedded_postgres/pginstall/include/server/executor/nodeNestloop.h +23 -0
  445. embedded_postgres/pginstall/include/server/executor/nodeProjectSet.h +23 -0
  446. embedded_postgres/pginstall/include/server/executor/nodeRecursiveunion.h +23 -0
  447. embedded_postgres/pginstall/include/server/executor/nodeResult.h +25 -0
  448. embedded_postgres/pginstall/include/server/executor/nodeSamplescan.h +23 -0
  449. embedded_postgres/pginstall/include/server/executor/nodeSeqscan.h +31 -0
  450. embedded_postgres/pginstall/include/server/executor/nodeSetOp.h +23 -0
  451. embedded_postgres/pginstall/include/server/executor/nodeSort.h +32 -0
  452. embedded_postgres/pginstall/include/server/executor/nodeSubplan.h +29 -0
  453. embedded_postgres/pginstall/include/server/executor/nodeSubqueryscan.h +23 -0
  454. embedded_postgres/pginstall/include/server/executor/nodeTableFuncscan.h +23 -0
  455. embedded_postgres/pginstall/include/server/executor/nodeTidrangescan.h +24 -0
  456. embedded_postgres/pginstall/include/server/executor/nodeTidscan.h +23 -0
  457. embedded_postgres/pginstall/include/server/executor/nodeUnique.h +23 -0
  458. embedded_postgres/pginstall/include/server/executor/nodeValuesscan.h +22 -0
  459. embedded_postgres/pginstall/include/server/executor/nodeWindowAgg.h +23 -0
  460. embedded_postgres/pginstall/include/server/executor/nodeWorktablescan.h +22 -0
  461. embedded_postgres/pginstall/include/server/executor/spi.h +207 -0
  462. embedded_postgres/pginstall/include/server/executor/spi_priv.h +105 -0
  463. embedded_postgres/pginstall/include/server/executor/tablefunc.h +67 -0
  464. embedded_postgres/pginstall/include/server/executor/tqueue.h +32 -0
  465. embedded_postgres/pginstall/include/server/executor/tstoreReceiver.h +31 -0
  466. embedded_postgres/pginstall/include/server/executor/tuptable.h +539 -0
  467. embedded_postgres/pginstall/include/server/extension/cube/cubedata.h +82 -0
  468. embedded_postgres/pginstall/include/server/extension/hstore/hstore.h +205 -0
  469. embedded_postgres/pginstall/include/server/extension/isn/isn.h +34 -0
  470. embedded_postgres/pginstall/include/server/extension/ltree/ltree.h +319 -0
  471. embedded_postgres/pginstall/include/server/extension/seg/segdata.h +33 -0
  472. embedded_postgres/pginstall/include/server/extension/vector/halfvec.h +77 -0
  473. embedded_postgres/pginstall/include/server/extension/vector/sparsevec.h +51 -0
  474. embedded_postgres/pginstall/include/server/extension/vector/vector.h +37 -0
  475. embedded_postgres/pginstall/include/server/fe_utils/archive.h +21 -0
  476. embedded_postgres/pginstall/include/server/fe_utils/astreamer.h +231 -0
  477. embedded_postgres/pginstall/include/server/fe_utils/cancel.h +32 -0
  478. embedded_postgres/pginstall/include/server/fe_utils/conditional.h +107 -0
  479. embedded_postgres/pginstall/include/server/fe_utils/connect_utils.h +48 -0
  480. embedded_postgres/pginstall/include/server/fe_utils/mbprint.h +30 -0
  481. embedded_postgres/pginstall/include/server/fe_utils/option_utils.h +28 -0
  482. embedded_postgres/pginstall/include/server/fe_utils/parallel_slot.h +77 -0
  483. embedded_postgres/pginstall/include/server/fe_utils/print.h +236 -0
  484. embedded_postgres/pginstall/include/server/fe_utils/psqlscan.h +98 -0
  485. embedded_postgres/pginstall/include/server/fe_utils/psqlscan_int.h +181 -0
  486. embedded_postgres/pginstall/include/server/fe_utils/query_utils.h +24 -0
  487. embedded_postgres/pginstall/include/server/fe_utils/recovery_gen.h +30 -0
  488. embedded_postgres/pginstall/include/server/fe_utils/simple_list.h +71 -0
  489. embedded_postgres/pginstall/include/server/fe_utils/string_utils.h +71 -0
  490. embedded_postgres/pginstall/include/server/fmgr.h +851 -0
  491. embedded_postgres/pginstall/include/server/foreign/fdwapi.h +294 -0
  492. embedded_postgres/pginstall/include/server/foreign/foreign.h +85 -0
  493. embedded_postgres/pginstall/include/server/funcapi.h +360 -0
  494. embedded_postgres/pginstall/include/server/getopt_long.h +37 -0
  495. embedded_postgres/pginstall/include/server/jit/SectionMemoryManager.h +226 -0
  496. embedded_postgres/pginstall/include/server/jit/jit.h +106 -0
  497. embedded_postgres/pginstall/include/server/jit/llvmjit.h +152 -0
  498. embedded_postgres/pginstall/include/server/jit/llvmjit_backport.h +22 -0
  499. embedded_postgres/pginstall/include/server/jit/llvmjit_emit.h +320 -0
  500. embedded_postgres/pginstall/include/server/lib/binaryheap.h +69 -0
  501. embedded_postgres/pginstall/include/server/lib/bipartite_match.h +46 -0
  502. embedded_postgres/pginstall/include/server/lib/bloomfilter.h +27 -0
  503. embedded_postgres/pginstall/include/server/lib/dshash.h +130 -0
  504. embedded_postgres/pginstall/include/server/lib/hyperloglog.h +68 -0
  505. embedded_postgres/pginstall/include/server/lib/ilist.h +1159 -0
  506. embedded_postgres/pginstall/include/server/lib/integerset.h +24 -0
  507. embedded_postgres/pginstall/include/server/lib/knapsack.h +16 -0
  508. embedded_postgres/pginstall/include/server/lib/pairingheap.h +102 -0
  509. embedded_postgres/pginstall/include/server/lib/qunique.h +67 -0
  510. embedded_postgres/pginstall/include/server/lib/radixtree.h +3026 -0
  511. embedded_postgres/pginstall/include/server/lib/rbtree.h +81 -0
  512. embedded_postgres/pginstall/include/server/lib/simplehash.h +1210 -0
  513. embedded_postgres/pginstall/include/server/lib/sort_template.h +445 -0
  514. embedded_postgres/pginstall/include/server/lib/stringinfo.h +270 -0
  515. embedded_postgres/pginstall/include/server/libpq/auth.h +54 -0
  516. embedded_postgres/pginstall/include/server/libpq/be-fsstubs.h +32 -0
  517. embedded_postgres/pginstall/include/server/libpq/be-gssapi-common.h +27 -0
  518. embedded_postgres/pginstall/include/server/libpq/crypt.h +60 -0
  519. embedded_postgres/pginstall/include/server/libpq/hba.h +191 -0
  520. embedded_postgres/pginstall/include/server/libpq/ifaddr.h +30 -0
  521. embedded_postgres/pginstall/include/server/libpq/libpq-be-fe-helpers.h +457 -0
  522. embedded_postgres/pginstall/include/server/libpq/libpq-be.h +370 -0
  523. embedded_postgres/pginstall/include/server/libpq/libpq-fs.h +24 -0
  524. embedded_postgres/pginstall/include/server/libpq/libpq.h +145 -0
  525. embedded_postgres/pginstall/include/server/libpq/oauth.h +101 -0
  526. embedded_postgres/pginstall/include/server/libpq/pg-gssapi.h +42 -0
  527. embedded_postgres/pginstall/include/server/libpq/pqcomm.h +175 -0
  528. embedded_postgres/pginstall/include/server/libpq/pqformat.h +209 -0
  529. embedded_postgres/pginstall/include/server/libpq/pqmq.h +24 -0
  530. embedded_postgres/pginstall/include/server/libpq/pqsignal.h +54 -0
  531. embedded_postgres/pginstall/include/server/libpq/protocol.h +89 -0
  532. embedded_postgres/pginstall/include/server/libpq/sasl.h +147 -0
  533. embedded_postgres/pginstall/include/server/libpq/scram.h +37 -0
  534. embedded_postgres/pginstall/include/server/mb/pg_wchar.h +802 -0
  535. embedded_postgres/pginstall/include/server/mb/stringinfo_mb.h +24 -0
  536. embedded_postgres/pginstall/include/server/miscadmin.h +543 -0
  537. embedded_postgres/pginstall/include/server/nodes/bitmapset.h +140 -0
  538. embedded_postgres/pginstall/include/server/nodes/execnodes.h +2924 -0
  539. embedded_postgres/pginstall/include/server/nodes/extensible.h +164 -0
  540. embedded_postgres/pginstall/include/server/nodes/lockoptions.h +61 -0
  541. embedded_postgres/pginstall/include/server/nodes/makefuncs.h +128 -0
  542. embedded_postgres/pginstall/include/server/nodes/memnodes.h +152 -0
  543. embedded_postgres/pginstall/include/server/nodes/miscnodes.h +57 -0
  544. embedded_postgres/pginstall/include/server/nodes/multibitmapset.h +39 -0
  545. embedded_postgres/pginstall/include/server/nodes/nodeFuncs.h +224 -0
  546. embedded_postgres/pginstall/include/server/nodes/nodes.h +441 -0
  547. embedded_postgres/pginstall/include/server/nodes/nodetags.h +496 -0
  548. embedded_postgres/pginstall/include/server/nodes/params.h +170 -0
  549. embedded_postgres/pginstall/include/server/nodes/parsenodes.h +4335 -0
  550. embedded_postgres/pginstall/include/server/nodes/pathnodes.h +3609 -0
  551. embedded_postgres/pginstall/include/server/nodes/pg_list.h +686 -0
  552. embedded_postgres/pginstall/include/server/nodes/plannodes.h +1767 -0
  553. embedded_postgres/pginstall/include/server/nodes/primnodes.h +2374 -0
  554. embedded_postgres/pginstall/include/server/nodes/print.h +34 -0
  555. embedded_postgres/pginstall/include/server/nodes/queryjumble.h +113 -0
  556. embedded_postgres/pginstall/include/server/nodes/readfuncs.h +38 -0
  557. embedded_postgres/pginstall/include/server/nodes/replnodes.h +132 -0
  558. embedded_postgres/pginstall/include/server/nodes/subscripting.h +167 -0
  559. embedded_postgres/pginstall/include/server/nodes/supportnodes.h +393 -0
  560. embedded_postgres/pginstall/include/server/nodes/tidbitmap.h +128 -0
  561. embedded_postgres/pginstall/include/server/nodes/value.h +90 -0
  562. embedded_postgres/pginstall/include/server/optimizer/appendinfo.h +50 -0
  563. embedded_postgres/pginstall/include/server/optimizer/clauses.h +72 -0
  564. embedded_postgres/pginstall/include/server/optimizer/cost.h +226 -0
  565. embedded_postgres/pginstall/include/server/optimizer/geqo.h +90 -0
  566. embedded_postgres/pginstall/include/server/optimizer/geqo_copy.h +30 -0
  567. embedded_postgres/pginstall/include/server/optimizer/geqo_gene.h +45 -0
  568. embedded_postgres/pginstall/include/server/optimizer/geqo_misc.h +34 -0
  569. embedded_postgres/pginstall/include/server/optimizer/geqo_mutation.h +30 -0
  570. embedded_postgres/pginstall/include/server/optimizer/geqo_pool.h +40 -0
  571. embedded_postgres/pginstall/include/server/optimizer/geqo_random.h +38 -0
  572. embedded_postgres/pginstall/include/server/optimizer/geqo_recombination.h +89 -0
  573. embedded_postgres/pginstall/include/server/optimizer/geqo_selection.h +33 -0
  574. embedded_postgres/pginstall/include/server/optimizer/inherit.h +29 -0
  575. embedded_postgres/pginstall/include/server/optimizer/joininfo.h +30 -0
  576. embedded_postgres/pginstall/include/server/optimizer/optimizer.h +215 -0
  577. embedded_postgres/pginstall/include/server/optimizer/orclauses.h +21 -0
  578. embedded_postgres/pginstall/include/server/optimizer/paramassign.h +39 -0
  579. embedded_postgres/pginstall/include/server/optimizer/pathnode.h +356 -0
  580. embedded_postgres/pginstall/include/server/optimizer/paths.h +282 -0
  581. embedded_postgres/pginstall/include/server/optimizer/placeholder.h +37 -0
  582. embedded_postgres/pginstall/include/server/optimizer/plancat.h +82 -0
  583. embedded_postgres/pginstall/include/server/optimizer/planmain.h +134 -0
  584. embedded_postgres/pginstall/include/server/optimizer/planner.h +62 -0
  585. embedded_postgres/pginstall/include/server/optimizer/prep.h +58 -0
  586. embedded_postgres/pginstall/include/server/optimizer/restrictinfo.h +93 -0
  587. embedded_postgres/pginstall/include/server/optimizer/subselect.h +46 -0
  588. embedded_postgres/pginstall/include/server/optimizer/tlist.h +61 -0
  589. embedded_postgres/pginstall/include/server/parser/analyze.h +68 -0
  590. embedded_postgres/pginstall/include/server/parser/kwlist.h +521 -0
  591. embedded_postgres/pginstall/include/server/parser/parse_agg.h +65 -0
  592. embedded_postgres/pginstall/include/server/parser/parse_clause.h +57 -0
  593. embedded_postgres/pginstall/include/server/parser/parse_coerce.h +105 -0
  594. embedded_postgres/pginstall/include/server/parser/parse_collate.h +27 -0
  595. embedded_postgres/pginstall/include/server/parser/parse_cte.h +24 -0
  596. embedded_postgres/pginstall/include/server/parser/parse_enr.h +22 -0
  597. embedded_postgres/pginstall/include/server/parser/parse_expr.h +25 -0
  598. embedded_postgres/pginstall/include/server/parser/parse_func.h +74 -0
  599. embedded_postgres/pginstall/include/server/parser/parse_merge.h +21 -0
  600. embedded_postgres/pginstall/include/server/parser/parse_node.h +368 -0
  601. embedded_postgres/pginstall/include/server/parser/parse_oper.h +68 -0
  602. embedded_postgres/pginstall/include/server/parser/parse_param.h +25 -0
  603. embedded_postgres/pginstall/include/server/parser/parse_relation.h +133 -0
  604. embedded_postgres/pginstall/include/server/parser/parse_target.h +58 -0
  605. embedded_postgres/pginstall/include/server/parser/parse_type.h +61 -0
  606. embedded_postgres/pginstall/include/server/parser/parse_utilcmd.h +44 -0
  607. embedded_postgres/pginstall/include/server/parser/parser.h +68 -0
  608. embedded_postgres/pginstall/include/server/parser/parsetree.h +61 -0
  609. embedded_postgres/pginstall/include/server/parser/scanner.h +150 -0
  610. embedded_postgres/pginstall/include/server/parser/scansup.h +27 -0
  611. embedded_postgres/pginstall/include/server/partitioning/partbounds.h +146 -0
  612. embedded_postgres/pginstall/include/server/partitioning/partdefs.h +26 -0
  613. embedded_postgres/pginstall/include/server/partitioning/partdesc.h +75 -0
  614. embedded_postgres/pginstall/include/server/partitioning/partprune.h +81 -0
  615. embedded_postgres/pginstall/include/server/pg_config.h +824 -0
  616. embedded_postgres/pginstall/include/server/pg_config_manual.h +363 -0
  617. embedded_postgres/pginstall/include/server/pg_config_os.h +59 -0
  618. embedded_postgres/pginstall/include/server/pg_getopt.h +57 -0
  619. embedded_postgres/pginstall/include/server/pg_trace.h +17 -0
  620. embedded_postgres/pginstall/include/server/pgstat.h +842 -0
  621. embedded_postgres/pginstall/include/server/pgtar.h +89 -0
  622. embedded_postgres/pginstall/include/server/pgtime.h +101 -0
  623. embedded_postgres/pginstall/include/server/plpgsql.h +1336 -0
  624. embedded_postgres/pginstall/include/server/port/atomics/arch-arm.h +32 -0
  625. embedded_postgres/pginstall/include/server/port/atomics/arch-ppc.h +256 -0
  626. embedded_postgres/pginstall/include/server/port/atomics/arch-x86.h +246 -0
  627. embedded_postgres/pginstall/include/server/port/atomics/fallback.h +42 -0
  628. embedded_postgres/pginstall/include/server/port/atomics/generic-gcc.h +327 -0
  629. embedded_postgres/pginstall/include/server/port/atomics/generic-msvc.h +115 -0
  630. embedded_postgres/pginstall/include/server/port/atomics/generic-sunpro.h +113 -0
  631. embedded_postgres/pginstall/include/server/port/atomics/generic.h +427 -0
  632. embedded_postgres/pginstall/include/server/port/atomics.h +611 -0
  633. embedded_postgres/pginstall/include/server/port/cygwin.h +23 -0
  634. embedded_postgres/pginstall/include/server/port/darwin.h +13 -0
  635. embedded_postgres/pginstall/include/server/port/freebsd.h +8 -0
  636. embedded_postgres/pginstall/include/server/port/linux.h +22 -0
  637. embedded_postgres/pginstall/include/server/port/netbsd.h +1 -0
  638. embedded_postgres/pginstall/include/server/port/openbsd.h +1 -0
  639. embedded_postgres/pginstall/include/server/port/pg_bitutils.h +445 -0
  640. embedded_postgres/pginstall/include/server/port/pg_bswap.h +161 -0
  641. embedded_postgres/pginstall/include/server/port/pg_crc32c.h +169 -0
  642. embedded_postgres/pginstall/include/server/port/pg_iovec.h +127 -0
  643. embedded_postgres/pginstall/include/server/port/pg_lfind.h +209 -0
  644. embedded_postgres/pginstall/include/server/port/pg_numa.h +42 -0
  645. embedded_postgres/pginstall/include/server/port/pg_pthread.h +41 -0
  646. embedded_postgres/pginstall/include/server/port/simd.h +422 -0
  647. embedded_postgres/pginstall/include/server/port/solaris.h +35 -0
  648. embedded_postgres/pginstall/include/server/port/win32/arpa/inet.h +3 -0
  649. embedded_postgres/pginstall/include/server/port/win32/dlfcn.h +1 -0
  650. embedded_postgres/pginstall/include/server/port/win32/grp.h +1 -0
  651. embedded_postgres/pginstall/include/server/port/win32/netdb.h +7 -0
  652. embedded_postgres/pginstall/include/server/port/win32/netinet/in.h +3 -0
  653. embedded_postgres/pginstall/include/server/port/win32/netinet/tcp.h +7 -0
  654. embedded_postgres/pginstall/include/server/port/win32/pwd.h +3 -0
  655. embedded_postgres/pginstall/include/server/port/win32/sys/resource.h +20 -0
  656. embedded_postgres/pginstall/include/server/port/win32/sys/select.h +3 -0
  657. embedded_postgres/pginstall/include/server/port/win32/sys/socket.h +34 -0
  658. embedded_postgres/pginstall/include/server/port/win32/sys/un.h +17 -0
  659. embedded_postgres/pginstall/include/server/port/win32/sys/wait.h +3 -0
  660. embedded_postgres/pginstall/include/server/port/win32.h +59 -0
  661. embedded_postgres/pginstall/include/server/port/win32_msvc/dirent.h +34 -0
  662. embedded_postgres/pginstall/include/server/port/win32_msvc/sys/file.h +1 -0
  663. embedded_postgres/pginstall/include/server/port/win32_msvc/sys/param.h +1 -0
  664. embedded_postgres/pginstall/include/server/port/win32_msvc/sys/time.h +1 -0
  665. embedded_postgres/pginstall/include/server/port/win32_msvc/unistd.h +9 -0
  666. embedded_postgres/pginstall/include/server/port/win32_msvc/utime.h +3 -0
  667. embedded_postgres/pginstall/include/server/port/win32_port.h +589 -0
  668. embedded_postgres/pginstall/include/server/port/win32ntdll.h +34 -0
  669. embedded_postgres/pginstall/include/server/port.h +565 -0
  670. embedded_postgres/pginstall/include/server/portability/instr_time.h +197 -0
  671. embedded_postgres/pginstall/include/server/portability/mem.h +48 -0
  672. embedded_postgres/pginstall/include/server/postgres.h +584 -0
  673. embedded_postgres/pginstall/include/server/postgres_ext.h +74 -0
  674. embedded_postgres/pginstall/include/server/postgres_fe.h +34 -0
  675. embedded_postgres/pginstall/include/server/postmaster/autovacuum.h +71 -0
  676. embedded_postgres/pginstall/include/server/postmaster/auxprocess.h +18 -0
  677. embedded_postgres/pginstall/include/server/postmaster/bgworker.h +164 -0
  678. embedded_postgres/pginstall/include/server/postmaster/bgworker_internals.h +57 -0
  679. embedded_postgres/pginstall/include/server/postmaster/bgwriter.h +45 -0
  680. embedded_postgres/pginstall/include/server/postmaster/fork_process.h +17 -0
  681. embedded_postgres/pginstall/include/server/postmaster/interrupt.h +32 -0
  682. embedded_postgres/pginstall/include/server/postmaster/pgarch.h +36 -0
  683. embedded_postgres/pginstall/include/server/postmaster/postmaster.h +145 -0
  684. embedded_postgres/pginstall/include/server/postmaster/startup.h +41 -0
  685. embedded_postgres/pginstall/include/server/postmaster/syslogger.h +105 -0
  686. embedded_postgres/pginstall/include/server/postmaster/walsummarizer.h +35 -0
  687. embedded_postgres/pginstall/include/server/postmaster/walwriter.h +23 -0
  688. embedded_postgres/pginstall/include/server/regex/regcustom.h +99 -0
  689. embedded_postgres/pginstall/include/server/regex/regerrs.h +83 -0
  690. embedded_postgres/pginstall/include/server/regex/regex.h +272 -0
  691. embedded_postgres/pginstall/include/server/regex/regexport.h +61 -0
  692. embedded_postgres/pginstall/include/server/regex/regguts.h +563 -0
  693. embedded_postgres/pginstall/include/server/replication/conflict.h +90 -0
  694. embedded_postgres/pginstall/include/server/replication/decode.h +34 -0
  695. embedded_postgres/pginstall/include/server/replication/logical.h +158 -0
  696. embedded_postgres/pginstall/include/server/replication/logicallauncher.h +34 -0
  697. embedded_postgres/pginstall/include/server/replication/logicalproto.h +280 -0
  698. embedded_postgres/pginstall/include/server/replication/logicalrelation.h +54 -0
  699. embedded_postgres/pginstall/include/server/replication/logicalworker.h +33 -0
  700. embedded_postgres/pginstall/include/server/replication/message.h +42 -0
  701. embedded_postgres/pginstall/include/server/replication/origin.h +83 -0
  702. embedded_postgres/pginstall/include/server/replication/output_plugin.h +250 -0
  703. embedded_postgres/pginstall/include/server/replication/pgoutput.h +39 -0
  704. embedded_postgres/pginstall/include/server/replication/reorderbuffer.h +783 -0
  705. embedded_postgres/pginstall/include/server/replication/slot.h +327 -0
  706. embedded_postgres/pginstall/include/server/replication/slotsync.h +45 -0
  707. embedded_postgres/pginstall/include/server/replication/snapbuild.h +101 -0
  708. embedded_postgres/pginstall/include/server/replication/snapbuild_internal.h +199 -0
  709. embedded_postgres/pginstall/include/server/replication/syncrep.h +110 -0
  710. embedded_postgres/pginstall/include/server/replication/walreceiver.h +513 -0
  711. embedded_postgres/pginstall/include/server/replication/walsender.h +75 -0
  712. embedded_postgres/pginstall/include/server/replication/walsender_private.h +155 -0
  713. embedded_postgres/pginstall/include/server/replication/worker_internal.h +354 -0
  714. embedded_postgres/pginstall/include/server/rewrite/prs2lock.h +46 -0
  715. embedded_postgres/pginstall/include/server/rewrite/rewriteDefine.h +44 -0
  716. embedded_postgres/pginstall/include/server/rewrite/rewriteHandler.h +44 -0
  717. embedded_postgres/pginstall/include/server/rewrite/rewriteManip.h +122 -0
  718. embedded_postgres/pginstall/include/server/rewrite/rewriteRemove.h +21 -0
  719. embedded_postgres/pginstall/include/server/rewrite/rewriteSearchCycle.h +21 -0
  720. embedded_postgres/pginstall/include/server/rewrite/rewriteSupport.h +26 -0
  721. embedded_postgres/pginstall/include/server/rewrite/rowsecurity.h +49 -0
  722. embedded_postgres/pginstall/include/server/snowball/header.h +67 -0
  723. embedded_postgres/pginstall/include/server/snowball/libstemmer/api.h +32 -0
  724. embedded_postgres/pginstall/include/server/snowball/libstemmer/header.h +61 -0
  725. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_basque.h +15 -0
  726. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_catalan.h +15 -0
  727. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_danish.h +15 -0
  728. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_dutch.h +15 -0
  729. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_english.h +15 -0
  730. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_finnish.h +15 -0
  731. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_french.h +15 -0
  732. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_german.h +15 -0
  733. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_indonesian.h +15 -0
  734. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_irish.h +15 -0
  735. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_italian.h +15 -0
  736. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_norwegian.h +15 -0
  737. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_porter.h +15 -0
  738. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_portuguese.h +15 -0
  739. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_spanish.h +15 -0
  740. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_1_swedish.h +15 -0
  741. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_ISO_8859_2_hungarian.h +15 -0
  742. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_KOI8_R_russian.h +15 -0
  743. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_arabic.h +15 -0
  744. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_armenian.h +15 -0
  745. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_basque.h +15 -0
  746. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_catalan.h +15 -0
  747. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_danish.h +15 -0
  748. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_dutch.h +15 -0
  749. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_english.h +15 -0
  750. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_estonian.h +15 -0
  751. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_finnish.h +15 -0
  752. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_french.h +15 -0
  753. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_german.h +15 -0
  754. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_greek.h +15 -0
  755. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_hindi.h +15 -0
  756. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_hungarian.h +15 -0
  757. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_indonesian.h +15 -0
  758. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_irish.h +15 -0
  759. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_italian.h +15 -0
  760. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_lithuanian.h +15 -0
  761. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_nepali.h +15 -0
  762. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_norwegian.h +15 -0
  763. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_porter.h +15 -0
  764. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_portuguese.h +15 -0
  765. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_romanian.h +15 -0
  766. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_russian.h +15 -0
  767. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_serbian.h +15 -0
  768. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_spanish.h +15 -0
  769. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_swedish.h +15 -0
  770. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_tamil.h +15 -0
  771. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_turkish.h +15 -0
  772. embedded_postgres/pginstall/include/server/snowball/libstemmer/stem_UTF_8_yiddish.h +15 -0
  773. embedded_postgres/pginstall/include/server/statistics/extended_stats_internal.h +130 -0
  774. embedded_postgres/pginstall/include/server/statistics/stat_utils.h +43 -0
  775. embedded_postgres/pginstall/include/server/statistics/statistics.h +130 -0
  776. embedded_postgres/pginstall/include/server/storage/aio.h +369 -0
  777. embedded_postgres/pginstall/include/server/storage/aio_internal.h +416 -0
  778. embedded_postgres/pginstall/include/server/storage/aio_subsys.h +37 -0
  779. embedded_postgres/pginstall/include/server/storage/aio_types.h +137 -0
  780. embedded_postgres/pginstall/include/server/storage/barrier.h +46 -0
  781. embedded_postgres/pginstall/include/server/storage/block.h +108 -0
  782. embedded_postgres/pginstall/include/server/storage/buf.h +46 -0
  783. embedded_postgres/pginstall/include/server/storage/buf_internals.h +494 -0
  784. embedded_postgres/pginstall/include/server/storage/buffile.h +59 -0
  785. embedded_postgres/pginstall/include/server/storage/bufmgr.h +424 -0
  786. embedded_postgres/pginstall/include/server/storage/bufpage.h +511 -0
  787. embedded_postgres/pginstall/include/server/storage/bulk_write.h +41 -0
  788. embedded_postgres/pginstall/include/server/storage/checksum.h +24 -0
  789. embedded_postgres/pginstall/include/server/storage/checksum_impl.h +215 -0
  790. embedded_postgres/pginstall/include/server/storage/condition_variable.h +73 -0
  791. embedded_postgres/pginstall/include/server/storage/copydir.h +28 -0
  792. embedded_postgres/pginstall/include/server/storage/dsm.h +61 -0
  793. embedded_postgres/pginstall/include/server/storage/dsm_impl.h +79 -0
  794. embedded_postgres/pginstall/include/server/storage/dsm_registry.h +23 -0
  795. embedded_postgres/pginstall/include/server/storage/fd.h +233 -0
  796. embedded_postgres/pginstall/include/server/storage/fileset.h +40 -0
  797. embedded_postgres/pginstall/include/server/storage/freespace.h +39 -0
  798. embedded_postgres/pginstall/include/server/storage/fsm_internals.h +72 -0
  799. embedded_postgres/pginstall/include/server/storage/indexfsm.h +26 -0
  800. embedded_postgres/pginstall/include/server/storage/io_worker.h +22 -0
  801. embedded_postgres/pginstall/include/server/storage/ipc.h +87 -0
  802. embedded_postgres/pginstall/include/server/storage/item.h +19 -0
  803. embedded_postgres/pginstall/include/server/storage/itemid.h +184 -0
  804. embedded_postgres/pginstall/include/server/storage/itemptr.h +245 -0
  805. embedded_postgres/pginstall/include/server/storage/large_object.h +100 -0
  806. embedded_postgres/pginstall/include/server/storage/latch.h +140 -0
  807. embedded_postgres/pginstall/include/server/storage/lmgr.h +127 -0
  808. embedded_postgres/pginstall/include/server/storage/lock.h +630 -0
  809. embedded_postgres/pginstall/include/server/storage/lockdefs.h +61 -0
  810. embedded_postgres/pginstall/include/server/storage/lwlock.h +234 -0
  811. embedded_postgres/pginstall/include/server/storage/lwlocklist.h +86 -0
  812. embedded_postgres/pginstall/include/server/storage/lwlocknames.h +48 -0
  813. embedded_postgres/pginstall/include/server/storage/md.h +65 -0
  814. embedded_postgres/pginstall/include/server/storage/off.h +57 -0
  815. embedded_postgres/pginstall/include/server/storage/pg_sema.h +61 -0
  816. embedded_postgres/pginstall/include/server/storage/pg_shmem.h +94 -0
  817. embedded_postgres/pginstall/include/server/storage/pmsignal.h +110 -0
  818. embedded_postgres/pginstall/include/server/storage/predicate.h +84 -0
  819. embedded_postgres/pginstall/include/server/storage/predicate_internals.h +478 -0
  820. embedded_postgres/pginstall/include/server/storage/proc.h +516 -0
  821. embedded_postgres/pginstall/include/server/storage/procarray.h +103 -0
  822. embedded_postgres/pginstall/include/server/storage/proclist.h +219 -0
  823. embedded_postgres/pginstall/include/server/storage/proclist_types.h +53 -0
  824. embedded_postgres/pginstall/include/server/storage/procnumber.h +56 -0
  825. embedded_postgres/pginstall/include/server/storage/procsignal.h +95 -0
  826. embedded_postgres/pginstall/include/server/storage/read_stream.h +106 -0
  827. embedded_postgres/pginstall/include/server/storage/reinit.h +30 -0
  828. embedded_postgres/pginstall/include/server/storage/relfilelocator.h +100 -0
  829. embedded_postgres/pginstall/include/server/storage/s_lock.h +755 -0
  830. embedded_postgres/pginstall/include/server/storage/sharedfileset.h +37 -0
  831. embedded_postgres/pginstall/include/server/storage/shm_mq.h +86 -0
  832. embedded_postgres/pginstall/include/server/storage/shm_toc.h +58 -0
  833. embedded_postgres/pginstall/include/server/storage/shmem.h +62 -0
  834. embedded_postgres/pginstall/include/server/storage/sinval.h +167 -0
  835. embedded_postgres/pginstall/include/server/storage/sinvaladt.h +41 -0
  836. embedded_postgres/pginstall/include/server/storage/smgr.h +144 -0
  837. embedded_postgres/pginstall/include/server/storage/spin.h +65 -0
  838. embedded_postgres/pginstall/include/server/storage/standby.h +109 -0
  839. embedded_postgres/pginstall/include/server/storage/standbydefs.h +74 -0
  840. embedded_postgres/pginstall/include/server/storage/sync.h +66 -0
  841. embedded_postgres/pginstall/include/server/storage/waiteventset.h +98 -0
  842. embedded_postgres/pginstall/include/server/tcop/backend_startup.h +122 -0
  843. embedded_postgres/pginstall/include/server/tcop/cmdtag.h +62 -0
  844. embedded_postgres/pginstall/include/server/tcop/cmdtaglist.h +219 -0
  845. embedded_postgres/pginstall/include/server/tcop/deparse_utility.h +108 -0
  846. embedded_postgres/pginstall/include/server/tcop/dest.h +148 -0
  847. embedded_postgres/pginstall/include/server/tcop/fastpath.h +20 -0
  848. embedded_postgres/pginstall/include/server/tcop/pquery.h +51 -0
  849. embedded_postgres/pginstall/include/server/tcop/tcopprot.h +94 -0
  850. embedded_postgres/pginstall/include/server/tcop/utility.h +112 -0
  851. embedded_postgres/pginstall/include/server/tsearch/dicts/regis.h +49 -0
  852. embedded_postgres/pginstall/include/server/tsearch/dicts/spell.h +241 -0
  853. embedded_postgres/pginstall/include/server/tsearch/ts_cache.h +96 -0
  854. embedded_postgres/pginstall/include/server/tsearch/ts_locale.h +74 -0
  855. embedded_postgres/pginstall/include/server/tsearch/ts_public.h +159 -0
  856. embedded_postgres/pginstall/include/server/tsearch/ts_type.h +290 -0
  857. embedded_postgres/pginstall/include/server/tsearch/ts_utils.h +281 -0
  858. embedded_postgres/pginstall/include/server/utils/acl.h +293 -0
  859. embedded_postgres/pginstall/include/server/utils/aclchk_internal.h +45 -0
  860. embedded_postgres/pginstall/include/server/utils/array.h +481 -0
  861. embedded_postgres/pginstall/include/server/utils/arrayaccess.h +118 -0
  862. embedded_postgres/pginstall/include/server/utils/ascii.h +84 -0
  863. embedded_postgres/pginstall/include/server/utils/attoptcache.h +28 -0
  864. embedded_postgres/pginstall/include/server/utils/backend_progress.h +46 -0
  865. embedded_postgres/pginstall/include/server/utils/backend_status.h +349 -0
  866. embedded_postgres/pginstall/include/server/utils/builtins.h +140 -0
  867. embedded_postgres/pginstall/include/server/utils/bytea.h +28 -0
  868. embedded_postgres/pginstall/include/server/utils/cash.h +35 -0
  869. embedded_postgres/pginstall/include/server/utils/catcache.h +232 -0
  870. embedded_postgres/pginstall/include/server/utils/combocid.h +28 -0
  871. embedded_postgres/pginstall/include/server/utils/conffiles.h +27 -0
  872. embedded_postgres/pginstall/include/server/utils/date.h +118 -0
  873. embedded_postgres/pginstall/include/server/utils/datetime.h +369 -0
  874. embedded_postgres/pginstall/include/server/utils/datum.h +76 -0
  875. embedded_postgres/pginstall/include/server/utils/dsa.h +166 -0
  876. embedded_postgres/pginstall/include/server/utils/dynahash.h +20 -0
  877. embedded_postgres/pginstall/include/server/utils/elog.h +532 -0
  878. embedded_postgres/pginstall/include/server/utils/errcodes.h +356 -0
  879. embedded_postgres/pginstall/include/server/utils/evtcache.h +38 -0
  880. embedded_postgres/pginstall/include/server/utils/expandeddatum.h +170 -0
  881. embedded_postgres/pginstall/include/server/utils/expandedrecord.h +241 -0
  882. embedded_postgres/pginstall/include/server/utils/float.h +357 -0
  883. embedded_postgres/pginstall/include/server/utils/fmgroids.h +3430 -0
  884. embedded_postgres/pginstall/include/server/utils/fmgrprotos.h +2982 -0
  885. embedded_postgres/pginstall/include/server/utils/fmgrtab.h +49 -0
  886. embedded_postgres/pginstall/include/server/utils/formatting.h +35 -0
  887. embedded_postgres/pginstall/include/server/utils/freepage.h +99 -0
  888. embedded_postgres/pginstall/include/server/utils/funccache.h +134 -0
  889. embedded_postgres/pginstall/include/server/utils/geo_decls.h +285 -0
  890. embedded_postgres/pginstall/include/server/utils/guc.h +489 -0
  891. embedded_postgres/pginstall/include/server/utils/guc_hooks.h +178 -0
  892. embedded_postgres/pginstall/include/server/utils/guc_tables.h +341 -0
  893. embedded_postgres/pginstall/include/server/utils/help_config.h +17 -0
  894. embedded_postgres/pginstall/include/server/utils/hsearch.h +158 -0
  895. embedded_postgres/pginstall/include/server/utils/index_selfuncs.h +74 -0
  896. embedded_postgres/pginstall/include/server/utils/inet.h +184 -0
  897. embedded_postgres/pginstall/include/server/utils/injection_point.h +54 -0
  898. embedded_postgres/pginstall/include/server/utils/inval.h +84 -0
  899. embedded_postgres/pginstall/include/server/utils/json.h +33 -0
  900. embedded_postgres/pginstall/include/server/utils/jsonb.h +440 -0
  901. embedded_postgres/pginstall/include/server/utils/jsonfuncs.h +99 -0
  902. embedded_postgres/pginstall/include/server/utils/jsonpath.h +310 -0
  903. embedded_postgres/pginstall/include/server/utils/logtape.h +77 -0
  904. embedded_postgres/pginstall/include/server/utils/lsyscache.h +224 -0
  905. embedded_postgres/pginstall/include/server/utils/memdebug.h +82 -0
  906. embedded_postgres/pginstall/include/server/utils/memutils.h +322 -0
  907. embedded_postgres/pginstall/include/server/utils/memutils_internal.h +176 -0
  908. embedded_postgres/pginstall/include/server/utils/memutils_memorychunk.h +253 -0
  909. embedded_postgres/pginstall/include/server/utils/multirangetypes.h +150 -0
  910. embedded_postgres/pginstall/include/server/utils/numeric.h +115 -0
  911. embedded_postgres/pginstall/include/server/utils/palloc.h +165 -0
  912. embedded_postgres/pginstall/include/server/utils/partcache.h +103 -0
  913. embedded_postgres/pginstall/include/server/utils/pg_crc.h +107 -0
  914. embedded_postgres/pginstall/include/server/utils/pg_locale.h +185 -0
  915. embedded_postgres/pginstall/include/server/utils/pg_lsn.h +38 -0
  916. embedded_postgres/pginstall/include/server/utils/pg_rusage.h +32 -0
  917. embedded_postgres/pginstall/include/server/utils/pgstat_internal.h +945 -0
  918. embedded_postgres/pginstall/include/server/utils/pgstat_kind.h +72 -0
  919. embedded_postgres/pginstall/include/server/utils/pidfile.h +56 -0
  920. embedded_postgres/pginstall/include/server/utils/plancache.h +256 -0
  921. embedded_postgres/pginstall/include/server/utils/portal.h +251 -0
  922. embedded_postgres/pginstall/include/server/utils/probes.h +114 -0
  923. embedded_postgres/pginstall/include/server/utils/ps_status.h +47 -0
  924. embedded_postgres/pginstall/include/server/utils/queryenvironment.h +74 -0
  925. embedded_postgres/pginstall/include/server/utils/rangetypes.h +168 -0
  926. embedded_postgres/pginstall/include/server/utils/regproc.h +39 -0
  927. embedded_postgres/pginstall/include/server/utils/rel.h +731 -0
  928. embedded_postgres/pginstall/include/server/utils/relcache.h +163 -0
  929. embedded_postgres/pginstall/include/server/utils/relfilenumbermap.h +21 -0
  930. embedded_postgres/pginstall/include/server/utils/relmapper.h +73 -0
  931. embedded_postgres/pginstall/include/server/utils/relptr.h +93 -0
  932. embedded_postgres/pginstall/include/server/utils/reltrigger.h +81 -0
  933. embedded_postgres/pginstall/include/server/utils/resowner.h +172 -0
  934. embedded_postgres/pginstall/include/server/utils/rls.h +50 -0
  935. embedded_postgres/pginstall/include/server/utils/ruleutils.h +57 -0
  936. embedded_postgres/pginstall/include/server/utils/sampling.h +64 -0
  937. embedded_postgres/pginstall/include/server/utils/selfuncs.h +251 -0
  938. embedded_postgres/pginstall/include/server/utils/sharedtuplestore.h +61 -0
  939. embedded_postgres/pginstall/include/server/utils/skipsupport.h +98 -0
  940. embedded_postgres/pginstall/include/server/utils/snapmgr.h +122 -0
  941. embedded_postgres/pginstall/include/server/utils/snapshot.h +212 -0
  942. embedded_postgres/pginstall/include/server/utils/sortsupport.h +391 -0
  943. embedded_postgres/pginstall/include/server/utils/spccache.h +21 -0
  944. embedded_postgres/pginstall/include/server/utils/syscache.h +136 -0
  945. embedded_postgres/pginstall/include/server/utils/timeout.h +96 -0
  946. embedded_postgres/pginstall/include/server/utils/timestamp.h +159 -0
  947. embedded_postgres/pginstall/include/server/utils/tuplesort.h +480 -0
  948. embedded_postgres/pginstall/include/server/utils/tuplestore.h +91 -0
  949. embedded_postgres/pginstall/include/server/utils/typcache.h +215 -0
  950. embedded_postgres/pginstall/include/server/utils/tzparser.h +39 -0
  951. embedded_postgres/pginstall/include/server/utils/usercontext.h +26 -0
  952. embedded_postgres/pginstall/include/server/utils/uuid.h +42 -0
  953. embedded_postgres/pginstall/include/server/utils/varbit.h +89 -0
  954. embedded_postgres/pginstall/include/server/utils/varlena.h +53 -0
  955. embedded_postgres/pginstall/include/server/utils/wait_classes.h +29 -0
  956. embedded_postgres/pginstall/include/server/utils/wait_event.h +92 -0
  957. embedded_postgres/pginstall/include/server/utils/wait_event_types.h +225 -0
  958. embedded_postgres/pginstall/include/server/utils/xid8.h +32 -0
  959. embedded_postgres/pginstall/include/server/utils/xml.h +94 -0
  960. embedded_postgres/pginstall/include/server/varatt.h +358 -0
  961. embedded_postgres/pginstall/include/server/windowapi.h +64 -0
  962. embedded_postgres/pginstall/include/sql3types.h +43 -0
  963. embedded_postgres/pginstall/include/sqlca.h +66 -0
  964. embedded_postgres/pginstall/include/sqlda-compat.h +47 -0
  965. embedded_postgres/pginstall/include/sqlda-native.h +43 -0
  966. embedded_postgres/pginstall/include/sqlda.h +18 -0
  967. embedded_postgres/pginstall/lib/_int.dll +0 -0
  968. embedded_postgres/pginstall/lib/amcheck.dll +0 -0
  969. embedded_postgres/pginstall/lib/auth_delay.dll +0 -0
  970. embedded_postgres/pginstall/lib/auto_explain.dll +0 -0
  971. embedded_postgres/pginstall/lib/autoinc.dll +0 -0
  972. embedded_postgres/pginstall/lib/basebackup_to_shell.dll +0 -0
  973. embedded_postgres/pginstall/lib/basic_archive.dll +0 -0
  974. embedded_postgres/pginstall/lib/bloom.dll +0 -0
  975. embedded_postgres/pginstall/lib/btree_gin.dll +0 -0
  976. embedded_postgres/pginstall/lib/btree_gist.dll +0 -0
  977. embedded_postgres/pginstall/lib/citext.dll +0 -0
  978. embedded_postgres/pginstall/lib/cube.dll +0 -0
  979. embedded_postgres/pginstall/lib/cyrillic_and_mic.dll +0 -0
  980. embedded_postgres/pginstall/lib/dblink.dll +0 -0
  981. embedded_postgres/pginstall/lib/dict_int.dll +0 -0
  982. embedded_postgres/pginstall/lib/dict_snowball.dll +0 -0
  983. embedded_postgres/pginstall/lib/dict_xsyn.dll +0 -0
  984. embedded_postgres/pginstall/lib/earthdistance.dll +0 -0
  985. embedded_postgres/pginstall/lib/euc2004_sjis2004.dll +0 -0
  986. embedded_postgres/pginstall/lib/euc_cn_and_mic.dll +0 -0
  987. embedded_postgres/pginstall/lib/euc_jp_and_sjis.dll +0 -0
  988. embedded_postgres/pginstall/lib/euc_kr_and_mic.dll +0 -0
  989. embedded_postgres/pginstall/lib/euc_tw_and_big5.dll +0 -0
  990. embedded_postgres/pginstall/lib/file_fdw.dll +0 -0
  991. embedded_postgres/pginstall/lib/fuzzystrmatch.dll +0 -0
  992. embedded_postgres/pginstall/lib/hstore.dll +0 -0
  993. embedded_postgres/pginstall/lib/insert_username.dll +0 -0
  994. embedded_postgres/pginstall/lib/isn.dll +0 -0
  995. embedded_postgres/pginstall/lib/latin2_and_win1250.dll +0 -0
  996. embedded_postgres/pginstall/lib/latin_and_mic.dll +0 -0
  997. embedded_postgres/pginstall/lib/libecpg.a +0 -0
  998. embedded_postgres/pginstall/lib/libecpg.dll +0 -0
  999. embedded_postgres/pginstall/lib/libecpg_compat.a +0 -0
  1000. embedded_postgres/pginstall/lib/libecpg_compat.dll +0 -0
  1001. embedded_postgres/pginstall/lib/libpgcommon.a +0 -0
  1002. embedded_postgres/pginstall/lib/libpgcommon_shlib.a +0 -0
  1003. embedded_postgres/pginstall/lib/libpgfeutils.a +0 -0
  1004. embedded_postgres/pginstall/lib/libpgport.a +0 -0
  1005. embedded_postgres/pginstall/lib/libpgport_shlib.a +0 -0
  1006. embedded_postgres/pginstall/lib/libpgtypes.a +0 -0
  1007. embedded_postgres/pginstall/lib/libpgtypes.dll +0 -0
  1008. embedded_postgres/pginstall/lib/libpostgres.a +0 -0
  1009. embedded_postgres/pginstall/lib/libpq.a +0 -0
  1010. embedded_postgres/pginstall/lib/libpq.dll +0 -0
  1011. embedded_postgres/pginstall/lib/libpqwalreceiver.dll +0 -0
  1012. embedded_postgres/pginstall/lib/lo.dll +0 -0
  1013. embedded_postgres/pginstall/lib/ltree.dll +0 -0
  1014. embedded_postgres/pginstall/lib/moddatetime.dll +0 -0
  1015. embedded_postgres/pginstall/lib/pageinspect.dll +0 -0
  1016. embedded_postgres/pginstall/lib/passwordcheck.dll +0 -0
  1017. embedded_postgres/pginstall/lib/pg_buffercache.dll +0 -0
  1018. embedded_postgres/pginstall/lib/pg_freespacemap.dll +0 -0
  1019. embedded_postgres/pginstall/lib/pg_logicalinspect.dll +0 -0
  1020. embedded_postgres/pginstall/lib/pg_overexplain.dll +0 -0
  1021. embedded_postgres/pginstall/lib/pg_prewarm.dll +0 -0
  1022. embedded_postgres/pginstall/lib/pg_stat_statements.dll +0 -0
  1023. embedded_postgres/pginstall/lib/pg_surgery.dll +0 -0
  1024. embedded_postgres/pginstall/lib/pg_trgm.dll +0 -0
  1025. embedded_postgres/pginstall/lib/pg_visibility.dll +0 -0
  1026. embedded_postgres/pginstall/lib/pg_walinspect.dll +0 -0
  1027. embedded_postgres/pginstall/lib/pgevent.dll +0 -0
  1028. embedded_postgres/pginstall/lib/pgoutput.dll +0 -0
  1029. embedded_postgres/pginstall/lib/pgrowlocks.dll +0 -0
  1030. embedded_postgres/pginstall/lib/pgstattuple.dll +0 -0
  1031. embedded_postgres/pginstall/lib/pgxs/config/install-sh +527 -0
  1032. embedded_postgres/pginstall/lib/pgxs/config/missing +54 -0
  1033. embedded_postgres/pginstall/lib/pgxs/src/Makefile.global +1139 -0
  1034. embedded_postgres/pginstall/lib/pgxs/src/Makefile.port +83 -0
  1035. embedded_postgres/pginstall/lib/pgxs/src/Makefile.shlib +436 -0
  1036. embedded_postgres/pginstall/lib/pgxs/src/makefiles/pgxs.mk +476 -0
  1037. embedded_postgres/pginstall/lib/pgxs/src/nls-global.mk +182 -0
  1038. embedded_postgres/pginstall/lib/pgxs/src/test/isolation/isolationtester.exe +0 -0
  1039. embedded_postgres/pginstall/lib/pgxs/src/test/isolation/pg_isolation_regress.exe +0 -0
  1040. embedded_postgres/pginstall/lib/pgxs/src/test/regress/pg_regress.exe +0 -0
  1041. embedded_postgres/pginstall/lib/pkgconfig/libecpg.pc +14 -0
  1042. embedded_postgres/pginstall/lib/pkgconfig/libecpg_compat.pc +14 -0
  1043. embedded_postgres/pginstall/lib/pkgconfig/libpgtypes.pc +14 -0
  1044. embedded_postgres/pginstall/lib/pkgconfig/libpq.pc +14 -0
  1045. embedded_postgres/pginstall/lib/plpgsql.dll +0 -0
  1046. embedded_postgres/pginstall/lib/postgres_fdw.dll +0 -0
  1047. embedded_postgres/pginstall/lib/refint.dll +0 -0
  1048. embedded_postgres/pginstall/lib/seg.dll +0 -0
  1049. embedded_postgres/pginstall/lib/tablefunc.dll +0 -0
  1050. embedded_postgres/pginstall/lib/tcn.dll +0 -0
  1051. embedded_postgres/pginstall/lib/test_decoding.dll +0 -0
  1052. embedded_postgres/pginstall/lib/tsm_system_rows.dll +0 -0
  1053. embedded_postgres/pginstall/lib/tsm_system_time.dll +0 -0
  1054. embedded_postgres/pginstall/lib/unaccent.dll +0 -0
  1055. embedded_postgres/pginstall/lib/utf8_and_big5.dll +0 -0
  1056. embedded_postgres/pginstall/lib/utf8_and_cyrillic.dll +0 -0
  1057. embedded_postgres/pginstall/lib/utf8_and_euc2004.dll +0 -0
  1058. embedded_postgres/pginstall/lib/utf8_and_euc_cn.dll +0 -0
  1059. embedded_postgres/pginstall/lib/utf8_and_euc_jp.dll +0 -0
  1060. embedded_postgres/pginstall/lib/utf8_and_euc_kr.dll +0 -0
  1061. embedded_postgres/pginstall/lib/utf8_and_euc_tw.dll +0 -0
  1062. embedded_postgres/pginstall/lib/utf8_and_gb18030.dll +0 -0
  1063. embedded_postgres/pginstall/lib/utf8_and_gbk.dll +0 -0
  1064. embedded_postgres/pginstall/lib/utf8_and_iso8859.dll +0 -0
  1065. embedded_postgres/pginstall/lib/utf8_and_iso8859_1.dll +0 -0
  1066. embedded_postgres/pginstall/lib/utf8_and_johab.dll +0 -0
  1067. embedded_postgres/pginstall/lib/utf8_and_sjis.dll +0 -0
  1068. embedded_postgres/pginstall/lib/utf8_and_sjis2004.dll +0 -0
  1069. embedded_postgres/pginstall/lib/utf8_and_uhc.dll +0 -0
  1070. embedded_postgres/pginstall/lib/utf8_and_win.dll +0 -0
  1071. embedded_postgres/pginstall/lib/vector.dll +0 -0
  1072. embedded_postgres/pginstall/share/doc/extension/autoinc.example +35 -0
  1073. embedded_postgres/pginstall/share/doc/extension/insert_username.example +20 -0
  1074. embedded_postgres/pginstall/share/doc/extension/moddatetime.example +27 -0
  1075. embedded_postgres/pginstall/share/doc/extension/refint.example +82 -0
  1076. embedded_postgres/pginstall/share/errcodes.txt +501 -0
  1077. embedded_postgres/pginstall/share/extension/amcheck--1.0--1.1.sql +29 -0
  1078. embedded_postgres/pginstall/share/extension/amcheck--1.0.sql +24 -0
  1079. embedded_postgres/pginstall/share/extension/amcheck--1.1--1.2.sql +19 -0
  1080. embedded_postgres/pginstall/share/extension/amcheck--1.2--1.3.sql +30 -0
  1081. embedded_postgres/pginstall/share/extension/amcheck--1.3--1.4.sql +29 -0
  1082. embedded_postgres/pginstall/share/extension/amcheck--1.4--1.5.sql +14 -0
  1083. embedded_postgres/pginstall/share/extension/amcheck.control +5 -0
  1084. embedded_postgres/pginstall/share/extension/autoinc--1.0.sql +9 -0
  1085. embedded_postgres/pginstall/share/extension/autoinc.control +5 -0
  1086. embedded_postgres/pginstall/share/extension/bloom--1.0.sql +25 -0
  1087. embedded_postgres/pginstall/share/extension/bloom.control +5 -0
  1088. embedded_postgres/pginstall/share/extension/btree_gin--1.0--1.1.sql +35 -0
  1089. embedded_postgres/pginstall/share/extension/btree_gin--1.0.sql +689 -0
  1090. embedded_postgres/pginstall/share/extension/btree_gin--1.1--1.2.sql +47 -0
  1091. embedded_postgres/pginstall/share/extension/btree_gin--1.2--1.3.sql +128 -0
  1092. embedded_postgres/pginstall/share/extension/btree_gin.control +6 -0
  1093. embedded_postgres/pginstall/share/extension/btree_gist--1.0--1.1.sql +127 -0
  1094. embedded_postgres/pginstall/share/extension/btree_gist--1.1--1.2.sql +79 -0
  1095. embedded_postgres/pginstall/share/extension/btree_gist--1.2--1.3.sql +65 -0
  1096. embedded_postgres/pginstall/share/extension/btree_gist--1.2.sql +1570 -0
  1097. embedded_postgres/pginstall/share/extension/btree_gist--1.3--1.4.sql +64 -0
  1098. embedded_postgres/pginstall/share/extension/btree_gist--1.4--1.5.sql +69 -0
  1099. embedded_postgres/pginstall/share/extension/btree_gist--1.5--1.6.sql +191 -0
  1100. embedded_postgres/pginstall/share/extension/btree_gist--1.6--1.7.sql +77 -0
  1101. embedded_postgres/pginstall/share/extension/btree_gist--1.7--1.8.sql +284 -0
  1102. embedded_postgres/pginstall/share/extension/btree_gist.control +6 -0
  1103. embedded_postgres/pginstall/share/extension/citext--1.0--1.1.sql +21 -0
  1104. embedded_postgres/pginstall/share/extension/citext--1.1--1.2.sql +68 -0
  1105. embedded_postgres/pginstall/share/extension/citext--1.2--1.3.sql +21 -0
  1106. embedded_postgres/pginstall/share/extension/citext--1.3--1.4.sql +12 -0
  1107. embedded_postgres/pginstall/share/extension/citext--1.4--1.5.sql +88 -0
  1108. embedded_postgres/pginstall/share/extension/citext--1.4.sql +501 -0
  1109. embedded_postgres/pginstall/share/extension/citext--1.5--1.6.sql +12 -0
  1110. embedded_postgres/pginstall/share/extension/citext--1.6--1.7.sql +45 -0
  1111. embedded_postgres/pginstall/share/extension/citext--1.7--1.8.sql +60 -0
  1112. embedded_postgres/pginstall/share/extension/citext.control +6 -0
  1113. embedded_postgres/pginstall/share/extension/cube--1.0--1.1.sql +59 -0
  1114. embedded_postgres/pginstall/share/extension/cube--1.1--1.2.sql +75 -0
  1115. embedded_postgres/pginstall/share/extension/cube--1.2--1.3.sql +12 -0
  1116. embedded_postgres/pginstall/share/extension/cube--1.2.sql +378 -0
  1117. embedded_postgres/pginstall/share/extension/cube--1.3--1.4.sql +58 -0
  1118. embedded_postgres/pginstall/share/extension/cube--1.4--1.5.sql +21 -0
  1119. embedded_postgres/pginstall/share/extension/cube.control +6 -0
  1120. embedded_postgres/pginstall/share/extension/dblink--1.0--1.1.sql +14 -0
  1121. embedded_postgres/pginstall/share/extension/dblink--1.1--1.2.sql +46 -0
  1122. embedded_postgres/pginstall/share/extension/dblink--1.2.sql +235 -0
  1123. embedded_postgres/pginstall/share/extension/dblink.control +5 -0
  1124. embedded_postgres/pginstall/share/extension/dict_int--1.0.sql +25 -0
  1125. embedded_postgres/pginstall/share/extension/dict_int.control +6 -0
  1126. embedded_postgres/pginstall/share/extension/dict_xsyn--1.0.sql +25 -0
  1127. embedded_postgres/pginstall/share/extension/dict_xsyn.control +5 -0
  1128. embedded_postgres/pginstall/share/extension/earthdistance--1.0--1.1.sql +14 -0
  1129. embedded_postgres/pginstall/share/extension/earthdistance--1.1--1.2.sql +73 -0
  1130. embedded_postgres/pginstall/share/extension/earthdistance--1.1.sql +98 -0
  1131. embedded_postgres/pginstall/share/extension/earthdistance.control +6 -0
  1132. embedded_postgres/pginstall/share/extension/file_fdw--1.0.sql +18 -0
  1133. embedded_postgres/pginstall/share/extension/file_fdw.control +5 -0
  1134. embedded_postgres/pginstall/share/extension/fuzzystrmatch--1.0--1.1.sql +15 -0
  1135. embedded_postgres/pginstall/share/extension/fuzzystrmatch--1.1--1.2.sql +8 -0
  1136. embedded_postgres/pginstall/share/extension/fuzzystrmatch--1.1.sql +44 -0
  1137. embedded_postgres/pginstall/share/extension/fuzzystrmatch.control +6 -0
  1138. embedded_postgres/pginstall/share/extension/hstore--1.1--1.2.sql +53 -0
  1139. embedded_postgres/pginstall/share/extension/hstore--1.2--1.3.sql +17 -0
  1140. embedded_postgres/pginstall/share/extension/hstore--1.3--1.4.sql +99 -0
  1141. embedded_postgres/pginstall/share/extension/hstore--1.4--1.5.sql +14 -0
  1142. embedded_postgres/pginstall/share/extension/hstore--1.4.sql +550 -0
  1143. embedded_postgres/pginstall/share/extension/hstore--1.5--1.6.sql +12 -0
  1144. embedded_postgres/pginstall/share/extension/hstore--1.6--1.7.sql +27 -0
  1145. embedded_postgres/pginstall/share/extension/hstore--1.7--1.8.sql +17 -0
  1146. embedded_postgres/pginstall/share/extension/hstore.control +6 -0
  1147. embedded_postgres/pginstall/share/extension/insert_username--1.0.sql +9 -0
  1148. embedded_postgres/pginstall/share/extension/insert_username.control +5 -0
  1149. embedded_postgres/pginstall/share/extension/intagg--1.0--1.1.sql +23 -0
  1150. embedded_postgres/pginstall/share/extension/intagg--1.1.sql +37 -0
  1151. embedded_postgres/pginstall/share/extension/intagg.control +4 -0
  1152. embedded_postgres/pginstall/share/extension/intarray--1.0--1.1.sql +49 -0
  1153. embedded_postgres/pginstall/share/extension/intarray--1.1--1.2.sql +94 -0
  1154. embedded_postgres/pginstall/share/extension/intarray--1.2--1.3.sql +20 -0
  1155. embedded_postgres/pginstall/share/extension/intarray--1.2.sql +520 -0
  1156. embedded_postgres/pginstall/share/extension/intarray--1.3--1.4.sql +21 -0
  1157. embedded_postgres/pginstall/share/extension/intarray--1.4--1.5.sql +8 -0
  1158. embedded_postgres/pginstall/share/extension/intarray.control +6 -0
  1159. embedded_postgres/pginstall/share/extension/isn--1.0--1.1.sql +250 -0
  1160. embedded_postgres/pginstall/share/extension/isn--1.1--1.2.sql +228 -0
  1161. embedded_postgres/pginstall/share/extension/isn--1.1.sql +3434 -0
  1162. embedded_postgres/pginstall/share/extension/isn--1.2--1.3.sql +7 -0
  1163. embedded_postgres/pginstall/share/extension/isn.control +6 -0
  1164. embedded_postgres/pginstall/share/extension/lo--1.0--1.1.sql +6 -0
  1165. embedded_postgres/pginstall/share/extension/lo--1.1--1.2.sql +8 -0
  1166. embedded_postgres/pginstall/share/extension/lo--1.1.sql +25 -0
  1167. embedded_postgres/pginstall/share/extension/lo.control +6 -0
  1168. embedded_postgres/pginstall/share/extension/ltree--1.0--1.1.sql +115 -0
  1169. embedded_postgres/pginstall/share/extension/ltree--1.1--1.2.sql +139 -0
  1170. embedded_postgres/pginstall/share/extension/ltree--1.1.sql +872 -0
  1171. embedded_postgres/pginstall/share/extension/ltree--1.2--1.3.sql +23 -0
  1172. embedded_postgres/pginstall/share/extension/ltree.control +6 -0
  1173. embedded_postgres/pginstall/share/extension/moddatetime--1.0.sql +9 -0
  1174. embedded_postgres/pginstall/share/extension/moddatetime.control +5 -0
  1175. embedded_postgres/pginstall/share/extension/pageinspect--1.0--1.1.sql +18 -0
  1176. embedded_postgres/pginstall/share/extension/pageinspect--1.1--1.2.sql +18 -0
  1177. embedded_postgres/pginstall/share/extension/pageinspect--1.10--1.11.sql +28 -0
  1178. embedded_postgres/pginstall/share/extension/pageinspect--1.11--1.12.sql +40 -0
  1179. embedded_postgres/pginstall/share/extension/pageinspect--1.12--1.13.sql +74 -0
  1180. embedded_postgres/pginstall/share/extension/pageinspect--1.2--1.3.sql +82 -0
  1181. embedded_postgres/pginstall/share/extension/pageinspect--1.3--1.4.sql +118 -0
  1182. embedded_postgres/pginstall/share/extension/pageinspect--1.4--1.5.sql +24 -0
  1183. embedded_postgres/pginstall/share/extension/pageinspect--1.5--1.6.sql +99 -0
  1184. embedded_postgres/pginstall/share/extension/pageinspect--1.5.sql +279 -0
  1185. embedded_postgres/pginstall/share/extension/pageinspect--1.6--1.7.sql +26 -0
  1186. embedded_postgres/pginstall/share/extension/pageinspect--1.7--1.8.sql +69 -0
  1187. embedded_postgres/pginstall/share/extension/pageinspect--1.8--1.9.sql +137 -0
  1188. embedded_postgres/pginstall/share/extension/pageinspect--1.9--1.10.sql +21 -0
  1189. embedded_postgres/pginstall/share/extension/pageinspect.control +5 -0
  1190. embedded_postgres/pginstall/share/extension/pg_buffercache--1.0--1.1.sql +11 -0
  1191. embedded_postgres/pginstall/share/extension/pg_buffercache--1.1--1.2.sql +6 -0
  1192. embedded_postgres/pginstall/share/extension/pg_buffercache--1.2--1.3.sql +7 -0
  1193. embedded_postgres/pginstall/share/extension/pg_buffercache--1.2.sql +21 -0
  1194. embedded_postgres/pginstall/share/extension/pg_buffercache--1.3--1.4.sql +28 -0
  1195. embedded_postgres/pginstall/share/extension/pg_buffercache--1.4--1.5.sql +6 -0
  1196. embedded_postgres/pginstall/share/extension/pg_buffercache--1.5--1.6.sql +46 -0
  1197. embedded_postgres/pginstall/share/extension/pg_buffercache.control +5 -0
  1198. embedded_postgres/pginstall/share/extension/pg_freespacemap--1.0--1.1.sql +7 -0
  1199. embedded_postgres/pginstall/share/extension/pg_freespacemap--1.1--1.2.sql +7 -0
  1200. embedded_postgres/pginstall/share/extension/pg_freespacemap--1.1.sql +25 -0
  1201. embedded_postgres/pginstall/share/extension/pg_freespacemap--1.2--1.3.sql +13 -0
  1202. embedded_postgres/pginstall/share/extension/pg_freespacemap.control +5 -0
  1203. embedded_postgres/pginstall/share/extension/pg_logicalinspect--1.0.sql +43 -0
  1204. embedded_postgres/pginstall/share/extension/pg_logicalinspect.control +5 -0
  1205. embedded_postgres/pginstall/share/extension/pg_prewarm--1.0--1.1.sql +6 -0
  1206. embedded_postgres/pginstall/share/extension/pg_prewarm--1.1--1.2.sql +14 -0
  1207. embedded_postgres/pginstall/share/extension/pg_prewarm--1.1.sql +14 -0
  1208. embedded_postgres/pginstall/share/extension/pg_prewarm.control +5 -0
  1209. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.0--1.1.sql +42 -0
  1210. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.1--1.2.sql +43 -0
  1211. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.10--1.11.sql +82 -0
  1212. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.11--1.12.sql +76 -0
  1213. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.2--1.3.sql +47 -0
  1214. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.3--1.4.sql +7 -0
  1215. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.4--1.5.sql +6 -0
  1216. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.4.sql +48 -0
  1217. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.5--1.6.sql +7 -0
  1218. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.6--1.7.sql +22 -0
  1219. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.7--1.8.sql +56 -0
  1220. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.8--1.9.sql +71 -0
  1221. embedded_postgres/pginstall/share/extension/pg_stat_statements--1.9--1.10.sql +67 -0
  1222. embedded_postgres/pginstall/share/extension/pg_stat_statements.control +5 -0
  1223. embedded_postgres/pginstall/share/extension/pg_surgery--1.0.sql +18 -0
  1224. embedded_postgres/pginstall/share/extension/pg_surgery.control +5 -0
  1225. embedded_postgres/pginstall/share/extension/pg_trgm--1.0--1.1.sql +12 -0
  1226. embedded_postgres/pginstall/share/extension/pg_trgm--1.1--1.2.sql +74 -0
  1227. embedded_postgres/pginstall/share/extension/pg_trgm--1.2--1.3.sql +65 -0
  1228. embedded_postgres/pginstall/share/extension/pg_trgm--1.3--1.4.sql +68 -0
  1229. embedded_postgres/pginstall/share/extension/pg_trgm--1.3.sql +254 -0
  1230. embedded_postgres/pginstall/share/extension/pg_trgm--1.4--1.5.sql +23 -0
  1231. embedded_postgres/pginstall/share/extension/pg_trgm--1.5--1.6.sql +10 -0
  1232. embedded_postgres/pginstall/share/extension/pg_trgm.control +6 -0
  1233. embedded_postgres/pginstall/share/extension/pg_visibility--1.0--1.1.sql +24 -0
  1234. embedded_postgres/pginstall/share/extension/pg_visibility--1.1--1.2.sql +13 -0
  1235. embedded_postgres/pginstall/share/extension/pg_visibility--1.1.sql +75 -0
  1236. embedded_postgres/pginstall/share/extension/pg_visibility.control +5 -0
  1237. embedded_postgres/pginstall/share/extension/pg_walinspect--1.0--1.1.sql +42 -0
  1238. embedded_postgres/pginstall/share/extension/pg_walinspect--1.0.sql +118 -0
  1239. embedded_postgres/pginstall/share/extension/pg_walinspect.control +5 -0
  1240. embedded_postgres/pginstall/share/extension/pgrowlocks--1.0--1.1.sql +17 -0
  1241. embedded_postgres/pginstall/share/extension/pgrowlocks--1.1--1.2.sql +6 -0
  1242. embedded_postgres/pginstall/share/extension/pgrowlocks--1.2.sql +15 -0
  1243. embedded_postgres/pginstall/share/extension/pgrowlocks.control +5 -0
  1244. embedded_postgres/pginstall/share/extension/pgstattuple--1.0--1.1.sql +11 -0
  1245. embedded_postgres/pginstall/share/extension/pgstattuple--1.1--1.2.sql +39 -0
  1246. embedded_postgres/pginstall/share/extension/pgstattuple--1.2--1.3.sql +18 -0
  1247. embedded_postgres/pginstall/share/extension/pgstattuple--1.3--1.4.sql +13 -0
  1248. embedded_postgres/pginstall/share/extension/pgstattuple--1.4--1.5.sql +136 -0
  1249. embedded_postgres/pginstall/share/extension/pgstattuple--1.4.sql +95 -0
  1250. embedded_postgres/pginstall/share/extension/pgstattuple.control +5 -0
  1251. embedded_postgres/pginstall/share/extension/plpgsql--1.0.sql +20 -0
  1252. embedded_postgres/pginstall/share/extension/plpgsql.control +8 -0
  1253. embedded_postgres/pginstall/share/extension/postgres_fdw--1.0--1.1.sql +20 -0
  1254. embedded_postgres/pginstall/share/extension/postgres_fdw--1.0.sql +18 -0
  1255. embedded_postgres/pginstall/share/extension/postgres_fdw--1.1--1.2.sql +18 -0
  1256. embedded_postgres/pginstall/share/extension/postgres_fdw.control +5 -0
  1257. embedded_postgres/pginstall/share/extension/refint--1.0.sql +14 -0
  1258. embedded_postgres/pginstall/share/extension/refint.control +5 -0
  1259. embedded_postgres/pginstall/share/extension/seg--1.0--1.1.sql +63 -0
  1260. embedded_postgres/pginstall/share/extension/seg--1.1--1.2.sql +14 -0
  1261. embedded_postgres/pginstall/share/extension/seg--1.1.sql +395 -0
  1262. embedded_postgres/pginstall/share/extension/seg--1.2--1.3.sql +58 -0
  1263. embedded_postgres/pginstall/share/extension/seg--1.3--1.4.sql +8 -0
  1264. embedded_postgres/pginstall/share/extension/seg.control +6 -0
  1265. embedded_postgres/pginstall/share/extension/tablefunc--1.0.sql +88 -0
  1266. embedded_postgres/pginstall/share/extension/tablefunc.control +6 -0
  1267. embedded_postgres/pginstall/share/extension/tcn--1.0.sql +9 -0
  1268. embedded_postgres/pginstall/share/extension/tcn.control +6 -0
  1269. embedded_postgres/pginstall/share/extension/tsm_system_rows--1.0.sql +9 -0
  1270. embedded_postgres/pginstall/share/extension/tsm_system_rows.control +6 -0
  1271. embedded_postgres/pginstall/share/extension/tsm_system_time--1.0.sql +9 -0
  1272. embedded_postgres/pginstall/share/extension/tsm_system_time.control +6 -0
  1273. embedded_postgres/pginstall/share/extension/unaccent--1.0--1.1.sql +9 -0
  1274. embedded_postgres/pginstall/share/extension/unaccent--1.1.sql +34 -0
  1275. embedded_postgres/pginstall/share/extension/unaccent.control +6 -0
  1276. embedded_postgres/pginstall/share/extension/vector--0.1.0--0.1.1.sql +39 -0
  1277. embedded_postgres/pginstall/share/extension/vector--0.1.1--0.1.3.sql +2 -0
  1278. embedded_postgres/pginstall/share/extension/vector--0.1.3--0.1.4.sql +2 -0
  1279. embedded_postgres/pginstall/share/extension/vector--0.1.4--0.1.5.sql +2 -0
  1280. embedded_postgres/pginstall/share/extension/vector--0.1.5--0.1.6.sql +2 -0
  1281. embedded_postgres/pginstall/share/extension/vector--0.1.6--0.1.7.sql +8 -0
  1282. embedded_postgres/pginstall/share/extension/vector--0.1.7--0.1.8.sql +8 -0
  1283. embedded_postgres/pginstall/share/extension/vector--0.1.8--0.2.0.sql +2 -0
  1284. embedded_postgres/pginstall/share/extension/vector--0.2.0--0.2.1.sql +19 -0
  1285. embedded_postgres/pginstall/share/extension/vector--0.2.1--0.2.2.sql +2 -0
  1286. embedded_postgres/pginstall/share/extension/vector--0.2.2--0.2.3.sql +2 -0
  1287. embedded_postgres/pginstall/share/extension/vector--0.2.3--0.2.4.sql +2 -0
  1288. embedded_postgres/pginstall/share/extension/vector--0.2.4--0.2.5.sql +2 -0
  1289. embedded_postgres/pginstall/share/extension/vector--0.2.5--0.2.6.sql +2 -0
  1290. embedded_postgres/pginstall/share/extension/vector--0.2.6--0.2.7.sql +2 -0
  1291. embedded_postgres/pginstall/share/extension/vector--0.2.7--0.3.0.sql +2 -0
  1292. embedded_postgres/pginstall/share/extension/vector--0.3.0--0.3.1.sql +2 -0
  1293. embedded_postgres/pginstall/share/extension/vector--0.3.1--0.3.2.sql +2 -0
  1294. embedded_postgres/pginstall/share/extension/vector--0.3.2--0.4.0.sql +23 -0
  1295. embedded_postgres/pginstall/share/extension/vector--0.4.0--0.4.1.sql +2 -0
  1296. embedded_postgres/pginstall/share/extension/vector--0.4.1--0.4.2.sql +2 -0
  1297. embedded_postgres/pginstall/share/extension/vector--0.4.2--0.4.3.sql +2 -0
  1298. embedded_postgres/pginstall/share/extension/vector--0.4.3--0.4.4.sql +2 -0
  1299. embedded_postgres/pginstall/share/extension/vector--0.4.4--0.5.0.sql +43 -0
  1300. embedded_postgres/pginstall/share/extension/vector--0.5.0--0.5.1.sql +2 -0
  1301. embedded_postgres/pginstall/share/extension/vector--0.5.1--0.6.0.sql +5 -0
  1302. embedded_postgres/pginstall/share/extension/vector--0.6.0--0.6.1.sql +16 -0
  1303. embedded_postgres/pginstall/share/extension/vector--0.6.1--0.6.2.sql +2 -0
  1304. embedded_postgres/pginstall/share/extension/vector--0.6.2--0.7.0.sql +569 -0
  1305. embedded_postgres/pginstall/share/extension/vector--0.7.0--0.7.1.sql +2 -0
  1306. embedded_postgres/pginstall/share/extension/vector--0.7.1--0.7.2.sql +2 -0
  1307. embedded_postgres/pginstall/share/extension/vector--0.7.2--0.7.3.sql +2 -0
  1308. embedded_postgres/pginstall/share/extension/vector--0.7.3--0.7.4.sql +2 -0
  1309. embedded_postgres/pginstall/share/extension/vector--0.7.4--0.8.0.sql +26 -0
  1310. embedded_postgres/pginstall/share/extension/vector--0.8.0--0.8.1.sql +2 -0
  1311. embedded_postgres/pginstall/share/extension/vector--0.8.1--0.8.2.sql +2 -0
  1312. embedded_postgres/pginstall/share/extension/vector--0.8.2--0.8.3.sql +2 -0
  1313. embedded_postgres/pginstall/share/extension/vector--0.8.3--0.8.4.sql +2 -0
  1314. embedded_postgres/pginstall/share/extension/vector--0.8.4--0.8.5.sql +2 -0
  1315. embedded_postgres/pginstall/share/extension/vector--0.8.5--0.8.6.sql +2 -0
  1316. embedded_postgres/pginstall/share/extension/vector--0.8.6.sql +918 -0
  1317. embedded_postgres/pginstall/share/extension/vector.control +4 -0
  1318. embedded_postgres/pginstall/share/information_schema.sql +3011 -0
  1319. embedded_postgres/pginstall/share/pg_hba.conf.sample +122 -0
  1320. embedded_postgres/pginstall/share/pg_ident.conf.sample +72 -0
  1321. embedded_postgres/pginstall/share/pg_service.conf.sample +17 -0
  1322. embedded_postgres/pginstall/share/postgres.bki +11870 -0
  1323. embedded_postgres/pginstall/share/postgresql.conf.sample +889 -0
  1324. embedded_postgres/pginstall/share/psqlrc.sample +8 -0
  1325. embedded_postgres/pginstall/share/snowball_create.sql +1253 -0
  1326. embedded_postgres/pginstall/share/sql_features.txt +755 -0
  1327. embedded_postgres/pginstall/share/system_constraints.sql +220 -0
  1328. embedded_postgres/pginstall/share/system_functions.sql +808 -0
  1329. embedded_postgres/pginstall/share/system_views.sql +1409 -0
  1330. embedded_postgres/pginstall/share/timezonesets/Africa.txt +176 -0
  1331. embedded_postgres/pginstall/share/timezonesets/America.txt +257 -0
  1332. embedded_postgres/pginstall/share/timezonesets/Antarctica.txt +27 -0
  1333. embedded_postgres/pginstall/share/timezonesets/Asia.txt +190 -0
  1334. embedded_postgres/pginstall/share/timezonesets/Atlantic.txt +85 -0
  1335. embedded_postgres/pginstall/share/timezonesets/Australia +27 -0
  1336. embedded_postgres/pginstall/share/timezonesets/Australia.txt +71 -0
  1337. embedded_postgres/pginstall/share/timezonesets/Default +629 -0
  1338. embedded_postgres/pginstall/share/timezonesets/Etc.txt +34 -0
  1339. embedded_postgres/pginstall/share/timezonesets/Europe.txt +217 -0
  1340. embedded_postgres/pginstall/share/timezonesets/India +19 -0
  1341. embedded_postgres/pginstall/share/timezonesets/Indian.txt +30 -0
  1342. embedded_postgres/pginstall/share/timezonesets/Pacific.txt +84 -0
  1343. embedded_postgres/pginstall/share/tsearch_data/danish.stop +94 -0
  1344. embedded_postgres/pginstall/share/tsearch_data/dutch.stop +101 -0
  1345. embedded_postgres/pginstall/share/tsearch_data/english.stop +127 -0
  1346. embedded_postgres/pginstall/share/tsearch_data/finnish.stop +235 -0
  1347. embedded_postgres/pginstall/share/tsearch_data/french.stop +155 -0
  1348. embedded_postgres/pginstall/share/tsearch_data/german.stop +231 -0
  1349. embedded_postgres/pginstall/share/tsearch_data/hungarian.stop +199 -0
  1350. embedded_postgres/pginstall/share/tsearch_data/hunspell_sample.affix +23 -0
  1351. embedded_postgres/pginstall/share/tsearch_data/hunspell_sample_long.affix +53 -0
  1352. embedded_postgres/pginstall/share/tsearch_data/hunspell_sample_long.dict +11 -0
  1353. embedded_postgres/pginstall/share/tsearch_data/hunspell_sample_num.affix +33 -0
  1354. embedded_postgres/pginstall/share/tsearch_data/hunspell_sample_num.dict +9 -0
  1355. embedded_postgres/pginstall/share/tsearch_data/ispell_sample.affix +26 -0
  1356. embedded_postgres/pginstall/share/tsearch_data/ispell_sample.dict +8 -0
  1357. embedded_postgres/pginstall/share/tsearch_data/italian.stop +279 -0
  1358. embedded_postgres/pginstall/share/tsearch_data/nepali.stop +304 -0
  1359. embedded_postgres/pginstall/share/tsearch_data/norwegian.stop +176 -0
  1360. embedded_postgres/pginstall/share/tsearch_data/portuguese.stop +203 -0
  1361. embedded_postgres/pginstall/share/tsearch_data/russian.stop +151 -0
  1362. embedded_postgres/pginstall/share/tsearch_data/spanish.stop +313 -0
  1363. embedded_postgres/pginstall/share/tsearch_data/swedish.stop +114 -0
  1364. embedded_postgres/pginstall/share/tsearch_data/synonym_sample.syn +5 -0
  1365. embedded_postgres/pginstall/share/tsearch_data/thesaurus_sample.ths +17 -0
  1366. embedded_postgres/pginstall/share/tsearch_data/turkish.stop +53 -0
  1367. embedded_postgres/pginstall/share/tsearch_data/unaccent.rules +2661 -0
  1368. embedded_postgres/pginstall/share/tsearch_data/xsyn_sample.rules +6 -0
  1369. embedded_postgres/postgres_server.py +291 -0
  1370. embedded_postgres/py.typed +0 -0
  1371. embedded_postgres/utils.py +278 -0
  1372. embedded_postgres-18.6.0.dist-info/METADATA +106 -0
  1373. embedded_postgres-18.6.0.dist-info/RECORD +1378 -0
  1374. embedded_postgres-18.6.0.dist-info/WHEEL +5 -0
  1375. embedded_postgres-18.6.0.dist-info/licenses/LICENSE +201 -0
  1376. embedded_postgres-18.6.0.dist-info/licenses/NOTICE +10 -0
  1377. embedded_postgres-18.6.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +53 -0
  1378. embedded_postgres-18.6.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,3026 @@
1
+ /*-------------------------------------------------------------------------
2
+ *
3
+ * radixtree.h
4
+ * Template for adaptive radix tree.
5
+ *
6
+ * A template to generate an "adaptive radix tree", specialized for value
7
+ * types and for local/shared memory.
8
+ *
9
+ * The concept originates from the paper "The Adaptive Radix Tree: ARTful
10
+ * Indexing for Main-Memory Databases" by Viktor Leis, Alfons Kemper,
11
+ * and Thomas Neumann, 2013.
12
+ *
13
+ * Radix trees have some advantages over hash tables:
14
+ * - The keys are logically ordered, allowing efficient sorted iteration
15
+ * and range queries
16
+ * - Operations using keys that are lexicographically close together
17
+ * will have favorable memory locality
18
+ * - Memory use grows gradually rather than by doubling
19
+ * - The key does not need to be stored with the value, since the key
20
+ * is implicitly contained in the path to the value
21
+ *
22
+ * Some disadvantages are:
23
+ * - Point queries (along with insertion and deletion) are slower than
24
+ * a linear probing hash table as in simplehash.h
25
+ * - Memory usage varies by key distribution, so is difficult to predict
26
+ *
27
+ * A classic radix tree consists of nodes, each containing an array of
28
+ * pointers to child nodes. The size of the array is determined by the
29
+ * "span" of the tree, which is the number of bits of the key used to
30
+ * index into the array. For example, with a span of 6, a "chunk"
31
+ * of 6 bits is extracted from the key at each node traversal, and
32
+ * the arrays thus have a "fanout" of 2^6 or 64 entries. A large span
33
+ * allows a shorter tree, but requires larger arrays that may be mostly
34
+ * wasted space.
35
+ *
36
+ * The key idea of the adaptive radix tree is to choose different
37
+ * data structures based on the number of child nodes. A node will
38
+ * start out small when it is first populated, and when it is full,
39
+ * it is replaced by the next larger size. Conversely, when a node
40
+ * becomes mostly empty, it is replaced by the next smaller node. The
41
+ * bulk of the code complexity in this module stems from this dynamic
42
+ * switching. One mitigating factor is using a span of 8, since bytes
43
+ * are directly addressable.
44
+ *
45
+ * The ART paper mentions three ways to implement leaves:
46
+ *
47
+ * "- Single-value leaves: The values are stored using an addi-
48
+ * tional leaf node type which stores one value.
49
+ * - Multi-value leaves: The values are stored in one of four
50
+ * different leaf node types, which mirror the structure of
51
+ * inner nodes, but contain values instead of pointers.
52
+ * - Combined pointer/value slots: If values fit into point-
53
+ * ers, no separate node types are necessary. Instead, each
54
+ * pointer storage location in an inner node can either
55
+ * store a pointer or a value."
56
+ *
57
+ * We use a form of "combined pointer/value slots", as recommended. Values
58
+ * of size (if fixed at compile time) equal or smaller than the platform's
59
+ * pointer type are stored in the child slots of the last level node,
60
+ * while larger values are the same as "single-value" leaves above. This
61
+ * offers flexibility and efficiency. Variable-length types are currently
62
+ * treated as single-value leaves for simplicity, but future work may
63
+ * allow those to be stored in the child pointer arrays, when they're
64
+ * small enough.
65
+ *
66
+ * There are two other techniques described in the paper that are not
67
+ * implemented here:
68
+ * - path compression "...removes all inner nodes that have only a single child."
69
+ * - lazy path expansion "...inner nodes are only created if they are required
70
+ * to distinguish at least two leaf nodes."
71
+ *
72
+ * We do have a form of "poor man's path compression", however, enabled by
73
+ * only supporting unsigned integer keys (for now assumed to be 64-bit):
74
+ * A tree doesn't contain paths where the highest bytes of all keys are
75
+ * zero. That way, the tree's height adapts to the distribution of keys.
76
+ *
77
+ * To handle concurrency, we use a single reader-writer lock for the
78
+ * radix tree. If concurrent write operations are possible, the tree
79
+ * must be exclusively locked during write operations such as RT_SET()
80
+ * and RT_DELETE(), and share locked during read operations such as
81
+ * RT_FIND() and RT_BEGIN_ITERATE().
82
+ *
83
+ * TODO: The current locking mechanism is not optimized for high
84
+ * concurrency with mixed read-write workloads. In the future it might
85
+ * be worthwhile to replace it with the Optimistic Lock Coupling or
86
+ * ROWEX mentioned in the paper "The ART of Practical Synchronization"
87
+ * by the same authors as the ART paper, 2016.
88
+ *
89
+ * To generate a radix tree and associated functions for a use case
90
+ * several macros have to be #define'ed before this file is included.
91
+ * Including the file #undef's all those, so a new radix tree can be
92
+ * generated afterwards.
93
+ *
94
+ * The relevant parameters are:
95
+ * - RT_PREFIX - prefix for all symbol names generated. A prefix of "foo"
96
+ * will result in radix tree type "foo_radix_tree" and functions like
97
+ * "foo_create"/"foo_free" and so forth.
98
+ * - RT_DECLARE - if defined function prototypes and type declarations are
99
+ * generated
100
+ * - RT_DEFINE - if defined function definitions are generated
101
+ * - RT_SCOPE - in which scope (e.g. extern, static inline) do function
102
+ * declarations reside
103
+ * - RT_VALUE_TYPE - the type of the value.
104
+ * - RT_VARLEN_VALUE_SIZE() - for variable length values, an expression
105
+ * involving a pointer to the value type, to calculate size.
106
+ * NOTE: implies that the value is in fact variable-length,
107
+ * so do not set for fixed-length values.
108
+ * - RT_RUNTIME_EMBEDDABLE_VALUE - for variable length values, allows
109
+ * storing the value in a child pointer slot, rather than as a single-
110
+ * value leaf, if small enough. This requires that the value, when
111
+ * read as a child pointer, can be tagged in the lowest bit.
112
+ *
113
+ * Optional parameters:
114
+ * - RT_SHMEM - if defined, the radix tree is created in the DSA area
115
+ * so that multiple processes can access it simultaneously.
116
+ * - RT_DEBUG - if defined add stats tracking and debugging functions
117
+ *
118
+ * Interface
119
+ * ---------
120
+ *
121
+ * RT_CREATE - Create a new, empty radix tree
122
+ * RT_FREE - Free the radix tree
123
+ * RT_FIND - Lookup the value for a given key
124
+ * RT_SET - Set a key-value pair
125
+ * RT_BEGIN_ITERATE - Begin iterating through all key-value pairs
126
+ * RT_ITERATE_NEXT - Return next key-value pair, if any
127
+ * RT_END_ITERATE - End iteration
128
+ * RT_MEMORY_USAGE - Get the memory as measured by space in memory context blocks
129
+ *
130
+ * Interface for Shared Memory
131
+ * ---------
132
+ *
133
+ * RT_ATTACH - Attach to the radix tree
134
+ * RT_DETACH - Detach from the radix tree
135
+ * RT_LOCK_EXCLUSIVE - Lock the radix tree in exclusive mode
136
+ * RT_LOCK_SHARE - Lock the radix tree in share mode
137
+ * RT_UNLOCK - Unlock the radix tree
138
+ * RT_GET_HANDLE - Return the handle of the radix tree
139
+ *
140
+ * Optional Interface
141
+ * ---------
142
+ *
143
+ * RT_DELETE - Delete a key-value pair. Declared/defined if RT_USE_DELETE is defined
144
+ *
145
+ *
146
+ * Copyright (c) 2024-2025, PostgreSQL Global Development Group
147
+ *
148
+ * IDENTIFICATION
149
+ * src/include/lib/radixtree.h
150
+ *
151
+ *-------------------------------------------------------------------------
152
+ */
153
+
154
+ #include "nodes/bitmapset.h"
155
+ #include "port/pg_bitutils.h"
156
+ #include "port/simd.h"
157
+ #include "utils/dsa.h"
158
+ #include "utils/memutils.h"
159
+ #ifdef RT_SHMEM
160
+ #include "miscadmin.h"
161
+ #include "storage/lwlock.h"
162
+ #endif
163
+
164
+ /* helpers */
165
+ #define RT_MAKE_PREFIX(a) CppConcat(a,_)
166
+ #define RT_MAKE_NAME(name) RT_MAKE_NAME_(RT_MAKE_PREFIX(RT_PREFIX),name)
167
+ #define RT_MAKE_NAME_(a,b) CppConcat(a,b)
168
+ /*
169
+ * stringify a macro constant, from https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html
170
+ */
171
+ #define RT_STR(s) RT_STR_(s)
172
+ #define RT_STR_(s) #s
173
+
174
+ /* function declarations */
175
+ #define RT_CREATE RT_MAKE_NAME(create)
176
+ #define RT_FREE RT_MAKE_NAME(free)
177
+ #define RT_FIND RT_MAKE_NAME(find)
178
+ #ifdef RT_SHMEM
179
+ #define RT_ATTACH RT_MAKE_NAME(attach)
180
+ #define RT_DETACH RT_MAKE_NAME(detach)
181
+ #define RT_GET_HANDLE RT_MAKE_NAME(get_handle)
182
+ #define RT_LOCK_EXCLUSIVE RT_MAKE_NAME(lock_exclusive)
183
+ #define RT_LOCK_SHARE RT_MAKE_NAME(lock_share)
184
+ #define RT_UNLOCK RT_MAKE_NAME(unlock)
185
+ #endif
186
+ #define RT_SET RT_MAKE_NAME(set)
187
+ #define RT_BEGIN_ITERATE RT_MAKE_NAME(begin_iterate)
188
+ #define RT_ITERATE_NEXT RT_MAKE_NAME(iterate_next)
189
+ #define RT_END_ITERATE RT_MAKE_NAME(end_iterate)
190
+ #ifdef RT_USE_DELETE
191
+ #define RT_DELETE RT_MAKE_NAME(delete)
192
+ #endif
193
+ #define RT_MEMORY_USAGE RT_MAKE_NAME(memory_usage)
194
+ #define RT_DUMP_NODE RT_MAKE_NAME(dump_node)
195
+ #define RT_STATS RT_MAKE_NAME(stats)
196
+
197
+ /* internal helper functions (no externally visible prototypes) */
198
+ #define RT_CHILDPTR_IS_VALUE RT_MAKE_NAME(childptr_is_value)
199
+ #define RT_VALUE_IS_EMBEDDABLE RT_MAKE_NAME(value_is_embeddable)
200
+ #define RT_GET_SLOT_RECURSIVE RT_MAKE_NAME(get_slot_recursive)
201
+ #define RT_DELETE_RECURSIVE RT_MAKE_NAME(delete_recursive)
202
+ #define RT_ALLOC_NODE RT_MAKE_NAME(alloc_node)
203
+ #define RT_ALLOC_LEAF RT_MAKE_NAME(alloc_leaf)
204
+ #define RT_FREE_NODE RT_MAKE_NAME(free_node)
205
+ #define RT_FREE_LEAF RT_MAKE_NAME(free_leaf)
206
+ #define RT_FREE_RECURSE RT_MAKE_NAME(free_recurse)
207
+ #define RT_EXTEND_UP RT_MAKE_NAME(extend_up)
208
+ #define RT_EXTEND_DOWN RT_MAKE_NAME(extend_down)
209
+ #define RT_COPY_COMMON RT_MAKE_NAME(copy_common)
210
+ #define RT_PTR_SET_LOCAL RT_MAKE_NAME(ptr_set_local)
211
+ #define RT_NODE_16_SEARCH_EQ RT_MAKE_NAME(node_16_search_eq)
212
+ #define RT_NODE_4_GET_INSERTPOS RT_MAKE_NAME(node_4_get_insertpos)
213
+ #define RT_NODE_16_GET_INSERTPOS RT_MAKE_NAME(node_16_get_insertpos)
214
+ #define RT_SHIFT_ARRAYS_FOR_INSERT RT_MAKE_NAME(shift_arrays_for_insert)
215
+ #define RT_SHIFT_ARRAYS_AND_DELETE RT_MAKE_NAME(shift_arrays_and_delete)
216
+ #define RT_COPY_ARRAYS_FOR_INSERT RT_MAKE_NAME(copy_arrays_for_insert)
217
+ #define RT_COPY_ARRAYS_AND_DELETE RT_MAKE_NAME(copy_arrays_and_delete)
218
+ #define RT_NODE_48_IS_CHUNK_USED RT_MAKE_NAME(node_48_is_chunk_used)
219
+ #define RT_NODE_48_GET_CHILD RT_MAKE_NAME(node_48_get_child)
220
+ #define RT_NODE_256_IS_CHUNK_USED RT_MAKE_NAME(node_256_is_chunk_used)
221
+ #define RT_NODE_256_GET_CHILD RT_MAKE_NAME(node_256_get_child)
222
+ #define RT_KEY_GET_SHIFT RT_MAKE_NAME(key_get_shift)
223
+ #define RT_SHIFT_GET_MAX_VAL RT_MAKE_NAME(shift_get_max_val)
224
+ #define RT_NODE_SEARCH RT_MAKE_NAME(node_search)
225
+ #define RT_NODE_DELETE RT_MAKE_NAME(node_delete)
226
+ #define RT_NODE_INSERT RT_MAKE_NAME(node_insert)
227
+ #define RT_ADD_CHILD_4 RT_MAKE_NAME(add_child_4)
228
+ #define RT_ADD_CHILD_16 RT_MAKE_NAME(add_child_16)
229
+ #define RT_ADD_CHILD_48 RT_MAKE_NAME(add_child_48)
230
+ #define RT_ADD_CHILD_256 RT_MAKE_NAME(add_child_256)
231
+ #define RT_GROW_NODE_4 RT_MAKE_NAME(grow_node_4)
232
+ #define RT_GROW_NODE_16 RT_MAKE_NAME(grow_node_16)
233
+ #define RT_GROW_NODE_48 RT_MAKE_NAME(grow_node_48)
234
+ #define RT_REMOVE_CHILD_4 RT_MAKE_NAME(remove_child_4)
235
+ #define RT_REMOVE_CHILD_16 RT_MAKE_NAME(remove_child_16)
236
+ #define RT_REMOVE_CHILD_48 RT_MAKE_NAME(remove_child_48)
237
+ #define RT_REMOVE_CHILD_256 RT_MAKE_NAME(remove_child_256)
238
+ #define RT_SHRINK_NODE_16 RT_MAKE_NAME(shrink_child_16)
239
+ #define RT_SHRINK_NODE_48 RT_MAKE_NAME(shrink_child_48)
240
+ #define RT_SHRINK_NODE_256 RT_MAKE_NAME(shrink_child_256)
241
+ #define RT_NODE_ITERATE_NEXT RT_MAKE_NAME(node_iterate_next)
242
+ #define RT_VERIFY_NODE RT_MAKE_NAME(verify_node)
243
+
244
+ /* type declarations */
245
+ #define RT_RADIX_TREE RT_MAKE_NAME(radix_tree)
246
+ #define RT_RADIX_TREE_CONTROL RT_MAKE_NAME(radix_tree_control)
247
+ #define RT_ITER RT_MAKE_NAME(iter)
248
+ #ifdef RT_SHMEM
249
+ #define RT_HANDLE RT_MAKE_NAME(handle)
250
+ #endif
251
+ #define RT_NODE RT_MAKE_NAME(node)
252
+ #define RT_CHILD_PTR RT_MAKE_NAME(child_ptr)
253
+ #define RT_NODE_ITER RT_MAKE_NAME(node_iter)
254
+ #define RT_NODE_4 RT_MAKE_NAME(node_4)
255
+ #define RT_NODE_16 RT_MAKE_NAME(node_16)
256
+ #define RT_NODE_48 RT_MAKE_NAME(node_48)
257
+ #define RT_NODE_256 RT_MAKE_NAME(node_256)
258
+ #define RT_SIZE_CLASS RT_MAKE_NAME(size_class)
259
+ #define RT_SIZE_CLASS_ELEM RT_MAKE_NAME(size_class_elem)
260
+ #define RT_SIZE_CLASS_INFO RT_MAKE_NAME(size_class_info)
261
+ #define RT_CLASS_4 RT_MAKE_NAME(class_4)
262
+ #define RT_CLASS_16_LO RT_MAKE_NAME(class_32_min)
263
+ #define RT_CLASS_16_HI RT_MAKE_NAME(class_32_max)
264
+ #define RT_CLASS_48 RT_MAKE_NAME(class_48)
265
+ #define RT_CLASS_256 RT_MAKE_NAME(class_256)
266
+
267
+ /* generate forward declarations necessary to use the radix tree */
268
+ #ifdef RT_DECLARE
269
+
270
+ typedef struct RT_RADIX_TREE RT_RADIX_TREE;
271
+ typedef struct RT_ITER RT_ITER;
272
+
273
+ #ifdef RT_SHMEM
274
+ typedef dsa_pointer RT_HANDLE;
275
+ #endif
276
+
277
+ #ifdef RT_SHMEM
278
+ RT_SCOPE RT_RADIX_TREE *RT_CREATE(dsa_area *dsa, int tranche_id);
279
+ RT_SCOPE RT_RADIX_TREE *RT_ATTACH(dsa_area *dsa, dsa_pointer dp);
280
+ RT_SCOPE void RT_DETACH(RT_RADIX_TREE * tree);
281
+ RT_SCOPE RT_HANDLE RT_GET_HANDLE(RT_RADIX_TREE * tree);
282
+ RT_SCOPE void RT_LOCK_EXCLUSIVE(RT_RADIX_TREE * tree);
283
+ RT_SCOPE void RT_LOCK_SHARE(RT_RADIX_TREE * tree);
284
+ RT_SCOPE void RT_UNLOCK(RT_RADIX_TREE * tree);
285
+ #else
286
+ RT_SCOPE RT_RADIX_TREE *RT_CREATE(MemoryContext ctx);
287
+ #endif
288
+ RT_SCOPE void RT_FREE(RT_RADIX_TREE * tree);
289
+
290
+ RT_SCOPE RT_VALUE_TYPE *RT_FIND(RT_RADIX_TREE * tree, uint64 key);
291
+ RT_SCOPE bool RT_SET(RT_RADIX_TREE * tree, uint64 key, RT_VALUE_TYPE * value_p);
292
+
293
+ #ifdef RT_USE_DELETE
294
+ RT_SCOPE bool RT_DELETE(RT_RADIX_TREE * tree, uint64 key);
295
+ #endif
296
+
297
+ RT_SCOPE RT_ITER *RT_BEGIN_ITERATE(RT_RADIX_TREE * tree);
298
+ RT_SCOPE RT_VALUE_TYPE *RT_ITERATE_NEXT(RT_ITER * iter, uint64 *key_p);
299
+ RT_SCOPE void RT_END_ITERATE(RT_ITER * iter);
300
+
301
+ RT_SCOPE uint64 RT_MEMORY_USAGE(RT_RADIX_TREE * tree);
302
+
303
+ #ifdef RT_DEBUG
304
+ RT_SCOPE void RT_STATS(RT_RADIX_TREE * tree);
305
+ #endif
306
+
307
+ #endif /* RT_DECLARE */
308
+
309
+
310
+ /* generate implementation of the radix tree */
311
+ #ifdef RT_DEFINE
312
+
313
+ /* The number of bits encoded in one tree level */
314
+ #define RT_SPAN BITS_PER_BYTE
315
+
316
+ /*
317
+ * The number of possible partial keys, and thus the maximum number of
318
+ * child pointers, for a node.
319
+ */
320
+ #define RT_NODE_MAX_SLOTS (1 << RT_SPAN)
321
+
322
+ /* Mask for extracting a chunk from a key */
323
+ #define RT_CHUNK_MASK ((1 << RT_SPAN) - 1)
324
+
325
+ /* Maximum shift needed to extract a chunk from a key */
326
+ #define RT_MAX_SHIFT RT_KEY_GET_SHIFT(UINT64_MAX)
327
+
328
+ /* Maximum level a tree can reach for a key */
329
+ #define RT_MAX_LEVEL ((sizeof(uint64) * BITS_PER_BYTE) / RT_SPAN)
330
+
331
+ /* Get a chunk from the key */
332
+ #define RT_GET_KEY_CHUNK(key, shift) ((uint8) (((key) >> (shift)) & RT_CHUNK_MASK))
333
+
334
+ /* For accessing bitmaps */
335
+ #define RT_BM_IDX(x) ((x) / BITS_PER_BITMAPWORD)
336
+ #define RT_BM_BIT(x) ((x) % BITS_PER_BITMAPWORD)
337
+
338
+ /*
339
+ * Node kinds
340
+ *
341
+ * The different node kinds are what make the tree "adaptive".
342
+ *
343
+ * Each node kind is associated with a different datatype and different
344
+ * search/set/delete/iterate algorithms adapted for its size. The largest
345
+ * kind, node256 is basically the same as a traditional radix tree,
346
+ * and would be most wasteful of memory when sparsely populated. The
347
+ * smaller nodes expend some additional CPU time to enable a smaller
348
+ * memory footprint.
349
+ *
350
+ * NOTE: There are 4 node kinds, and this should never be increased,
351
+ * for several reasons:
352
+ * 1. With 5 or more kinds, gcc tends to use a jump table for switch
353
+ * statements.
354
+ * 2. The 4 kinds can be represented with 2 bits, so we have the option
355
+ * in the future to tag the node pointer with the kind, even on
356
+ * platforms with 32-bit pointers. That would touch fewer cache lines
357
+ * during traversal and allow faster recovery from branch mispredicts.
358
+ * 3. We can have multiple size classes per node kind.
359
+ */
360
+ #define RT_NODE_KIND_4 0x00
361
+ #define RT_NODE_KIND_16 0x01
362
+ #define RT_NODE_KIND_48 0x02
363
+ #define RT_NODE_KIND_256 0x03
364
+ #define RT_NODE_KIND_COUNT 4
365
+
366
+ /*
367
+ * Calculate the slab block size so that we can allocate at least 32 chunks
368
+ * from the block.
369
+ */
370
+ #define RT_SLAB_BLOCK_SIZE(size) \
371
+ Max(SLAB_DEFAULT_BLOCK_SIZE, pg_nextpower2_32(size * 32))
372
+
373
+ /* Common header for all nodes */
374
+ typedef struct RT_NODE
375
+ {
376
+ /* Node kind, one per search/set algorithm */
377
+ uint8 kind;
378
+
379
+ /*
380
+ * Max capacity for the current size class. Storing this in the node
381
+ * enables multiple size classes per node kind. uint8 is sufficient for
382
+ * all node kinds, because we only use this number to test if the node
383
+ * needs to grow. Since node256 never needs to grow, we let this overflow
384
+ * to zero.
385
+ */
386
+ uint8 fanout;
387
+
388
+ /*
389
+ * Number of children. uint8 is sufficient for all node kinds, because
390
+ * nodes shrink when this number gets lower than some threshold. Since
391
+ * node256 cannot possibly have zero children, we let the counter overflow
392
+ * and we interpret zero as "256" for this node kind.
393
+ */
394
+ uint8 count;
395
+ } RT_NODE;
396
+
397
+
398
+ /* pointer returned by allocation */
399
+ #ifdef RT_SHMEM
400
+ #define RT_PTR_ALLOC dsa_pointer
401
+ #define RT_INVALID_PTR_ALLOC InvalidDsaPointer
402
+ #define RT_PTR_ALLOC_IS_VALID(ptr) DsaPointerIsValid(ptr)
403
+ #else
404
+ #define RT_PTR_ALLOC RT_NODE *
405
+ #define RT_INVALID_PTR_ALLOC NULL
406
+ #define RT_PTR_ALLOC_IS_VALID(ptr) PointerIsValid(ptr)
407
+ #endif
408
+
409
+ /*
410
+ * A convenience type used when we need to work with a DSA pointer as well
411
+ * as its local pointer. For local memory, both members are the same, so
412
+ * we use a union.
413
+ */
414
+ #ifdef RT_SHMEM
415
+ typedef struct RT_CHILD_PTR
416
+ #else
417
+ typedef union RT_CHILD_PTR
418
+ #endif
419
+ {
420
+ RT_PTR_ALLOC alloc;
421
+ RT_NODE *local;
422
+ } RT_CHILD_PTR;
423
+
424
+
425
+ /*
426
+ * Helper macros and functions for value storage.
427
+ * We either embed values in the child slots of the last level
428
+ * node or store pointers to values to the child slots,
429
+ * depending on the value size.
430
+ */
431
+
432
+ #ifdef RT_VARLEN_VALUE_SIZE
433
+ #define RT_GET_VALUE_SIZE(v) RT_VARLEN_VALUE_SIZE(v)
434
+ #else
435
+ #define RT_GET_VALUE_SIZE(v) sizeof(RT_VALUE_TYPE)
436
+ #endif
437
+
438
+ /*
439
+ * Return true if the value can be stored in the child array
440
+ * of the lowest-level node, false otherwise.
441
+ */
442
+ static inline bool
443
+ RT_VALUE_IS_EMBEDDABLE(RT_VALUE_TYPE * value_p)
444
+ {
445
+ #ifdef RT_VARLEN_VALUE_SIZE
446
+
447
+ #ifdef RT_RUNTIME_EMBEDDABLE_VALUE
448
+ return RT_GET_VALUE_SIZE(value_p) <= sizeof(RT_PTR_ALLOC);
449
+ #else
450
+ return false;
451
+ #endif
452
+
453
+ #else
454
+ return RT_GET_VALUE_SIZE(value_p) <= sizeof(RT_PTR_ALLOC);
455
+ #endif
456
+ }
457
+
458
+ /*
459
+ * Return true if the child pointer contains the value, false
460
+ * if the child pointer is a leaf pointer.
461
+ */
462
+ static inline bool
463
+ RT_CHILDPTR_IS_VALUE(RT_PTR_ALLOC child)
464
+ {
465
+ #ifdef RT_VARLEN_VALUE_SIZE
466
+
467
+ #ifdef RT_RUNTIME_EMBEDDABLE_VALUE
468
+ /* check for pointer tag */
469
+ #ifdef RT_SHMEM
470
+ return child & 1;
471
+ #else
472
+ return ((uintptr_t) child) & 1;
473
+ #endif
474
+
475
+ #else
476
+ return false;
477
+ #endif
478
+
479
+ #else
480
+ return sizeof(RT_VALUE_TYPE) <= sizeof(RT_PTR_ALLOC);
481
+ #endif
482
+ }
483
+
484
+ /*
485
+ * Symbols for maximum possible fanout are declared first as they are
486
+ * required to declare each node kind. The declarations of other fanout
487
+ * values are followed as they need the struct sizes of each node kind.
488
+ */
489
+
490
+ /* max possible key chunks without struct padding */
491
+ #define RT_FANOUT_4_MAX (8 - sizeof(RT_NODE))
492
+
493
+ /* equal to two 128-bit SIMD registers, regardless of availability */
494
+ #define RT_FANOUT_16_MAX 32
495
+
496
+ /*
497
+ * This also determines the number of bits necessary for the isset array,
498
+ * so we need to be mindful of the size of bitmapword. Since bitmapword
499
+ * can be 64 bits, the only values that make sense here are 64 and 128.
500
+ * The ART paper uses at most 64 for this node kind, and one advantage
501
+ * for us is that "isset" is a single bitmapword on most platforms,
502
+ * rather than an array, allowing the compiler to get rid of loops.
503
+ */
504
+ #define RT_FANOUT_48_MAX 64
505
+
506
+ #define RT_FANOUT_256 RT_NODE_MAX_SLOTS
507
+
508
+ /*
509
+ * Node structs, one for each "kind"
510
+ */
511
+
512
+ /*
513
+ * node4 and node16 use one array for key chunks and another
514
+ * array of the same length for children. The keys and children
515
+ * are stored at corresponding positions, sorted by chunk.
516
+ */
517
+
518
+ typedef struct RT_NODE_4
519
+ {
520
+ RT_NODE base;
521
+
522
+ uint8 chunks[RT_FANOUT_4_MAX];
523
+
524
+ /* number of children depends on size class */
525
+ RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER];
526
+ } RT_NODE_4;
527
+
528
+ typedef struct RT_NODE_16
529
+ {
530
+ RT_NODE base;
531
+
532
+ uint8 chunks[RT_FANOUT_16_MAX];
533
+
534
+ /* number of children depends on size class */
535
+ RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER];
536
+ } RT_NODE_16;
537
+
538
+ /*
539
+ * node48 uses a 256-element array indexed by key chunks. This array
540
+ * stores indexes into a second array containing the children.
541
+ */
542
+ typedef struct RT_NODE_48
543
+ {
544
+ RT_NODE base;
545
+
546
+ /* bitmap to track which slots are in use */
547
+ bitmapword isset[RT_BM_IDX(RT_FANOUT_48_MAX)];
548
+
549
+ /*
550
+ * Lookup table for indexes into the children[] array. We make this the
551
+ * last fixed-size member so that it's convenient to memset separately
552
+ * from the previous members.
553
+ */
554
+ uint8 slot_idxs[RT_NODE_MAX_SLOTS];
555
+
556
+ /* Invalid index */
557
+ #define RT_INVALID_SLOT_IDX 0xFF
558
+
559
+ /* number of children depends on size class */
560
+ RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER];
561
+ } RT_NODE_48;
562
+
563
+ /*
564
+ * node256 is the largest node type. This node has an array of
565
+ * children directly indexed by chunk. Unlike other node kinds,
566
+ * its array size is by definition fixed.
567
+ */
568
+ typedef struct RT_NODE_256
569
+ {
570
+ RT_NODE base;
571
+
572
+ /* bitmap to track which slots are in use */
573
+ bitmapword isset[RT_BM_IDX(RT_FANOUT_256)];
574
+
575
+ /* slots for 256 children */
576
+ RT_PTR_ALLOC children[RT_FANOUT_256];
577
+ } RT_NODE_256;
578
+
579
+ #if defined(RT_SHMEM)
580
+ /*
581
+ * Make sure the all nodes (except for node256) fit neatly into a DSA
582
+ * size class. We assume the RT_FANOUT_4 is in the range where DSA size
583
+ * classes increment by 8 (as of PG17 up to 64 bytes), so we just hard
584
+ * code that one.
585
+ */
586
+
587
+ #if SIZEOF_DSA_POINTER < 8
588
+ #define RT_FANOUT_16_LO ((96 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC))
589
+ #define RT_FANOUT_16_HI Min(RT_FANOUT_16_MAX, (160 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC))
590
+ #define RT_FANOUT_48 Min(RT_FANOUT_48_MAX, (512 - offsetof(RT_NODE_48, children)) / sizeof(RT_PTR_ALLOC))
591
+ #else
592
+ #define RT_FANOUT_16_LO ((160 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC))
593
+ #define RT_FANOUT_16_HI Min(RT_FANOUT_16_MAX, (320 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC))
594
+ #define RT_FANOUT_48 Min(RT_FANOUT_48_MAX, (768 - offsetof(RT_NODE_48, children)) / sizeof(RT_PTR_ALLOC))
595
+ #endif /* SIZEOF_DSA_POINTER < 8 */
596
+
597
+ #else /* ! RT_SHMEM */
598
+
599
+ /* doesn't really matter, but may as well use the namesake */
600
+ #define RT_FANOUT_16_LO 16
601
+ /* use maximum possible */
602
+ #define RT_FANOUT_16_HI RT_FANOUT_16_MAX
603
+ #define RT_FANOUT_48 RT_FANOUT_48_MAX
604
+
605
+ #endif /* RT_SHMEM */
606
+
607
+ /*
608
+ * To save memory in trees with sparse keys, it would make sense to have two
609
+ * size classes for the smallest kind (perhaps a high class of 5 and a low class
610
+ * of 2), but it would be more effective to utilize lazy expansion and
611
+ * path compression.
612
+ */
613
+ #define RT_FANOUT_4 4
614
+
615
+ StaticAssertDecl(RT_FANOUT_4 <= RT_FANOUT_4_MAX, "watch struct padding");
616
+ StaticAssertDecl(RT_FANOUT_16_LO < RT_FANOUT_16_HI, "LO subclass bigger than HI");
617
+ StaticAssertDecl(RT_FANOUT_48 <= RT_FANOUT_48_MAX, "more slots than isset bits");
618
+
619
+ /*
620
+ * Node size classes
621
+ *
622
+ * Nodes of different kinds necessarily belong to different size classes.
623
+ * One innovation in our implementation compared to the ART paper is
624
+ * decoupling the notion of size class from kind.
625
+ *
626
+ * The size classes within a given node kind have the same underlying
627
+ * type, but a variable number of children/values. This is possible
628
+ * because each type (except node256) contains metadata that work the
629
+ * same way regardless of how many child slots there are. The nodes
630
+ * can introspect their allocated capacity at runtime.
631
+ */
632
+ typedef enum RT_SIZE_CLASS
633
+ {
634
+ RT_CLASS_4 = 0,
635
+ RT_CLASS_16_LO,
636
+ RT_CLASS_16_HI,
637
+ RT_CLASS_48,
638
+ RT_CLASS_256
639
+ } RT_SIZE_CLASS;
640
+
641
+ /* Information for each size class */
642
+ typedef struct RT_SIZE_CLASS_ELEM
643
+ {
644
+ const char *name;
645
+ int fanout;
646
+ size_t allocsize;
647
+ } RT_SIZE_CLASS_ELEM;
648
+
649
+
650
+ static const RT_SIZE_CLASS_ELEM RT_SIZE_CLASS_INFO[] = {
651
+ [RT_CLASS_4] = {
652
+ .name = RT_STR(RT_PREFIX) "_radix_tree node4",
653
+ .fanout = RT_FANOUT_4,
654
+ .allocsize = sizeof(RT_NODE_4) + RT_FANOUT_4 * sizeof(RT_PTR_ALLOC),
655
+ },
656
+ [RT_CLASS_16_LO] = {
657
+ .name = RT_STR(RT_PREFIX) "_radix_tree node16_lo",
658
+ .fanout = RT_FANOUT_16_LO,
659
+ .allocsize = sizeof(RT_NODE_16) + RT_FANOUT_16_LO * sizeof(RT_PTR_ALLOC),
660
+ },
661
+ [RT_CLASS_16_HI] = {
662
+ .name = RT_STR(RT_PREFIX) "_radix_tree node16_hi",
663
+ .fanout = RT_FANOUT_16_HI,
664
+ .allocsize = sizeof(RT_NODE_16) + RT_FANOUT_16_HI * sizeof(RT_PTR_ALLOC),
665
+ },
666
+ [RT_CLASS_48] = {
667
+ .name = RT_STR(RT_PREFIX) "_radix_tree node48",
668
+ .fanout = RT_FANOUT_48,
669
+ .allocsize = sizeof(RT_NODE_48) + RT_FANOUT_48 * sizeof(RT_PTR_ALLOC),
670
+ },
671
+ [RT_CLASS_256] = {
672
+ .name = RT_STR(RT_PREFIX) "_radix_tree node256",
673
+ .fanout = RT_FANOUT_256,
674
+ .allocsize = sizeof(RT_NODE_256),
675
+ },
676
+ };
677
+
678
+ #define RT_NUM_SIZE_CLASSES lengthof(RT_SIZE_CLASS_INFO)
679
+
680
+ #ifdef RT_SHMEM
681
+ /* A magic value used to identify our radix tree */
682
+ #define RT_RADIX_TREE_MAGIC 0x54A48167
683
+ #endif
684
+
685
+ /* Contains the actual tree, plus ancillary info */
686
+ typedef struct RT_RADIX_TREE_CONTROL
687
+ {
688
+ #ifdef RT_SHMEM
689
+ RT_HANDLE handle;
690
+ uint32 magic;
691
+ LWLock lock;
692
+ #endif
693
+
694
+ RT_PTR_ALLOC root;
695
+ uint64 max_val;
696
+ int64 num_keys;
697
+ int start_shift;
698
+
699
+ /* statistics */
700
+ #ifdef RT_DEBUG
701
+ int64 num_nodes[RT_NUM_SIZE_CLASSES];
702
+ int64 num_leaves;
703
+ #endif
704
+ } RT_RADIX_TREE_CONTROL;
705
+
706
+ /* Entry point for allocating and accessing the tree */
707
+ struct RT_RADIX_TREE
708
+ {
709
+ /* pointing to either local memory or DSA */
710
+ RT_RADIX_TREE_CONTROL *ctl;
711
+
712
+ #ifdef RT_SHMEM
713
+ dsa_area *dsa;
714
+ #else
715
+ MemoryContextData *node_slabs[RT_NUM_SIZE_CLASSES];
716
+
717
+ /* leaf_context is used only for single-value leaves */
718
+ MemoryContextData *leaf_context;
719
+ #endif
720
+ };
721
+
722
+ /*
723
+ * Iteration support.
724
+ *
725
+ * Iterating over the radix tree produces each key/value pair in ascending
726
+ * order of the key.
727
+ */
728
+
729
+ /* state for iterating over a single node */
730
+ typedef struct RT_NODE_ITER
731
+ {
732
+ RT_CHILD_PTR node;
733
+
734
+ /*
735
+ * The next index of the chunk array in RT_NODE_KIND_4 and RT_NODE_KIND_16
736
+ * nodes, or the next chunk in RT_NODE_KIND_48 and RT_NODE_KIND_256 nodes.
737
+ * 0 for the initial value.
738
+ */
739
+ int idx;
740
+ } RT_NODE_ITER;
741
+
742
+ /* state for iterating over the whole radix tree */
743
+ struct RT_ITER
744
+ {
745
+ RT_RADIX_TREE *tree;
746
+
747
+ /*
748
+ * A stack to track iteration for each level. Level 0 is the lowest (or
749
+ * leaf) level
750
+ */
751
+ RT_NODE_ITER node_iters[RT_MAX_LEVEL];
752
+ int top_level;
753
+ int cur_level;
754
+
755
+ /* The key constructed during iteration */
756
+ uint64 key;
757
+ };
758
+
759
+
760
+ /* verification (available only in assert-enabled builds) */
761
+ static void RT_VERIFY_NODE(RT_NODE * node);
762
+
763
+ static inline void
764
+ RT_PTR_SET_LOCAL(RT_RADIX_TREE * tree, RT_CHILD_PTR * node)
765
+ {
766
+ #ifdef RT_SHMEM
767
+ node->local = dsa_get_address(tree->dsa, node->alloc);
768
+ #endif
769
+ }
770
+
771
+ /* Convenience functions for node48 and node256 */
772
+
773
+ /* Return true if there is an entry for "chunk" */
774
+ static inline bool
775
+ RT_NODE_48_IS_CHUNK_USED(RT_NODE_48 * node, uint8 chunk)
776
+ {
777
+ return node->slot_idxs[chunk] != RT_INVALID_SLOT_IDX;
778
+ }
779
+
780
+ static inline RT_PTR_ALLOC *
781
+ RT_NODE_48_GET_CHILD(RT_NODE_48 * node, uint8 chunk)
782
+ {
783
+ return &node->children[node->slot_idxs[chunk]];
784
+ }
785
+
786
+ /* Return true if there is an entry for "chunk" */
787
+ static inline bool
788
+ RT_NODE_256_IS_CHUNK_USED(RT_NODE_256 * node, uint8 chunk)
789
+ {
790
+ int idx = RT_BM_IDX(chunk);
791
+ int bitnum = RT_BM_BIT(chunk);
792
+
793
+ return (node->isset[idx] & ((bitmapword) 1 << bitnum)) != 0;
794
+ }
795
+
796
+ static inline RT_PTR_ALLOC *
797
+ RT_NODE_256_GET_CHILD(RT_NODE_256 * node, uint8 chunk)
798
+ {
799
+ Assert(RT_NODE_256_IS_CHUNK_USED(node, chunk));
800
+ return &node->children[chunk];
801
+ }
802
+
803
+ /*
804
+ * Return the smallest shift that will allowing storing the given key.
805
+ */
806
+ static inline int
807
+ RT_KEY_GET_SHIFT(uint64 key)
808
+ {
809
+ if (key == 0)
810
+ return 0;
811
+ else
812
+ return (pg_leftmost_one_pos64(key) / RT_SPAN) * RT_SPAN;
813
+ }
814
+
815
+ /*
816
+ * Return the max value that can be stored in the tree with the given shift.
817
+ */
818
+ static uint64
819
+ RT_SHIFT_GET_MAX_VAL(int shift)
820
+ {
821
+ if (shift == RT_MAX_SHIFT)
822
+ return UINT64_MAX;
823
+ else
824
+ return (UINT64CONST(1) << (shift + RT_SPAN)) - 1;
825
+ }
826
+
827
+ /*
828
+ * Allocate a new node with the given node kind and size class.
829
+ */
830
+ static inline RT_CHILD_PTR
831
+ RT_ALLOC_NODE(RT_RADIX_TREE * tree, const uint8 kind, const RT_SIZE_CLASS size_class)
832
+ {
833
+ RT_CHILD_PTR allocnode;
834
+ RT_NODE *node;
835
+ size_t allocsize;
836
+
837
+ allocsize = RT_SIZE_CLASS_INFO[size_class].allocsize;
838
+
839
+ #ifdef RT_SHMEM
840
+ allocnode.alloc = dsa_allocate(tree->dsa, allocsize);
841
+ #else
842
+ allocnode.alloc = (RT_PTR_ALLOC) MemoryContextAlloc(tree->node_slabs[size_class],
843
+ allocsize);
844
+ #endif
845
+
846
+ RT_PTR_SET_LOCAL(tree, &allocnode);
847
+ node = allocnode.local;
848
+
849
+ /* initialize contents */
850
+
851
+ switch (kind)
852
+ {
853
+ case RT_NODE_KIND_4:
854
+ memset(node, 0, offsetof(RT_NODE_4, children));
855
+ break;
856
+ case RT_NODE_KIND_16:
857
+ memset(node, 0, offsetof(RT_NODE_16, children));
858
+ break;
859
+ case RT_NODE_KIND_48:
860
+ {
861
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node;
862
+
863
+ memset(n48, 0, offsetof(RT_NODE_48, slot_idxs));
864
+ memset(n48->slot_idxs, RT_INVALID_SLOT_IDX, sizeof(n48->slot_idxs));
865
+ break;
866
+ }
867
+ case RT_NODE_KIND_256:
868
+ memset(node, 0, offsetof(RT_NODE_256, children));
869
+ break;
870
+ default:
871
+ pg_unreachable();
872
+ }
873
+
874
+ node->kind = kind;
875
+
876
+ /*
877
+ * For node256, this will actually overflow to zero, but that's okay
878
+ * because that node doesn't need to introspect this value.
879
+ */
880
+ node->fanout = RT_SIZE_CLASS_INFO[size_class].fanout;
881
+
882
+ #ifdef RT_DEBUG
883
+ /* update the statistics */
884
+ tree->ctl->num_nodes[size_class]++;
885
+ #endif
886
+
887
+ return allocnode;
888
+ }
889
+
890
+ /*
891
+ * Allocate a new leaf.
892
+ */
893
+ static RT_CHILD_PTR
894
+ RT_ALLOC_LEAF(RT_RADIX_TREE * tree, size_t allocsize)
895
+ {
896
+ RT_CHILD_PTR leaf;
897
+
898
+ #ifdef RT_SHMEM
899
+ leaf.alloc = dsa_allocate(tree->dsa, allocsize);
900
+ RT_PTR_SET_LOCAL(tree, &leaf);
901
+ #else
902
+ leaf.alloc = (RT_PTR_ALLOC) MemoryContextAlloc(tree->leaf_context, allocsize);
903
+ #endif
904
+
905
+ #ifdef RT_DEBUG
906
+ tree->ctl->num_leaves++;
907
+ #endif
908
+
909
+ return leaf;
910
+ }
911
+
912
+ /*
913
+ * Copy relevant members of the node header.
914
+ * This is a separate function in case other fields are added.
915
+ */
916
+ static inline void
917
+ RT_COPY_COMMON(RT_CHILD_PTR newnode, RT_CHILD_PTR oldnode)
918
+ {
919
+ (newnode.local)->count = (oldnode.local)->count;
920
+ }
921
+
922
+ /* Free the given node */
923
+ static void
924
+ RT_FREE_NODE(RT_RADIX_TREE * tree, RT_CHILD_PTR node)
925
+ {
926
+ #ifdef RT_DEBUG
927
+ int i;
928
+
929
+ /* update the statistics */
930
+
931
+ for (i = 0; i < RT_NUM_SIZE_CLASSES; i++)
932
+ {
933
+ if ((node.local)->fanout == RT_SIZE_CLASS_INFO[i].fanout)
934
+ break;
935
+ }
936
+
937
+ /*
938
+ * The fanout of node256 will appear to be zero within the node header
939
+ * because of overflow, so we need an extra check here.
940
+ */
941
+ if (i == RT_NUM_SIZE_CLASSES)
942
+ i = RT_CLASS_256;
943
+
944
+ tree->ctl->num_nodes[i]--;
945
+ Assert(tree->ctl->num_nodes[i] >= 0);
946
+ #endif
947
+
948
+ #ifdef RT_SHMEM
949
+ dsa_free(tree->dsa, node.alloc);
950
+ #else
951
+ pfree(node.alloc);
952
+ #endif
953
+ }
954
+
955
+ static inline void
956
+ RT_FREE_LEAF(RT_RADIX_TREE * tree, RT_PTR_ALLOC leaf)
957
+ {
958
+ Assert(leaf != tree->ctl->root);
959
+
960
+ #ifdef RT_DEBUG
961
+ /* update the statistics */
962
+ tree->ctl->num_leaves--;
963
+ Assert(tree->ctl->num_leaves >= 0);
964
+ #endif
965
+
966
+ #ifdef RT_SHMEM
967
+ dsa_free(tree->dsa, leaf);
968
+ #else
969
+ pfree(leaf);
970
+ #endif
971
+ }
972
+
973
+ /***************** SEARCH *****************/
974
+
975
+ /*
976
+ * Return the address of the child corresponding to "chunk",
977
+ * or NULL if there is no such element.
978
+ */
979
+ static inline RT_PTR_ALLOC *
980
+ RT_NODE_16_SEARCH_EQ(RT_NODE_16 * node, uint8 chunk)
981
+ {
982
+ int count = node->base.count;
983
+ #ifndef USE_NO_SIMD
984
+ Vector8 spread_chunk;
985
+ Vector8 haystack1;
986
+ Vector8 haystack2;
987
+ Vector8 cmp1;
988
+ Vector8 cmp2;
989
+ uint32 bitfield;
990
+ RT_PTR_ALLOC *slot_simd = NULL;
991
+ #endif
992
+
993
+ #if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING)
994
+ RT_PTR_ALLOC *slot = NULL;
995
+
996
+ for (int i = 0; i < count; i++)
997
+ {
998
+ if (node->chunks[i] == chunk)
999
+ {
1000
+ slot = &node->children[i];
1001
+ break;
1002
+ }
1003
+ }
1004
+ #endif
1005
+
1006
+ #ifndef USE_NO_SIMD
1007
+ /* replicate the search key */
1008
+ spread_chunk = vector8_broadcast(chunk);
1009
+
1010
+ /* compare to all 32 keys stored in the node */
1011
+ vector8_load(&haystack1, &node->chunks[0]);
1012
+ vector8_load(&haystack2, &node->chunks[sizeof(Vector8)]);
1013
+ cmp1 = vector8_eq(spread_chunk, haystack1);
1014
+ cmp2 = vector8_eq(spread_chunk, haystack2);
1015
+
1016
+ /* convert comparison to a bitfield */
1017
+ bitfield = vector8_highbit_mask(cmp1) | (vector8_highbit_mask(cmp2) << sizeof(Vector8));
1018
+
1019
+ /* mask off invalid entries */
1020
+ bitfield &= ((UINT64CONST(1) << count) - 1);
1021
+
1022
+ /* convert bitfield to index by counting trailing zeros */
1023
+ if (bitfield)
1024
+ slot_simd = &node->children[pg_rightmost_one_pos32(bitfield)];
1025
+
1026
+ Assert(slot_simd == slot);
1027
+ return slot_simd;
1028
+ #else
1029
+ return slot;
1030
+ #endif
1031
+ }
1032
+
1033
+ /*
1034
+ * Search for the child pointer corresponding to "key" in the given node.
1035
+ *
1036
+ * Return child if the key is found, otherwise return NULL.
1037
+ */
1038
+ static inline RT_PTR_ALLOC *
1039
+ RT_NODE_SEARCH(RT_NODE * node, uint8 chunk)
1040
+ {
1041
+ /* Make sure we already converted to local pointer */
1042
+ Assert(node != NULL);
1043
+
1044
+ switch (node->kind)
1045
+ {
1046
+ case RT_NODE_KIND_4:
1047
+ {
1048
+ RT_NODE_4 *n4 = (RT_NODE_4 *) node;
1049
+
1050
+ for (int i = 0; i < n4->base.count; i++)
1051
+ {
1052
+ if (n4->chunks[i] == chunk)
1053
+ return &n4->children[i];
1054
+ }
1055
+ return NULL;
1056
+ }
1057
+ case RT_NODE_KIND_16:
1058
+ return RT_NODE_16_SEARCH_EQ((RT_NODE_16 *) node, chunk);
1059
+ case RT_NODE_KIND_48:
1060
+ {
1061
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node;
1062
+ int slotpos = n48->slot_idxs[chunk];
1063
+
1064
+ if (slotpos == RT_INVALID_SLOT_IDX)
1065
+ return NULL;
1066
+
1067
+ return RT_NODE_48_GET_CHILD(n48, chunk);
1068
+ }
1069
+ case RT_NODE_KIND_256:
1070
+ {
1071
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node;
1072
+
1073
+ if (!RT_NODE_256_IS_CHUNK_USED(n256, chunk))
1074
+ return NULL;
1075
+
1076
+ return RT_NODE_256_GET_CHILD(n256, chunk);
1077
+ }
1078
+ default:
1079
+ pg_unreachable();
1080
+ }
1081
+ }
1082
+
1083
+ /*
1084
+ * Search the given key in the radix tree. Return the pointer to the value if found,
1085
+ * otherwise return NULL.
1086
+ *
1087
+ * Since the function returns a pointer (to support variable-length values),
1088
+ * the caller is responsible for locking until it's finished with the value.
1089
+ */
1090
+ RT_SCOPE RT_VALUE_TYPE *
1091
+ RT_FIND(RT_RADIX_TREE * tree, uint64 key)
1092
+ {
1093
+ RT_CHILD_PTR node;
1094
+ RT_PTR_ALLOC *slot = NULL;
1095
+ int shift;
1096
+
1097
+ #ifdef RT_SHMEM
1098
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1099
+ #endif
1100
+
1101
+ if (key > tree->ctl->max_val)
1102
+ return NULL;
1103
+
1104
+ Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root));
1105
+ node.alloc = tree->ctl->root;
1106
+ shift = tree->ctl->start_shift;
1107
+
1108
+ /* Descend the tree */
1109
+ while (shift >= 0)
1110
+ {
1111
+ RT_PTR_SET_LOCAL(tree, &node);
1112
+ slot = RT_NODE_SEARCH(node.local, RT_GET_KEY_CHUNK(key, shift));
1113
+ if (slot == NULL)
1114
+ return NULL;
1115
+
1116
+ node.alloc = *slot;
1117
+ shift -= RT_SPAN;
1118
+ }
1119
+
1120
+ if (RT_CHILDPTR_IS_VALUE(*slot))
1121
+ return (RT_VALUE_TYPE *) slot;
1122
+ else
1123
+ {
1124
+ RT_PTR_SET_LOCAL(tree, &node);
1125
+ return (RT_VALUE_TYPE *) node.local;
1126
+ }
1127
+ }
1128
+
1129
+ /***************** INSERTION *****************/
1130
+
1131
+ #define RT_NODE_MUST_GROW(node) \
1132
+ ((node)->count == (node)->fanout)
1133
+
1134
+ /*
1135
+ * Return index of the chunk and slot arrays for inserting into the node,
1136
+ * such that the arrays remain ordered.
1137
+ */
1138
+ static inline int
1139
+ RT_NODE_4_GET_INSERTPOS(RT_NODE_4 * node, uint8 chunk, int count)
1140
+ {
1141
+ int idx;
1142
+
1143
+ for (idx = 0; idx < count; idx++)
1144
+ {
1145
+ if (node->chunks[idx] >= chunk)
1146
+ break;
1147
+ }
1148
+
1149
+ return idx;
1150
+ }
1151
+
1152
+ /*
1153
+ * Return index of the chunk and slot arrays for inserting into the node,
1154
+ * such that the arrays remain ordered.
1155
+ */
1156
+ static inline int
1157
+ RT_NODE_16_GET_INSERTPOS(RT_NODE_16 * node, uint8 chunk)
1158
+ {
1159
+ int count = node->base.count;
1160
+ #if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING)
1161
+ int index;
1162
+ #endif
1163
+
1164
+ #ifndef USE_NO_SIMD
1165
+ Vector8 spread_chunk;
1166
+ Vector8 haystack1;
1167
+ Vector8 haystack2;
1168
+ Vector8 cmp1;
1169
+ Vector8 cmp2;
1170
+ Vector8 min1;
1171
+ Vector8 min2;
1172
+ uint32 bitfield;
1173
+ int index_simd;
1174
+ #endif
1175
+
1176
+ /*
1177
+ * First compare the last element. There are two reasons to branch here:
1178
+ *
1179
+ * 1) A realistic pattern is inserting ordered keys. In that case,
1180
+ * non-SIMD platforms must do a linear search to the last chunk to find
1181
+ * the insert position. This will get slower as the node fills up.
1182
+ *
1183
+ * 2) On SIMD platforms, we must branch anyway to make sure we don't bit
1184
+ * scan an empty bitfield. Doing the branch here eliminates some work that
1185
+ * we might otherwise throw away.
1186
+ */
1187
+ Assert(count > 0);
1188
+ if (node->chunks[count - 1] < chunk)
1189
+ return count;
1190
+
1191
+ #if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING)
1192
+
1193
+ for (index = 0; index < count; index++)
1194
+ {
1195
+ if (node->chunks[index] > chunk)
1196
+ break;
1197
+ }
1198
+ #endif
1199
+
1200
+ #ifndef USE_NO_SIMD
1201
+
1202
+ /*
1203
+ * This is a bit more complicated than RT_NODE_16_SEARCH_EQ(), because no
1204
+ * unsigned uint8 comparison instruction exists, at least for SSE2. So we
1205
+ * need to play some trickery using vector8_min() to effectively get >=.
1206
+ * There'll never be any equal elements in current uses, but that's what
1207
+ * we get here...
1208
+ */
1209
+ spread_chunk = vector8_broadcast(chunk);
1210
+ vector8_load(&haystack1, &node->chunks[0]);
1211
+ vector8_load(&haystack2, &node->chunks[sizeof(Vector8)]);
1212
+ min1 = vector8_min(spread_chunk, haystack1);
1213
+ min2 = vector8_min(spread_chunk, haystack2);
1214
+ cmp1 = vector8_eq(spread_chunk, min1);
1215
+ cmp2 = vector8_eq(spread_chunk, min2);
1216
+ bitfield = vector8_highbit_mask(cmp1) | (vector8_highbit_mask(cmp2) << sizeof(Vector8));
1217
+
1218
+ Assert((bitfield & ((UINT64CONST(1) << count) - 1)) != 0);
1219
+ index_simd = pg_rightmost_one_pos32(bitfield);
1220
+
1221
+ Assert(index_simd == index);
1222
+ return index_simd;
1223
+ #else
1224
+ return index;
1225
+ #endif
1226
+ }
1227
+
1228
+ /* Shift the elements right at "insertpos" by one */
1229
+ static inline void
1230
+ RT_SHIFT_ARRAYS_FOR_INSERT(uint8 *chunks, RT_PTR_ALLOC * children, int count, int insertpos)
1231
+ {
1232
+ /*
1233
+ * This is basically a memmove, but written in a simple loop for speed on
1234
+ * small inputs.
1235
+ */
1236
+ for (int i = count - 1; i >= insertpos; i--)
1237
+ {
1238
+ /* workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101481 */
1239
+ #ifdef __GNUC__
1240
+ __asm__("");
1241
+ #endif
1242
+ chunks[i + 1] = chunks[i];
1243
+ children[i + 1] = children[i];
1244
+ }
1245
+ }
1246
+
1247
+ /*
1248
+ * Copy both chunk and slot arrays into the right
1249
+ * place. The caller is responsible for inserting the new element.
1250
+ */
1251
+ static inline void
1252
+ RT_COPY_ARRAYS_FOR_INSERT(uint8 *dst_chunks, RT_PTR_ALLOC * dst_children,
1253
+ uint8 *src_chunks, RT_PTR_ALLOC * src_children,
1254
+ int count, int insertpos)
1255
+ {
1256
+ for (int i = 0; i < count; i++)
1257
+ {
1258
+ int sourceidx = i;
1259
+
1260
+ /* use a branch-free computation to skip the index of the new element */
1261
+ int destidx = i + (i >= insertpos);
1262
+
1263
+ dst_chunks[destidx] = src_chunks[sourceidx];
1264
+ dst_children[destidx] = src_children[sourceidx];
1265
+ }
1266
+ }
1267
+
1268
+ static inline RT_PTR_ALLOC *
1269
+ RT_ADD_CHILD_256(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk)
1270
+ {
1271
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node.local;
1272
+ int idx = RT_BM_IDX(chunk);
1273
+ int bitnum = RT_BM_BIT(chunk);
1274
+
1275
+ /* Mark the slot used for "chunk" */
1276
+ n256->isset[idx] |= ((bitmapword) 1 << bitnum);
1277
+
1278
+ n256->base.count++;
1279
+ RT_VERIFY_NODE((RT_NODE *) n256);
1280
+
1281
+ return RT_NODE_256_GET_CHILD(n256, chunk);
1282
+ }
1283
+
1284
+ static pg_noinline RT_PTR_ALLOC *
1285
+ RT_GROW_NODE_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node,
1286
+ uint8 chunk)
1287
+ {
1288
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node.local;
1289
+ RT_CHILD_PTR newnode;
1290
+ RT_NODE_256 *new256;
1291
+ int i = 0;
1292
+
1293
+ /* initialize new node */
1294
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_256, RT_CLASS_256);
1295
+ new256 = (RT_NODE_256 *) newnode.local;
1296
+
1297
+ /* copy over the entries */
1298
+ RT_COPY_COMMON(newnode, node);
1299
+ for (int word_num = 0; word_num < RT_BM_IDX(RT_NODE_MAX_SLOTS); word_num++)
1300
+ {
1301
+ bitmapword bitmap = 0;
1302
+
1303
+ /*
1304
+ * Bit manipulation is a surprisingly large portion of the overhead in
1305
+ * the naive implementation. Doing stores word-at-a-time removes a lot
1306
+ * of that overhead.
1307
+ */
1308
+ for (int bit = 0; bit < BITS_PER_BITMAPWORD; bit++)
1309
+ {
1310
+ uint8 offset = n48->slot_idxs[i];
1311
+
1312
+ if (offset != RT_INVALID_SLOT_IDX)
1313
+ {
1314
+ bitmap |= ((bitmapword) 1 << bit);
1315
+ new256->children[i] = n48->children[offset];
1316
+ }
1317
+
1318
+ i++;
1319
+ }
1320
+
1321
+ new256->isset[word_num] = bitmap;
1322
+ }
1323
+
1324
+ /* free old node and update reference in parent */
1325
+ *parent_slot = newnode.alloc;
1326
+ RT_FREE_NODE(tree, node);
1327
+
1328
+ return RT_ADD_CHILD_256(tree, newnode, chunk);
1329
+ }
1330
+
1331
+ static inline RT_PTR_ALLOC *
1332
+ RT_ADD_CHILD_48(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk)
1333
+ {
1334
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node.local;
1335
+ int insertpos;
1336
+ int idx = 0;
1337
+ bitmapword w,
1338
+ inverse;
1339
+
1340
+ /* get the first word with at least one bit not set */
1341
+ for (int i = 0; i < RT_BM_IDX(RT_FANOUT_48_MAX); i++)
1342
+ {
1343
+ w = n48->isset[i];
1344
+ if (w < ~((bitmapword) 0))
1345
+ {
1346
+ idx = i;
1347
+ break;
1348
+ }
1349
+ }
1350
+
1351
+ /* To get the first unset bit in w, get the first set bit in ~w */
1352
+ inverse = ~w;
1353
+ insertpos = idx * BITS_PER_BITMAPWORD;
1354
+ insertpos += bmw_rightmost_one_pos(inverse);
1355
+ Assert(insertpos < n48->base.fanout);
1356
+
1357
+ /* mark the slot used by setting the rightmost zero bit */
1358
+ n48->isset[idx] |= w + 1;
1359
+
1360
+ /* insert new chunk into place */
1361
+ n48->slot_idxs[chunk] = insertpos;
1362
+
1363
+ n48->base.count++;
1364
+ RT_VERIFY_NODE((RT_NODE *) n48);
1365
+
1366
+ return &n48->children[insertpos];
1367
+ }
1368
+
1369
+ static pg_noinline RT_PTR_ALLOC *
1370
+ RT_GROW_NODE_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node,
1371
+ uint8 chunk)
1372
+ {
1373
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node.local;
1374
+ int insertpos;
1375
+
1376
+ if (n16->base.fanout < RT_FANOUT_16_HI)
1377
+ {
1378
+ RT_CHILD_PTR newnode;
1379
+ RT_NODE_16 *new16;
1380
+
1381
+ Assert(n16->base.fanout == RT_FANOUT_16_LO);
1382
+
1383
+ /* initialize new node */
1384
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_HI);
1385
+ new16 = (RT_NODE_16 *) newnode.local;
1386
+
1387
+ /* copy over existing entries */
1388
+ RT_COPY_COMMON(newnode, node);
1389
+ Assert(n16->base.count == RT_FANOUT_16_LO);
1390
+ insertpos = RT_NODE_16_GET_INSERTPOS(n16, chunk);
1391
+ RT_COPY_ARRAYS_FOR_INSERT(new16->chunks, new16->children,
1392
+ n16->chunks, n16->children,
1393
+ RT_FANOUT_16_LO, insertpos);
1394
+
1395
+ /* insert new chunk into place */
1396
+ new16->chunks[insertpos] = chunk;
1397
+
1398
+ new16->base.count++;
1399
+ RT_VERIFY_NODE((RT_NODE *) new16);
1400
+
1401
+ /* free old node and update references */
1402
+ RT_FREE_NODE(tree, node);
1403
+ *parent_slot = newnode.alloc;
1404
+
1405
+ return &new16->children[insertpos];
1406
+ }
1407
+ else
1408
+ {
1409
+ RT_CHILD_PTR newnode;
1410
+ RT_NODE_48 *new48;
1411
+ int idx,
1412
+ bit;
1413
+
1414
+ Assert(n16->base.fanout == RT_FANOUT_16_HI);
1415
+
1416
+ /* initialize new node */
1417
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_48, RT_CLASS_48);
1418
+ new48 = (RT_NODE_48 *) newnode.local;
1419
+
1420
+ /* copy over the entries */
1421
+ RT_COPY_COMMON(newnode, node);
1422
+ for (int i = 0; i < RT_FANOUT_16_HI; i++)
1423
+ new48->slot_idxs[n16->chunks[i]] = i;
1424
+ memcpy(&new48->children[0], &n16->children[0], RT_FANOUT_16_HI * sizeof(new48->children[0]));
1425
+
1426
+ /*
1427
+ * Since we just copied a dense array, we can fill "isset" using a
1428
+ * single store, provided the length of that array is at most the
1429
+ * number of bits in a bitmapword.
1430
+ */
1431
+ Assert(RT_FANOUT_16_HI <= BITS_PER_BITMAPWORD);
1432
+ new48->isset[0] = (bitmapword) (((uint64) 1 << RT_FANOUT_16_HI) - 1);
1433
+
1434
+ /* put the new child at the end of the copied entries */
1435
+ insertpos = RT_FANOUT_16_HI;
1436
+ idx = RT_BM_IDX(insertpos);
1437
+ bit = RT_BM_BIT(insertpos);
1438
+
1439
+ /* mark the slot used */
1440
+ new48->isset[idx] |= ((bitmapword) 1 << bit);
1441
+
1442
+ /* insert new chunk into place */
1443
+ new48->slot_idxs[chunk] = insertpos;
1444
+
1445
+ new48->base.count++;
1446
+ RT_VERIFY_NODE((RT_NODE *) new48);
1447
+
1448
+ /* free old node and update reference in parent */
1449
+ *parent_slot = newnode.alloc;
1450
+ RT_FREE_NODE(tree, node);
1451
+
1452
+ return &new48->children[insertpos];
1453
+ }
1454
+ }
1455
+
1456
+ static inline RT_PTR_ALLOC *
1457
+ RT_ADD_CHILD_16(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk)
1458
+ {
1459
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node.local;
1460
+ int insertpos = RT_NODE_16_GET_INSERTPOS(n16, chunk);
1461
+
1462
+ /* shift chunks and children */
1463
+ RT_SHIFT_ARRAYS_FOR_INSERT(n16->chunks, n16->children,
1464
+ n16->base.count, insertpos);
1465
+
1466
+ /* insert new chunk into place */
1467
+ n16->chunks[insertpos] = chunk;
1468
+
1469
+ n16->base.count++;
1470
+ RT_VERIFY_NODE((RT_NODE *) n16);
1471
+
1472
+ return &n16->children[insertpos];
1473
+ }
1474
+
1475
+ static pg_noinline RT_PTR_ALLOC *
1476
+ RT_GROW_NODE_4(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node,
1477
+ uint8 chunk)
1478
+ {
1479
+ RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local);
1480
+ RT_CHILD_PTR newnode;
1481
+ RT_NODE_16 *new16;
1482
+ int insertpos;
1483
+
1484
+ /* initialize new node */
1485
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_LO);
1486
+ new16 = (RT_NODE_16 *) newnode.local;
1487
+
1488
+ /* copy over existing entries */
1489
+ RT_COPY_COMMON(newnode, node);
1490
+ Assert(n4->base.count == RT_FANOUT_4);
1491
+ insertpos = RT_NODE_4_GET_INSERTPOS(n4, chunk, RT_FANOUT_4);
1492
+ RT_COPY_ARRAYS_FOR_INSERT(new16->chunks, new16->children,
1493
+ n4->chunks, n4->children,
1494
+ RT_FANOUT_4, insertpos);
1495
+
1496
+ /* insert new chunk into place */
1497
+ new16->chunks[insertpos] = chunk;
1498
+
1499
+ new16->base.count++;
1500
+ RT_VERIFY_NODE((RT_NODE *) new16);
1501
+
1502
+ /* free old node and update reference in parent */
1503
+ *parent_slot = newnode.alloc;
1504
+ RT_FREE_NODE(tree, node);
1505
+
1506
+ return &new16->children[insertpos];
1507
+ }
1508
+
1509
+ static inline RT_PTR_ALLOC *
1510
+ RT_ADD_CHILD_4(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk)
1511
+ {
1512
+ RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local);
1513
+ int count = n4->base.count;
1514
+ int insertpos = RT_NODE_4_GET_INSERTPOS(n4, chunk, count);
1515
+
1516
+ /* shift chunks and children */
1517
+ RT_SHIFT_ARRAYS_FOR_INSERT(n4->chunks, n4->children,
1518
+ count, insertpos);
1519
+
1520
+ /* insert new chunk into place */
1521
+ n4->chunks[insertpos] = chunk;
1522
+
1523
+ n4->base.count++;
1524
+ RT_VERIFY_NODE((RT_NODE *) n4);
1525
+
1526
+ return &n4->children[insertpos];
1527
+ }
1528
+
1529
+ /*
1530
+ * Reserve slot in "node"'s child array. The caller will populate it
1531
+ * with the actual child pointer.
1532
+ *
1533
+ * "parent_slot" is the address of the parent's child pointer to "node".
1534
+ * If the node we're inserting into needs to grow, we update the parent's
1535
+ * child pointer with the pointer to the new larger node.
1536
+ */
1537
+ static inline RT_PTR_ALLOC *
1538
+ RT_NODE_INSERT(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node,
1539
+ uint8 chunk)
1540
+ {
1541
+ RT_NODE *n = node.local;
1542
+
1543
+ switch (n->kind)
1544
+ {
1545
+ case RT_NODE_KIND_4:
1546
+ {
1547
+ if (unlikely(RT_NODE_MUST_GROW(n)))
1548
+ return RT_GROW_NODE_4(tree, parent_slot, node, chunk);
1549
+
1550
+ return RT_ADD_CHILD_4(tree, node, chunk);
1551
+ }
1552
+ case RT_NODE_KIND_16:
1553
+ {
1554
+ if (unlikely(RT_NODE_MUST_GROW(n)))
1555
+ return RT_GROW_NODE_16(tree, parent_slot, node, chunk);
1556
+
1557
+ return RT_ADD_CHILD_16(tree, node, chunk);
1558
+ }
1559
+ case RT_NODE_KIND_48:
1560
+ {
1561
+ if (unlikely(RT_NODE_MUST_GROW(n)))
1562
+ return RT_GROW_NODE_48(tree, parent_slot, node, chunk);
1563
+
1564
+ return RT_ADD_CHILD_48(tree, node, chunk);
1565
+ }
1566
+ case RT_NODE_KIND_256:
1567
+ return RT_ADD_CHILD_256(tree, node, chunk);
1568
+ default:
1569
+ pg_unreachable();
1570
+ }
1571
+ }
1572
+
1573
+ /*
1574
+ * The radix tree doesn't have sufficient height. Put new node(s) on top,
1575
+ * and move the old node below it.
1576
+ */
1577
+ static pg_noinline void
1578
+ RT_EXTEND_UP(RT_RADIX_TREE * tree, uint64 key)
1579
+ {
1580
+ int target_shift = RT_KEY_GET_SHIFT(key);
1581
+ int shift = tree->ctl->start_shift;
1582
+
1583
+ Assert(shift < target_shift);
1584
+
1585
+ /* Grow tree upwards until start shift can accommodate the key */
1586
+ while (shift < target_shift)
1587
+ {
1588
+ RT_CHILD_PTR node;
1589
+ RT_NODE_4 *n4;
1590
+
1591
+ node = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4);
1592
+ n4 = (RT_NODE_4 *) node.local;
1593
+ n4->base.count = 1;
1594
+ n4->chunks[0] = 0;
1595
+ n4->children[0] = tree->ctl->root;
1596
+
1597
+ /* Update the root */
1598
+ tree->ctl->root = node.alloc;
1599
+
1600
+ shift += RT_SPAN;
1601
+ }
1602
+
1603
+ tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(target_shift);
1604
+ tree->ctl->start_shift = target_shift;
1605
+ }
1606
+
1607
+ /*
1608
+ * Insert a chain of nodes until we reach the lowest level,
1609
+ * and return the address of a slot to be filled further up
1610
+ * the call stack.
1611
+ */
1612
+ static pg_noinline RT_PTR_ALLOC *
1613
+ RT_EXTEND_DOWN(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift)
1614
+ {
1615
+ RT_CHILD_PTR node,
1616
+ child;
1617
+ RT_NODE_4 *n4;
1618
+
1619
+ /*
1620
+ * The child pointer of the first node in the chain goes in the
1621
+ * caller-provided slot.
1622
+ */
1623
+ child = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4);
1624
+ *parent_slot = child.alloc;
1625
+
1626
+ node = child;
1627
+ shift -= RT_SPAN;
1628
+
1629
+ while (shift > 0)
1630
+ {
1631
+ child = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4);
1632
+
1633
+ /* We open-code the insertion ourselves, for speed. */
1634
+ n4 = (RT_NODE_4 *) node.local;
1635
+ n4->base.count = 1;
1636
+ n4->chunks[0] = RT_GET_KEY_CHUNK(key, shift);
1637
+ n4->children[0] = child.alloc;
1638
+
1639
+ node = child;
1640
+ shift -= RT_SPAN;
1641
+ }
1642
+ Assert(shift == 0);
1643
+
1644
+ /* Reserve slot for the value. */
1645
+ n4 = (RT_NODE_4 *) node.local;
1646
+ n4->chunks[0] = RT_GET_KEY_CHUNK(key, 0);
1647
+ n4->base.count = 1;
1648
+
1649
+ return &n4->children[0];
1650
+ }
1651
+
1652
+ /*
1653
+ * Workhorse for RT_SET
1654
+ *
1655
+ * "parent_slot" is the address of the child pointer we just followed,
1656
+ * in the parent's array of children, needed if inserting into the
1657
+ * current node causes it to grow.
1658
+ */
1659
+ static RT_PTR_ALLOC *
1660
+ RT_GET_SLOT_RECURSIVE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift, bool *found)
1661
+ {
1662
+ RT_PTR_ALLOC *slot;
1663
+ RT_CHILD_PTR node;
1664
+ uint8 chunk = RT_GET_KEY_CHUNK(key, shift);
1665
+
1666
+ node.alloc = *parent_slot;
1667
+ RT_PTR_SET_LOCAL(tree, &node);
1668
+ slot = RT_NODE_SEARCH(node.local, chunk);
1669
+
1670
+ if (slot == NULL)
1671
+ {
1672
+ *found = false;
1673
+
1674
+ /* reserve slot for the caller to populate */
1675
+
1676
+ slot = RT_NODE_INSERT(tree, parent_slot, node, chunk);
1677
+
1678
+ if (shift == 0)
1679
+ return slot;
1680
+ else
1681
+ return RT_EXTEND_DOWN(tree, slot, key, shift);
1682
+ }
1683
+ else
1684
+ {
1685
+ if (shift == 0)
1686
+ {
1687
+ *found = true;
1688
+ return slot;
1689
+ }
1690
+ else
1691
+ return RT_GET_SLOT_RECURSIVE(tree, slot, key, shift - RT_SPAN, found);
1692
+ }
1693
+ }
1694
+
1695
+ /*
1696
+ * Set key to value that value_p points to. If the entry already exists, we
1697
+ * update its value and return true. Returns false if entry doesn't yet exist.
1698
+ *
1699
+ * Taking a lock in exclusive mode is the caller's responsibility.
1700
+ */
1701
+ RT_SCOPE bool
1702
+ RT_SET(RT_RADIX_TREE * tree, uint64 key, RT_VALUE_TYPE * value_p)
1703
+ {
1704
+ bool found;
1705
+ RT_PTR_ALLOC *slot;
1706
+ size_t value_sz = RT_GET_VALUE_SIZE(value_p);
1707
+
1708
+ #ifdef RT_SHMEM
1709
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1710
+ #endif
1711
+
1712
+ Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root));
1713
+
1714
+ /* Extend the tree if necessary */
1715
+ if (unlikely(key > tree->ctl->max_val))
1716
+ {
1717
+ if (tree->ctl->num_keys == 0)
1718
+ {
1719
+ RT_CHILD_PTR node;
1720
+ RT_NODE_4 *n4;
1721
+ int start_shift = RT_KEY_GET_SHIFT(key);
1722
+
1723
+ /*
1724
+ * With an empty root node, we don't extend the tree upwards,
1725
+ * since that would result in orphan empty nodes. Instead we open
1726
+ * code inserting into the root node and extend downward from
1727
+ * there.
1728
+ */
1729
+ node.alloc = tree->ctl->root;
1730
+ RT_PTR_SET_LOCAL(tree, &node);
1731
+ n4 = (RT_NODE_4 *) node.local;
1732
+ n4->base.count = 1;
1733
+ n4->chunks[0] = RT_GET_KEY_CHUNK(key, start_shift);
1734
+
1735
+ slot = RT_EXTEND_DOWN(tree, &n4->children[0], key, start_shift);
1736
+ found = false;
1737
+ tree->ctl->start_shift = start_shift;
1738
+ tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(start_shift);
1739
+ goto have_slot;
1740
+ }
1741
+ else
1742
+ RT_EXTEND_UP(tree, key);
1743
+ }
1744
+
1745
+ slot = RT_GET_SLOT_RECURSIVE(tree, &tree->ctl->root,
1746
+ key, tree->ctl->start_shift, &found);
1747
+
1748
+ have_slot:
1749
+ Assert(slot != NULL);
1750
+
1751
+ if (RT_VALUE_IS_EMBEDDABLE(value_p))
1752
+ {
1753
+ /* free the existing leaf */
1754
+ if (found && !RT_CHILDPTR_IS_VALUE(*slot))
1755
+ RT_FREE_LEAF(tree, *slot);
1756
+
1757
+ /* store value directly in child pointer slot */
1758
+ memcpy(slot, value_p, value_sz);
1759
+
1760
+ #ifdef RT_RUNTIME_EMBEDDABLE_VALUE
1761
+ /* tag child pointer */
1762
+ #ifdef RT_SHMEM
1763
+ *slot |= 1;
1764
+ #else
1765
+ *((uintptr_t *) slot) |= 1;
1766
+ #endif
1767
+ #endif
1768
+ }
1769
+ else
1770
+ {
1771
+ RT_CHILD_PTR leaf;
1772
+
1773
+ if (found && !RT_CHILDPTR_IS_VALUE(*slot))
1774
+ {
1775
+ Assert(RT_PTR_ALLOC_IS_VALID(*slot));
1776
+ leaf.alloc = *slot;
1777
+ RT_PTR_SET_LOCAL(tree, &leaf);
1778
+
1779
+ if (RT_GET_VALUE_SIZE((RT_VALUE_TYPE *) leaf.local) != value_sz)
1780
+ {
1781
+ /*
1782
+ * different sizes, so first free the existing leaf before
1783
+ * allocating a new one
1784
+ */
1785
+ RT_FREE_LEAF(tree, *slot);
1786
+ leaf = RT_ALLOC_LEAF(tree, value_sz);
1787
+ *slot = leaf.alloc;
1788
+ }
1789
+ }
1790
+ else
1791
+ {
1792
+ /* allocate new leaf and store it in the child array */
1793
+ leaf = RT_ALLOC_LEAF(tree, value_sz);
1794
+ *slot = leaf.alloc;
1795
+ }
1796
+
1797
+ memcpy(leaf.local, value_p, value_sz);
1798
+ }
1799
+
1800
+ /* Update the statistics */
1801
+ if (!found)
1802
+ tree->ctl->num_keys++;
1803
+
1804
+ return found;
1805
+ }
1806
+
1807
+ /***************** SETUP / TEARDOWN *****************/
1808
+
1809
+ /*
1810
+ * Create the radix tree root in the caller's memory context and return it.
1811
+ *
1812
+ * The tree's nodes and leaves are allocated in "ctx" and its children for
1813
+ * local memory, or in "dsa" for shared memory.
1814
+ */
1815
+ RT_SCOPE RT_RADIX_TREE *
1816
+ #ifdef RT_SHMEM
1817
+ RT_CREATE(dsa_area *dsa, int tranche_id)
1818
+ #else
1819
+ RT_CREATE(MemoryContext ctx)
1820
+ #endif
1821
+ {
1822
+ RT_RADIX_TREE *tree;
1823
+ RT_CHILD_PTR rootnode;
1824
+ #ifdef RT_SHMEM
1825
+ dsa_pointer dp;
1826
+ #endif
1827
+
1828
+ tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE));
1829
+
1830
+ #ifdef RT_SHMEM
1831
+ tree->dsa = dsa;
1832
+ dp = dsa_allocate0(dsa, sizeof(RT_RADIX_TREE_CONTROL));
1833
+ tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, dp);
1834
+ tree->ctl->handle = dp;
1835
+ tree->ctl->magic = RT_RADIX_TREE_MAGIC;
1836
+ LWLockInitialize(&tree->ctl->lock, tranche_id);
1837
+ #else
1838
+ tree->ctl = (RT_RADIX_TREE_CONTROL *) palloc0(sizeof(RT_RADIX_TREE_CONTROL));
1839
+
1840
+ /* Create a slab context for each size class */
1841
+ for (int i = 0; i < RT_NUM_SIZE_CLASSES; i++)
1842
+ {
1843
+ RT_SIZE_CLASS_ELEM size_class = RT_SIZE_CLASS_INFO[i];
1844
+ size_t inner_blocksize = RT_SLAB_BLOCK_SIZE(size_class.allocsize);
1845
+
1846
+ tree->node_slabs[i] = SlabContextCreate(ctx,
1847
+ size_class.name,
1848
+ inner_blocksize,
1849
+ size_class.allocsize);
1850
+ }
1851
+
1852
+ tree->leaf_context = ctx;
1853
+ #endif /* RT_SHMEM */
1854
+
1855
+ /* add root node now so that RT_SET can assume it exists */
1856
+ rootnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4);
1857
+ tree->ctl->root = rootnode.alloc;
1858
+ tree->ctl->start_shift = 0;
1859
+ tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(0);
1860
+
1861
+ return tree;
1862
+ }
1863
+
1864
+ #ifdef RT_SHMEM
1865
+ RT_SCOPE RT_RADIX_TREE *
1866
+ RT_ATTACH(dsa_area *dsa, RT_HANDLE handle)
1867
+ {
1868
+ RT_RADIX_TREE *tree;
1869
+ dsa_pointer control;
1870
+
1871
+ tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE));
1872
+
1873
+ /* Find the control object in shared memory */
1874
+ control = handle;
1875
+
1876
+ tree->dsa = dsa;
1877
+ tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, control);
1878
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1879
+
1880
+ return tree;
1881
+ }
1882
+
1883
+ RT_SCOPE void
1884
+ RT_DETACH(RT_RADIX_TREE * tree)
1885
+ {
1886
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1887
+ pfree(tree);
1888
+ }
1889
+
1890
+ RT_SCOPE RT_HANDLE
1891
+ RT_GET_HANDLE(RT_RADIX_TREE * tree)
1892
+ {
1893
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1894
+ return tree->ctl->handle;
1895
+ }
1896
+
1897
+ RT_SCOPE void
1898
+ RT_LOCK_EXCLUSIVE(RT_RADIX_TREE * tree)
1899
+ {
1900
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1901
+ LWLockAcquire(&tree->ctl->lock, LW_EXCLUSIVE);
1902
+ }
1903
+
1904
+ RT_SCOPE void
1905
+ RT_LOCK_SHARE(RT_RADIX_TREE * tree)
1906
+ {
1907
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1908
+ LWLockAcquire(&tree->ctl->lock, LW_SHARED);
1909
+ }
1910
+
1911
+ RT_SCOPE void
1912
+ RT_UNLOCK(RT_RADIX_TREE * tree)
1913
+ {
1914
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
1915
+ LWLockRelease(&tree->ctl->lock);
1916
+ }
1917
+
1918
+ /*
1919
+ * Recursively free all nodes allocated in the DSA area.
1920
+ */
1921
+ static void
1922
+ RT_FREE_RECURSE(RT_RADIX_TREE * tree, RT_PTR_ALLOC ptr, int shift)
1923
+ {
1924
+ RT_CHILD_PTR node;
1925
+
1926
+ check_stack_depth();
1927
+
1928
+ node.alloc = ptr;
1929
+ RT_PTR_SET_LOCAL(tree, &node);
1930
+
1931
+ switch (node.local->kind)
1932
+ {
1933
+ case RT_NODE_KIND_4:
1934
+ {
1935
+ RT_NODE_4 *n4 = (RT_NODE_4 *) node.local;
1936
+
1937
+ for (int i = 0; i < n4->base.count; i++)
1938
+ {
1939
+ RT_PTR_ALLOC child = n4->children[i];
1940
+
1941
+ if (shift > 0)
1942
+ RT_FREE_RECURSE(tree, child, shift - RT_SPAN);
1943
+ else if (!RT_CHILDPTR_IS_VALUE(child))
1944
+ dsa_free(tree->dsa, child);
1945
+ }
1946
+
1947
+ break;
1948
+ }
1949
+ case RT_NODE_KIND_16:
1950
+ {
1951
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node.local;
1952
+
1953
+ for (int i = 0; i < n16->base.count; i++)
1954
+ {
1955
+ RT_PTR_ALLOC child = n16->children[i];
1956
+
1957
+ if (shift > 0)
1958
+ RT_FREE_RECURSE(tree, child, shift - RT_SPAN);
1959
+ else if (!RT_CHILDPTR_IS_VALUE(child))
1960
+ dsa_free(tree->dsa, child);
1961
+ }
1962
+
1963
+ break;
1964
+ }
1965
+ case RT_NODE_KIND_48:
1966
+ {
1967
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node.local;
1968
+
1969
+ for (int i = 0; i < RT_NODE_MAX_SLOTS; i++)
1970
+ {
1971
+ RT_PTR_ALLOC child;
1972
+
1973
+ if (!RT_NODE_48_IS_CHUNK_USED(n48, i))
1974
+ continue;
1975
+
1976
+ child = *RT_NODE_48_GET_CHILD(n48, i);
1977
+
1978
+ if (shift > 0)
1979
+ RT_FREE_RECURSE(tree, child, shift - RT_SPAN);
1980
+ else if (!RT_CHILDPTR_IS_VALUE(child))
1981
+ dsa_free(tree->dsa, child);
1982
+ }
1983
+
1984
+ break;
1985
+ }
1986
+ case RT_NODE_KIND_256:
1987
+ {
1988
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node.local;
1989
+
1990
+ for (int i = 0; i < RT_NODE_MAX_SLOTS; i++)
1991
+ {
1992
+ RT_PTR_ALLOC child;
1993
+
1994
+ if (!RT_NODE_256_IS_CHUNK_USED(n256, i))
1995
+ continue;
1996
+
1997
+ child = *RT_NODE_256_GET_CHILD(n256, i);
1998
+
1999
+ if (shift > 0)
2000
+ RT_FREE_RECURSE(tree, child, shift - RT_SPAN);
2001
+ else if (!RT_CHILDPTR_IS_VALUE(child))
2002
+ dsa_free(tree->dsa, child);
2003
+ }
2004
+
2005
+ break;
2006
+ }
2007
+ }
2008
+
2009
+ /* Free the inner node */
2010
+ dsa_free(tree->dsa, ptr);
2011
+ }
2012
+ #endif
2013
+
2014
+ /*
2015
+ * Free the radix tree, including all nodes and leaves.
2016
+ */
2017
+ RT_SCOPE void
2018
+ RT_FREE(RT_RADIX_TREE * tree)
2019
+ {
2020
+ #ifdef RT_SHMEM
2021
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
2022
+
2023
+ /* Free all memory used for radix tree nodes */
2024
+ Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root));
2025
+ RT_FREE_RECURSE(tree, tree->ctl->root, tree->ctl->start_shift);
2026
+
2027
+ /*
2028
+ * Vandalize the control block to help catch programming error where other
2029
+ * backends access the memory formerly occupied by this radix tree.
2030
+ */
2031
+ tree->ctl->magic = 0;
2032
+ dsa_free(tree->dsa, tree->ctl->handle);
2033
+ #else
2034
+ /*
2035
+ * Free all space allocated within the leaf context and delete all child
2036
+ * contexts such as those used for nodes.
2037
+ */
2038
+ MemoryContextReset(tree->leaf_context);
2039
+
2040
+ pfree(tree->ctl);
2041
+ #endif
2042
+ pfree(tree);
2043
+ }
2044
+
2045
+ /***************** ITERATION *****************/
2046
+
2047
+ /*
2048
+ * Create and return an iterator for the given radix tree
2049
+ * in the caller's memory context.
2050
+ *
2051
+ * Taking a lock in shared mode during the iteration is the caller's
2052
+ * responsibility.
2053
+ */
2054
+ RT_SCOPE RT_ITER *
2055
+ RT_BEGIN_ITERATE(RT_RADIX_TREE * tree)
2056
+ {
2057
+ RT_ITER *iter;
2058
+ RT_CHILD_PTR root;
2059
+
2060
+ iter = (RT_ITER *) palloc0(sizeof(RT_ITER));
2061
+ iter->tree = tree;
2062
+
2063
+ Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root));
2064
+ root.alloc = iter->tree->ctl->root;
2065
+ RT_PTR_SET_LOCAL(tree, &root);
2066
+
2067
+ iter->top_level = iter->tree->ctl->start_shift / RT_SPAN;
2068
+
2069
+ /* Set the root to start */
2070
+ iter->cur_level = iter->top_level;
2071
+ iter->node_iters[iter->cur_level].node = root;
2072
+ iter->node_iters[iter->cur_level].idx = 0;
2073
+
2074
+ return iter;
2075
+ }
2076
+
2077
+ /*
2078
+ * Scan the inner node and return the next child pointer if one exists, otherwise
2079
+ * return NULL.
2080
+ */
2081
+ static inline RT_PTR_ALLOC *
2082
+ RT_NODE_ITERATE_NEXT(RT_ITER * iter, int level)
2083
+ {
2084
+ uint8 key_chunk = 0;
2085
+ RT_NODE_ITER *node_iter;
2086
+ RT_CHILD_PTR node;
2087
+ RT_PTR_ALLOC *slot = NULL;
2088
+
2089
+ #ifdef RT_SHMEM
2090
+ Assert(iter->tree->ctl->magic == RT_RADIX_TREE_MAGIC);
2091
+ #endif
2092
+
2093
+ node_iter = &(iter->node_iters[level]);
2094
+ node = node_iter->node;
2095
+
2096
+ Assert(node.local != NULL);
2097
+
2098
+ switch ((node.local)->kind)
2099
+ {
2100
+ case RT_NODE_KIND_4:
2101
+ {
2102
+ RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local);
2103
+
2104
+ if (node_iter->idx >= n4->base.count)
2105
+ return NULL;
2106
+
2107
+ slot = &n4->children[node_iter->idx];
2108
+ key_chunk = n4->chunks[node_iter->idx];
2109
+ node_iter->idx++;
2110
+ break;
2111
+ }
2112
+ case RT_NODE_KIND_16:
2113
+ {
2114
+ RT_NODE_16 *n16 = (RT_NODE_16 *) (node.local);
2115
+
2116
+ if (node_iter->idx >= n16->base.count)
2117
+ return NULL;
2118
+
2119
+ slot = &n16->children[node_iter->idx];
2120
+ key_chunk = n16->chunks[node_iter->idx];
2121
+ node_iter->idx++;
2122
+ break;
2123
+ }
2124
+ case RT_NODE_KIND_48:
2125
+ {
2126
+ RT_NODE_48 *n48 = (RT_NODE_48 *) (node.local);
2127
+ int chunk;
2128
+
2129
+ for (chunk = node_iter->idx; chunk < RT_NODE_MAX_SLOTS; chunk++)
2130
+ {
2131
+ if (RT_NODE_48_IS_CHUNK_USED(n48, chunk))
2132
+ break;
2133
+ }
2134
+
2135
+ if (chunk >= RT_NODE_MAX_SLOTS)
2136
+ return NULL;
2137
+
2138
+ slot = RT_NODE_48_GET_CHILD(n48, chunk);
2139
+
2140
+ key_chunk = chunk;
2141
+ node_iter->idx = chunk + 1;
2142
+ break;
2143
+ }
2144
+ case RT_NODE_KIND_256:
2145
+ {
2146
+ RT_NODE_256 *n256 = (RT_NODE_256 *) (node.local);
2147
+ int chunk;
2148
+
2149
+ for (chunk = node_iter->idx; chunk < RT_NODE_MAX_SLOTS; chunk++)
2150
+ {
2151
+ if (RT_NODE_256_IS_CHUNK_USED(n256, chunk))
2152
+ break;
2153
+ }
2154
+
2155
+ if (chunk >= RT_NODE_MAX_SLOTS)
2156
+ return NULL;
2157
+
2158
+ slot = RT_NODE_256_GET_CHILD(n256, chunk);
2159
+
2160
+ key_chunk = chunk;
2161
+ node_iter->idx = chunk + 1;
2162
+ break;
2163
+ }
2164
+ }
2165
+
2166
+ /* Update the key */
2167
+ iter->key &= ~(((uint64) RT_CHUNK_MASK) << (level * RT_SPAN));
2168
+ iter->key |= (((uint64) key_chunk) << (level * RT_SPAN));
2169
+
2170
+ return slot;
2171
+ }
2172
+
2173
+ /*
2174
+ * Return pointer to value and set key_p as long as there is a key. Otherwise
2175
+ * return NULL.
2176
+ */
2177
+ RT_SCOPE RT_VALUE_TYPE *
2178
+ RT_ITERATE_NEXT(RT_ITER * iter, uint64 *key_p)
2179
+ {
2180
+ RT_PTR_ALLOC *slot = NULL;
2181
+
2182
+ while (iter->cur_level <= iter->top_level)
2183
+ {
2184
+ RT_CHILD_PTR node;
2185
+
2186
+ slot = RT_NODE_ITERATE_NEXT(iter, iter->cur_level);
2187
+
2188
+ if (iter->cur_level == 0 && slot != NULL)
2189
+ {
2190
+ /* Found a value at the leaf node */
2191
+ *key_p = iter->key;
2192
+ node.alloc = *slot;
2193
+
2194
+ if (RT_CHILDPTR_IS_VALUE(*slot))
2195
+ return (RT_VALUE_TYPE *) slot;
2196
+ else
2197
+ {
2198
+ RT_PTR_SET_LOCAL(iter->tree, &node);
2199
+ return (RT_VALUE_TYPE *) node.local;
2200
+ }
2201
+ }
2202
+
2203
+ if (slot != NULL)
2204
+ {
2205
+ /* Found the child slot, move down the tree */
2206
+ node.alloc = *slot;
2207
+ RT_PTR_SET_LOCAL(iter->tree, &node);
2208
+
2209
+ iter->cur_level--;
2210
+ iter->node_iters[iter->cur_level].node = node;
2211
+ iter->node_iters[iter->cur_level].idx = 0;
2212
+ }
2213
+ else
2214
+ {
2215
+ /* Not found the child slot, move up the tree */
2216
+ iter->cur_level++;
2217
+ }
2218
+ }
2219
+
2220
+ /* We've visited all nodes, so the iteration finished */
2221
+ return NULL;
2222
+ }
2223
+
2224
+ /*
2225
+ * Terminate the iteration. The caller is responsible for releasing any locks.
2226
+ */
2227
+ RT_SCOPE void
2228
+ RT_END_ITERATE(RT_ITER * iter)
2229
+ {
2230
+ pfree(iter);
2231
+ }
2232
+
2233
+ /***************** DELETION *****************/
2234
+
2235
+ #ifdef RT_USE_DELETE
2236
+
2237
+ /* Delete the element at "deletepos" */
2238
+ static inline void
2239
+ RT_SHIFT_ARRAYS_AND_DELETE(uint8 *chunks, RT_PTR_ALLOC * children, int count, int deletepos)
2240
+ {
2241
+ /*
2242
+ * This is basically a memmove, but written in a simple loop for speed on
2243
+ * small inputs.
2244
+ */
2245
+ for (int i = deletepos; i < count - 1; i++)
2246
+ {
2247
+ /* workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101481 */
2248
+ #ifdef __GNUC__
2249
+ __asm__("");
2250
+ #endif
2251
+ chunks[i] = chunks[i + 1];
2252
+ children[i] = children[i + 1];
2253
+ }
2254
+ }
2255
+
2256
+ /*
2257
+ * Copy both chunk and slot arrays into the right
2258
+ * place. The element at "deletepos" is deleted by skipping it.
2259
+ */
2260
+ static inline void
2261
+ RT_COPY_ARRAYS_AND_DELETE(uint8 *dst_chunks, RT_PTR_ALLOC * dst_children,
2262
+ uint8 *src_chunks, RT_PTR_ALLOC * src_children,
2263
+ int count, int deletepos)
2264
+ {
2265
+ for (int i = 0; i < count - 1; i++)
2266
+ {
2267
+ /*
2268
+ * use a branch-free computation to skip the index of the deleted
2269
+ * element
2270
+ */
2271
+ int sourceidx = i + (i >= deletepos);
2272
+ int destidx = i;
2273
+
2274
+ dst_chunks[destidx] = src_chunks[sourceidx];
2275
+ dst_children[destidx] = src_children[sourceidx];
2276
+ }
2277
+ }
2278
+
2279
+ /*
2280
+ * Note: While all node-growing functions are called to perform an insertion
2281
+ * when no more space is available, shrinking is not a hard-and-fast requirement.
2282
+ * When shrinking nodes, we generally wait until the count is about 3/4 of
2283
+ * the next lower node's fanout. This prevents ping-ponging between different
2284
+ * node sizes.
2285
+ *
2286
+ * Some shrinking functions delete first and then shrink, either because we
2287
+ * must or because it's fast and simple that way. Sometimes it's faster to
2288
+ * delete while shrinking.
2289
+ */
2290
+
2291
+ /*
2292
+ * Move contents of a node256 to a node48. Any deletion should have happened
2293
+ * in the caller.
2294
+ */
2295
+ static void pg_noinline
2296
+ RT_SHRINK_NODE_256(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk)
2297
+ {
2298
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node.local;
2299
+ RT_CHILD_PTR newnode;
2300
+ RT_NODE_48 *new48;
2301
+ int slot_idx = 0;
2302
+
2303
+ /* initialize new node */
2304
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_48, RT_CLASS_48);
2305
+ new48 = (RT_NODE_48 *) newnode.local;
2306
+
2307
+ /* copy over the entries */
2308
+ RT_COPY_COMMON(newnode, node);
2309
+ for (int i = 0; i < RT_NODE_MAX_SLOTS; i++)
2310
+ {
2311
+ if (RT_NODE_256_IS_CHUNK_USED(n256, i))
2312
+ {
2313
+ new48->slot_idxs[i] = slot_idx;
2314
+ new48->children[slot_idx] = n256->children[i];
2315
+ slot_idx++;
2316
+ }
2317
+ }
2318
+
2319
+ /*
2320
+ * Since we just copied a dense array, we can fill "isset" using a single
2321
+ * store, provided the length of that array is at most the number of bits
2322
+ * in a bitmapword.
2323
+ */
2324
+ Assert(n256->base.count <= BITS_PER_BITMAPWORD);
2325
+ new48->isset[0] = (bitmapword) (((uint64) 1 << n256->base.count) - 1);
2326
+
2327
+ /* free old node and update reference in parent */
2328
+ *parent_slot = newnode.alloc;
2329
+ RT_FREE_NODE(tree, node);
2330
+ }
2331
+
2332
+ static inline void
2333
+ RT_REMOVE_CHILD_256(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk)
2334
+ {
2335
+ int shrink_threshold;
2336
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node.local;
2337
+ int idx = RT_BM_IDX(chunk);
2338
+ int bitnum = RT_BM_BIT(chunk);
2339
+
2340
+ /* Mark the slot free for "chunk" */
2341
+ n256->isset[idx] &= ~((bitmapword) 1 << bitnum);
2342
+
2343
+ n256->base.count--;
2344
+
2345
+ /*
2346
+ * A full node256 will have a count of zero because of overflow, so we
2347
+ * delete first before checking the shrink threshold.
2348
+ */
2349
+ Assert(n256->base.count > 0);
2350
+
2351
+ /* This simplifies RT_SHRINK_NODE_256() */
2352
+ shrink_threshold = BITS_PER_BITMAPWORD;
2353
+ shrink_threshold = Min(RT_FANOUT_48 / 4 * 3, shrink_threshold);
2354
+
2355
+ if (n256->base.count <= shrink_threshold)
2356
+ RT_SHRINK_NODE_256(tree, parent_slot, node, chunk);
2357
+ }
2358
+
2359
+ /*
2360
+ * Move contents of a node48 to a node16. Any deletion should have happened
2361
+ * in the caller.
2362
+ */
2363
+ static void pg_noinline
2364
+ RT_SHRINK_NODE_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk)
2365
+ {
2366
+ RT_NODE_48 *n48 = (RT_NODE_48 *) (node.local);
2367
+ RT_CHILD_PTR newnode;
2368
+ RT_NODE_16 *new16;
2369
+ int destidx = 0;
2370
+
2371
+ /*
2372
+ * Initialize new node. For now we skip the larger node16 size class for
2373
+ * simplicity.
2374
+ */
2375
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_LO);
2376
+ new16 = (RT_NODE_16 *) newnode.local;
2377
+
2378
+ /* copy over all existing entries */
2379
+ RT_COPY_COMMON(newnode, node);
2380
+ for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++)
2381
+ {
2382
+ if (n48->slot_idxs[chunk] != RT_INVALID_SLOT_IDX)
2383
+ {
2384
+ new16->chunks[destidx] = chunk;
2385
+ new16->children[destidx] = n48->children[n48->slot_idxs[chunk]];
2386
+ destidx++;
2387
+ }
2388
+ }
2389
+
2390
+ Assert(destidx < new16->base.fanout);
2391
+
2392
+ RT_VERIFY_NODE((RT_NODE *) new16);
2393
+
2394
+ /* free old node and update reference in parent */
2395
+ *parent_slot = newnode.alloc;
2396
+ RT_FREE_NODE(tree, node);
2397
+ }
2398
+
2399
+ static inline void
2400
+ RT_REMOVE_CHILD_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk)
2401
+ {
2402
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node.local;
2403
+ int deletepos = n48->slot_idxs[chunk];
2404
+
2405
+ /* For now we skip the larger node16 size class for simplicity */
2406
+ int shrink_threshold = RT_FANOUT_16_LO / 4 * 3;
2407
+ int idx;
2408
+ int bitnum;
2409
+
2410
+ Assert(deletepos != RT_INVALID_SLOT_IDX);
2411
+
2412
+ idx = RT_BM_IDX(deletepos);
2413
+ bitnum = RT_BM_BIT(deletepos);
2414
+ n48->isset[idx] &= ~((bitmapword) 1 << bitnum);
2415
+ n48->slot_idxs[chunk] = RT_INVALID_SLOT_IDX;
2416
+
2417
+ n48->base.count--;
2418
+
2419
+ /*
2420
+ * To keep shrinking simple, do it after deleting, which is fast for
2421
+ * node48 anyway.
2422
+ */
2423
+ if (n48->base.count <= shrink_threshold)
2424
+ RT_SHRINK_NODE_48(tree, parent_slot, node, chunk);
2425
+ }
2426
+
2427
+ /*
2428
+ * Move contents of a node16 to a node4, and delete the one at "deletepos".
2429
+ * By deleting as we move, we can avoid memmove operations in the new
2430
+ * node.
2431
+ */
2432
+ static void pg_noinline
2433
+ RT_SHRINK_NODE_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 deletepos)
2434
+ {
2435
+ RT_NODE_16 *n16 = (RT_NODE_16 *) (node.local);
2436
+ RT_CHILD_PTR newnode;
2437
+ RT_NODE_4 *new4;
2438
+
2439
+ /* initialize new node */
2440
+ newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4);
2441
+ new4 = (RT_NODE_4 *) newnode.local;
2442
+
2443
+ /* copy over existing entries, except for the one at "deletepos" */
2444
+ RT_COPY_COMMON(newnode, node);
2445
+ RT_COPY_ARRAYS_AND_DELETE(new4->chunks, new4->children,
2446
+ n16->chunks, n16->children,
2447
+ n16->base.count, deletepos);
2448
+
2449
+ new4->base.count--;
2450
+ RT_VERIFY_NODE((RT_NODE *) new4);
2451
+
2452
+ /* free old node and update reference in parent */
2453
+ *parent_slot = newnode.alloc;
2454
+ RT_FREE_NODE(tree, node);
2455
+ }
2456
+
2457
+ static inline void
2458
+ RT_REMOVE_CHILD_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot)
2459
+ {
2460
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node.local;
2461
+ int deletepos = slot - n16->children;
2462
+
2463
+ /*
2464
+ * When shrinking to node4, 4 is hard-coded. After shrinking, the new node
2465
+ * will end up with 3 elements and 3 is the largest count where linear
2466
+ * search is faster than SIMD, at least on x86-64.
2467
+ */
2468
+ if (n16->base.count <= 4)
2469
+ {
2470
+ RT_SHRINK_NODE_16(tree, parent_slot, node, deletepos);
2471
+ return;
2472
+ }
2473
+
2474
+ Assert(deletepos >= 0);
2475
+ Assert(n16->chunks[deletepos] == chunk);
2476
+
2477
+ RT_SHIFT_ARRAYS_AND_DELETE(n16->chunks, n16->children,
2478
+ n16->base.count, deletepos);
2479
+ n16->base.count--;
2480
+ }
2481
+
2482
+ static inline void
2483
+ RT_REMOVE_CHILD_4(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot)
2484
+ {
2485
+ RT_NODE_4 *n4 = (RT_NODE_4 *) node.local;
2486
+
2487
+ if (n4->base.count == 1)
2488
+ {
2489
+ Assert(n4->chunks[0] == chunk);
2490
+
2491
+ /*
2492
+ * If we're deleting the last entry from the root child node don't
2493
+ * free it, but mark both the tree and the root child node empty. That
2494
+ * way, RT_SET can assume it exists.
2495
+ */
2496
+ if (parent_slot == &tree->ctl->root)
2497
+ {
2498
+ n4->base.count = 0;
2499
+ tree->ctl->start_shift = 0;
2500
+ tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(0);
2501
+ }
2502
+ else
2503
+ {
2504
+ /*
2505
+ * Deleting last entry, so just free the entire node.
2506
+ * RT_DELETE_RECURSIVE has already freed the value and lower-level
2507
+ * children.
2508
+ */
2509
+ RT_FREE_NODE(tree, node);
2510
+
2511
+ /*
2512
+ * Also null out the parent's slot -- this tells the next higher
2513
+ * level to delete its child pointer
2514
+ */
2515
+ *parent_slot = RT_INVALID_PTR_ALLOC;
2516
+ }
2517
+ }
2518
+ else
2519
+ {
2520
+ int deletepos = slot - n4->children;
2521
+
2522
+ Assert(deletepos >= 0);
2523
+ Assert(n4->chunks[deletepos] == chunk);
2524
+
2525
+ RT_SHIFT_ARRAYS_AND_DELETE(n4->chunks, n4->children,
2526
+ n4->base.count, deletepos);
2527
+
2528
+ n4->base.count--;
2529
+ }
2530
+ }
2531
+
2532
+ /*
2533
+ * Delete the child pointer corresponding to "key" in the given node.
2534
+ */
2535
+ static inline void
2536
+ RT_NODE_DELETE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot)
2537
+ {
2538
+ switch ((node.local)->kind)
2539
+ {
2540
+ case RT_NODE_KIND_4:
2541
+ {
2542
+ RT_REMOVE_CHILD_4(tree, parent_slot, node, chunk, slot);
2543
+ return;
2544
+ }
2545
+ case RT_NODE_KIND_16:
2546
+ {
2547
+ RT_REMOVE_CHILD_16(tree, parent_slot, node, chunk, slot);
2548
+ return;
2549
+ }
2550
+ case RT_NODE_KIND_48:
2551
+ {
2552
+ RT_REMOVE_CHILD_48(tree, parent_slot, node, chunk);
2553
+ return;
2554
+ }
2555
+ case RT_NODE_KIND_256:
2556
+ {
2557
+ RT_REMOVE_CHILD_256(tree, parent_slot, node, chunk);
2558
+ return;
2559
+ }
2560
+ default:
2561
+ pg_unreachable();
2562
+ }
2563
+ }
2564
+
2565
+ /* workhorse for RT_DELETE */
2566
+ static bool
2567
+ RT_DELETE_RECURSIVE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift)
2568
+ {
2569
+ RT_PTR_ALLOC *slot;
2570
+ RT_CHILD_PTR node;
2571
+ uint8 chunk = RT_GET_KEY_CHUNK(key, shift);
2572
+
2573
+ node.alloc = *parent_slot;
2574
+ RT_PTR_SET_LOCAL(tree, &node);
2575
+ slot = RT_NODE_SEARCH(node.local, chunk);
2576
+
2577
+ if (slot == NULL)
2578
+ return false;
2579
+
2580
+ if (shift == 0)
2581
+ {
2582
+ if (!RT_CHILDPTR_IS_VALUE(*slot))
2583
+ RT_FREE_LEAF(tree, *slot);
2584
+
2585
+ RT_NODE_DELETE(tree, parent_slot, node, chunk, slot);
2586
+ return true;
2587
+ }
2588
+ else
2589
+ {
2590
+ bool deleted;
2591
+
2592
+ deleted = RT_DELETE_RECURSIVE(tree, slot, key, shift - RT_SPAN);
2593
+
2594
+ /* Child node was freed, so delete its slot now */
2595
+ if (*slot == RT_INVALID_PTR_ALLOC)
2596
+ {
2597
+ Assert(deleted);
2598
+ RT_NODE_DELETE(tree, parent_slot, node, chunk, slot);
2599
+ }
2600
+
2601
+ return deleted;
2602
+ }
2603
+ }
2604
+
2605
+ /*
2606
+ * Delete the given key from the radix tree. If the key is found delete it
2607
+ * and return true, otherwise do nothing and return false.
2608
+ *
2609
+ * Taking a lock in exclusive mode is the caller's responsibility.
2610
+ */
2611
+ RT_SCOPE bool
2612
+ RT_DELETE(RT_RADIX_TREE * tree, uint64 key)
2613
+ {
2614
+ bool deleted;
2615
+
2616
+ #ifdef RT_SHMEM
2617
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
2618
+ #endif
2619
+
2620
+ if (key > tree->ctl->max_val)
2621
+ return false;
2622
+
2623
+ Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root));
2624
+ deleted = RT_DELETE_RECURSIVE(tree, &tree->ctl->root,
2625
+ key, tree->ctl->start_shift);
2626
+
2627
+ /* Found the key to delete. Update the statistics */
2628
+ if (deleted)
2629
+ {
2630
+ tree->ctl->num_keys--;
2631
+ Assert(tree->ctl->num_keys >= 0);
2632
+ }
2633
+
2634
+ return deleted;
2635
+ }
2636
+
2637
+ #endif /* RT_USE_DELETE */
2638
+
2639
+ /***************** UTILITY FUNCTIONS *****************/
2640
+
2641
+ /*
2642
+ * Return the statistics of the amount of memory used by the radix tree.
2643
+ *
2644
+ * Since dsa_get_total_size() does appropriate locking, the caller doesn't
2645
+ * need to take a lock.
2646
+ */
2647
+ RT_SCOPE uint64
2648
+ RT_MEMORY_USAGE(RT_RADIX_TREE * tree)
2649
+ {
2650
+ size_t total = 0;
2651
+
2652
+ #ifdef RT_SHMEM
2653
+ Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC);
2654
+ total = dsa_get_total_size(tree->dsa);
2655
+ #else
2656
+ total = MemoryContextMemAllocated(tree->leaf_context, true);
2657
+ #endif
2658
+
2659
+ return total;
2660
+ }
2661
+
2662
+ /*
2663
+ * Perform some sanity checks on the given node.
2664
+ */
2665
+ static void
2666
+ RT_VERIFY_NODE(RT_NODE * node)
2667
+ {
2668
+ #ifdef USE_ASSERT_CHECKING
2669
+
2670
+ switch (node->kind)
2671
+ {
2672
+ case RT_NODE_KIND_4:
2673
+ {
2674
+ RT_NODE_4 *n4 = (RT_NODE_4 *) node;
2675
+
2676
+ /* RT_DUMP_NODE(node); */
2677
+
2678
+ for (int i = 1; i < n4->base.count; i++)
2679
+ Assert(n4->chunks[i - 1] < n4->chunks[i]);
2680
+
2681
+ break;
2682
+ }
2683
+ case RT_NODE_KIND_16:
2684
+ {
2685
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node;
2686
+
2687
+ /* RT_DUMP_NODE(node); */
2688
+
2689
+ for (int i = 1; i < n16->base.count; i++)
2690
+ Assert(n16->chunks[i - 1] < n16->chunks[i]);
2691
+
2692
+ break;
2693
+ }
2694
+ case RT_NODE_KIND_48:
2695
+ {
2696
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node;
2697
+ int cnt = 0;
2698
+
2699
+ /* RT_DUMP_NODE(node); */
2700
+
2701
+ for (int i = 0; i < RT_NODE_MAX_SLOTS; i++)
2702
+ {
2703
+ uint8 slot = n48->slot_idxs[i];
2704
+ int idx = RT_BM_IDX(slot);
2705
+ int bitnum = RT_BM_BIT(slot);
2706
+
2707
+ if (!RT_NODE_48_IS_CHUNK_USED(n48, i))
2708
+ continue;
2709
+
2710
+ /* Check if the corresponding slot is used */
2711
+ Assert(slot < node->fanout);
2712
+ Assert((n48->isset[idx] & ((bitmapword) 1 << bitnum)) != 0);
2713
+
2714
+ cnt++;
2715
+ }
2716
+
2717
+ Assert(n48->base.count == cnt);
2718
+
2719
+ break;
2720
+ }
2721
+ case RT_NODE_KIND_256:
2722
+ {
2723
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node;
2724
+ int cnt = 0;
2725
+
2726
+ /* RT_DUMP_NODE(node); */
2727
+
2728
+ for (int i = 0; i < RT_BM_IDX(RT_NODE_MAX_SLOTS); i++)
2729
+ cnt += bmw_popcount(n256->isset[i]);
2730
+
2731
+ /*
2732
+ * Check if the number of used chunk matches, accounting for
2733
+ * overflow
2734
+ */
2735
+ if (cnt == RT_FANOUT_256)
2736
+ Assert(n256->base.count == 0);
2737
+ else
2738
+ Assert(n256->base.count == cnt);
2739
+
2740
+ break;
2741
+ }
2742
+ }
2743
+ #endif
2744
+ }
2745
+
2746
+ /***************** DEBUG FUNCTIONS *****************/
2747
+
2748
+ #ifdef RT_DEBUG
2749
+
2750
+ /*
2751
+ * Print out tree stats, some of which are only collected in debugging builds.
2752
+ */
2753
+ RT_SCOPE void
2754
+ RT_STATS(RT_RADIX_TREE * tree)
2755
+ {
2756
+ fprintf(stderr, "max_val = " UINT64_FORMAT "\n", tree->ctl->max_val);
2757
+ fprintf(stderr, "num_keys = %" PRId64 "\n", tree->ctl->num_keys);
2758
+
2759
+ #ifdef RT_SHMEM
2760
+ fprintf(stderr, "handle = " DSA_POINTER_FORMAT "\n", tree->ctl->handle);
2761
+ #endif
2762
+
2763
+ fprintf(stderr, "height = %d", tree->ctl->start_shift / RT_SPAN);
2764
+
2765
+ for (int i = 0; i < RT_NUM_SIZE_CLASSES; i++)
2766
+ {
2767
+ RT_SIZE_CLASS_ELEM size_class = RT_SIZE_CLASS_INFO[i];
2768
+
2769
+ fprintf(stderr, ", n%d = %" PRId64, size_class.fanout, tree->ctl->num_nodes[i]);
2770
+ }
2771
+
2772
+ fprintf(stderr, ", leaves = %" PRId64, tree->ctl->num_leaves);
2773
+
2774
+ fprintf(stderr, "\n");
2775
+ }
2776
+
2777
+ /*
2778
+ * Print out debugging information about the given node.
2779
+ */
2780
+ static void
2781
+ pg_attribute_unused()
2782
+ RT_DUMP_NODE(RT_NODE * node)
2783
+ {
2784
+ #ifdef RT_SHMEM
2785
+ #define RT_CHILD_PTR_FORMAT DSA_POINTER_FORMAT
2786
+ #else
2787
+ #define RT_CHILD_PTR_FORMAT "%p"
2788
+ #endif
2789
+
2790
+ fprintf(stderr, "kind %d, fanout %d, count %u\n",
2791
+ (node->kind == RT_NODE_KIND_4) ? 4 :
2792
+ (node->kind == RT_NODE_KIND_16) ? 16 :
2793
+ (node->kind == RT_NODE_KIND_48) ? 48 : 256,
2794
+ node->fanout == 0 ? 256 : node->fanout,
2795
+ node->count == 0 ? 256 : node->count);
2796
+
2797
+ switch (node->kind)
2798
+ {
2799
+ case RT_NODE_KIND_4:
2800
+ {
2801
+ RT_NODE_4 *n4 = (RT_NODE_4 *) node;
2802
+
2803
+ fprintf(stderr, "chunks and slots:\n");
2804
+ for (int i = 0; i < n4->base.count; i++)
2805
+ {
2806
+ fprintf(stderr, " [%d] chunk %x slot " RT_CHILD_PTR_FORMAT "\n",
2807
+ i, n4->chunks[i], n4->children[i]);
2808
+ }
2809
+
2810
+ break;
2811
+ }
2812
+ case RT_NODE_KIND_16:
2813
+ {
2814
+ RT_NODE_16 *n16 = (RT_NODE_16 *) node;
2815
+
2816
+ fprintf(stderr, "chunks and slots:\n");
2817
+ for (int i = 0; i < n16->base.count; i++)
2818
+ {
2819
+ fprintf(stderr, " [%d] chunk %x slot " RT_CHILD_PTR_FORMAT "\n",
2820
+ i, n16->chunks[i], n16->children[i]);
2821
+ }
2822
+ break;
2823
+ }
2824
+ case RT_NODE_KIND_48:
2825
+ {
2826
+ RT_NODE_48 *n48 = (RT_NODE_48 *) node;
2827
+ char *sep = "";
2828
+
2829
+ fprintf(stderr, "slot_idxs: \n");
2830
+ for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++)
2831
+ {
2832
+ if (!RT_NODE_48_IS_CHUNK_USED(n48, chunk))
2833
+ continue;
2834
+
2835
+ fprintf(stderr, " idx[%d] = %d\n",
2836
+ chunk, n48->slot_idxs[chunk]);
2837
+ }
2838
+
2839
+ fprintf(stderr, "isset-bitmap: ");
2840
+ for (int i = 0; i < (RT_FANOUT_48_MAX / BITS_PER_BYTE); i++)
2841
+ {
2842
+ fprintf(stderr, "%s%x", sep, ((uint8 *) n48->isset)[i]);
2843
+ sep = " ";
2844
+ }
2845
+ fprintf(stderr, "\n");
2846
+
2847
+ fprintf(stderr, "chunks and slots:\n");
2848
+ for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++)
2849
+ {
2850
+ if (!RT_NODE_48_IS_CHUNK_USED(n48, chunk))
2851
+ continue;
2852
+
2853
+ fprintf(stderr, " chunk %x slot " RT_CHILD_PTR_FORMAT "\n",
2854
+ chunk,
2855
+ *RT_NODE_48_GET_CHILD(n48, chunk));
2856
+ }
2857
+ break;
2858
+ }
2859
+ case RT_NODE_KIND_256:
2860
+ {
2861
+ RT_NODE_256 *n256 = (RT_NODE_256 *) node;
2862
+ char *sep = "";
2863
+
2864
+ fprintf(stderr, "isset-bitmap: ");
2865
+ for (int i = 0; i < (RT_FANOUT_256 / BITS_PER_BYTE); i++)
2866
+ {
2867
+ fprintf(stderr, "%s%x", sep, ((uint8 *) n256->isset)[i]);
2868
+ sep = " ";
2869
+ }
2870
+ fprintf(stderr, "\n");
2871
+
2872
+ fprintf(stderr, "chunks and slots:\n");
2873
+ for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++)
2874
+ {
2875
+ if (!RT_NODE_256_IS_CHUNK_USED(n256, chunk))
2876
+ continue;
2877
+
2878
+ fprintf(stderr, " chunk %x slot " RT_CHILD_PTR_FORMAT "\n",
2879
+ chunk,
2880
+ *RT_NODE_256_GET_CHILD(n256, chunk));
2881
+ }
2882
+ break;
2883
+ }
2884
+ }
2885
+ }
2886
+ #endif /* RT_DEBUG */
2887
+
2888
+ #endif /* RT_DEFINE */
2889
+
2890
+
2891
+ /* undefine external parameters, so next radix tree can be defined */
2892
+ #undef RT_PREFIX
2893
+ #undef RT_SCOPE
2894
+ #undef RT_DECLARE
2895
+ #undef RT_DEFINE
2896
+ #undef RT_VALUE_TYPE
2897
+ #undef RT_VARLEN_VALUE_SIZE
2898
+ #undef RT_RUNTIME_EMBEDDABLE_VALUE
2899
+ #undef RT_SHMEM
2900
+ #undef RT_USE_DELETE
2901
+ #undef RT_DEBUG
2902
+
2903
+ /* locally declared macros */
2904
+ #undef RT_MAKE_PREFIX
2905
+ #undef RT_MAKE_NAME
2906
+ #undef RT_MAKE_NAME_
2907
+ #undef RT_STR
2908
+ #undef RT_STR_
2909
+ #undef RT_SPAN
2910
+ #undef RT_NODE_MAX_SLOTS
2911
+ #undef RT_CHUNK_MASK
2912
+ #undef RT_MAX_SHIFT
2913
+ #undef RT_MAX_LEVEL
2914
+ #undef RT_GET_KEY_CHUNK
2915
+ #undef RT_BM_IDX
2916
+ #undef RT_BM_BIT
2917
+ #undef RT_NODE_MUST_GROW
2918
+ #undef RT_NODE_KIND_COUNT
2919
+ #undef RT_NUM_SIZE_CLASSES
2920
+ #undef RT_INVALID_SLOT_IDX
2921
+ #undef RT_SLAB_BLOCK_SIZE
2922
+ #undef RT_RADIX_TREE_MAGIC
2923
+ #undef RT_CHILD_PTR_FORMAT
2924
+
2925
+ /* type declarations */
2926
+ #undef RT_RADIX_TREE
2927
+ #undef RT_RADIX_TREE_CONTROL
2928
+ #undef RT_CHILD_PTR
2929
+ #undef RT_PTR_ALLOC
2930
+ #undef RT_INVALID_PTR_ALLOC
2931
+ #undef RT_HANDLE
2932
+ #undef RT_ITER
2933
+ #undef RT_NODE
2934
+ #undef RT_NODE_ITER
2935
+ #undef RT_NODE_KIND_4
2936
+ #undef RT_NODE_KIND_16
2937
+ #undef RT_NODE_KIND_48
2938
+ #undef RT_NODE_KIND_256
2939
+ #undef RT_NODE_4
2940
+ #undef RT_NODE_16
2941
+ #undef RT_NODE_48
2942
+ #undef RT_NODE_256
2943
+ #undef RT_SIZE_CLASS
2944
+ #undef RT_SIZE_CLASS_ELEM
2945
+ #undef RT_SIZE_CLASS_INFO
2946
+ #undef RT_CLASS_4
2947
+ #undef RT_CLASS_16_LO
2948
+ #undef RT_CLASS_16_HI
2949
+ #undef RT_CLASS_48
2950
+ #undef RT_CLASS_256
2951
+ #undef RT_FANOUT_4
2952
+ #undef RT_FANOUT_4_MAX
2953
+ #undef RT_FANOUT_16_LO
2954
+ #undef RT_FANOUT_16_HI
2955
+ #undef RT_FANOUT_16_MAX
2956
+ #undef RT_FANOUT_48
2957
+ #undef RT_FANOUT_48_MAX
2958
+ #undef RT_FANOUT_256
2959
+
2960
+ /* function declarations */
2961
+ #undef RT_CREATE
2962
+ #undef RT_FREE
2963
+ #undef RT_ATTACH
2964
+ #undef RT_DETACH
2965
+ #undef RT_LOCK_EXCLUSIVE
2966
+ #undef RT_LOCK_SHARE
2967
+ #undef RT_UNLOCK
2968
+ #undef RT_GET_HANDLE
2969
+ #undef RT_FIND
2970
+ #undef RT_SET
2971
+ #undef RT_BEGIN_ITERATE
2972
+ #undef RT_ITERATE_NEXT
2973
+ #undef RT_END_ITERATE
2974
+ #undef RT_DELETE
2975
+ #undef RT_MEMORY_USAGE
2976
+ #undef RT_DUMP_NODE
2977
+ #undef RT_STATS
2978
+
2979
+ /* internal helper functions */
2980
+ #undef RT_GET_VALUE_SIZE
2981
+ #undef RT_VALUE_IS_EMBEDDABLE
2982
+ #undef RT_CHILDPTR_IS_VALUE
2983
+ #undef RT_GET_SLOT_RECURSIVE
2984
+ #undef RT_DELETE_RECURSIVE
2985
+ #undef RT_ALLOC_NODE
2986
+ #undef RT_ALLOC_LEAF
2987
+ #undef RT_FREE_NODE
2988
+ #undef RT_FREE_LEAF
2989
+ #undef RT_FREE_RECURSE
2990
+ #undef RT_EXTEND_UP
2991
+ #undef RT_EXTEND_DOWN
2992
+ #undef RT_COPY_COMMON
2993
+ #undef RT_PTR_SET_LOCAL
2994
+ #undef RT_PTR_ALLOC_IS_VALID
2995
+ #undef RT_NODE_16_SEARCH_EQ
2996
+ #undef RT_NODE_4_GET_INSERTPOS
2997
+ #undef RT_NODE_16_GET_INSERTPOS
2998
+ #undef RT_SHIFT_ARRAYS_FOR_INSERT
2999
+ #undef RT_SHIFT_ARRAYS_AND_DELETE
3000
+ #undef RT_COPY_ARRAYS_FOR_INSERT
3001
+ #undef RT_COPY_ARRAYS_AND_DELETE
3002
+ #undef RT_NODE_48_IS_CHUNK_USED
3003
+ #undef RT_NODE_48_GET_CHILD
3004
+ #undef RT_NODE_256_IS_CHUNK_USED
3005
+ #undef RT_NODE_256_GET_CHILD
3006
+ #undef RT_KEY_GET_SHIFT
3007
+ #undef RT_SHIFT_GET_MAX_VAL
3008
+ #undef RT_NODE_SEARCH
3009
+ #undef RT_ADD_CHILD_4
3010
+ #undef RT_ADD_CHILD_16
3011
+ #undef RT_ADD_CHILD_48
3012
+ #undef RT_ADD_CHILD_256
3013
+ #undef RT_GROW_NODE_4
3014
+ #undef RT_GROW_NODE_16
3015
+ #undef RT_GROW_NODE_48
3016
+ #undef RT_REMOVE_CHILD_4
3017
+ #undef RT_REMOVE_CHILD_16
3018
+ #undef RT_REMOVE_CHILD_48
3019
+ #undef RT_REMOVE_CHILD_256
3020
+ #undef RT_SHRINK_NODE_16
3021
+ #undef RT_SHRINK_NODE_48
3022
+ #undef RT_SHRINK_NODE_256
3023
+ #undef RT_NODE_DELETE
3024
+ #undef RT_NODE_INSERT
3025
+ #undef RT_NODE_ITERATE_NEXT
3026
+ #undef RT_VERIFY_NODE