1#include "duckdb/main/extension_helper.hpp"
2
3#include "duckdb/common/file_system.hpp"
4#include "duckdb/common/string_util.hpp"
5#include "duckdb/common/windows.hpp"
6#include "duckdb/main/client_context.hpp"
7#include "duckdb/main/database.hpp"
8
9#if defined(BUILD_ICU_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
10#define ICU_STATICALLY_LOADED true
11#include "icu-extension.hpp"
12#else
13#define ICU_STATICALLY_LOADED false
14#endif
15
16#if defined(BUILD_PARQUET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
17#define PARQUET_STATICALLY_LOADED true
18#include "parquet-extension.hpp"
19#else
20#define PARQUET_STATICALLY_LOADED false
21#endif
22
23#if defined(BUILD_TPCH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
24#define TPCH_STATICALLY_LOADED true
25#include "tpch-extension.hpp"
26#else
27#define TPCH_STATICALLY_LOADED false
28#endif
29
30#if defined(BUILD_TPCDS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
31#define TPCDS_STATICALLY_LOADED true
32#include "tpcds-extension.hpp"
33#else
34#define TPCDS_STATICALLY_LOADED false
35#endif
36
37#if defined(BUILD_FTS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
38#define FTS_STATICALLY_LOADED true
39#include "fts-extension.hpp"
40#else
41#define FTS_STATICALLY_LOADED false
42#endif
43
44#if defined(BUILD_HTTPFS_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
45#define HTTPFS_STATICALLY_LOADED true
46#include "httpfs-extension.hpp"
47#else
48#define HTTPFS_STATICALLY_LOADED false
49#endif
50
51#if defined(BUILD_VISUALIZER_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
52#include "visualizer-extension.hpp"
53#endif
54
55#if defined(BUILD_JSON_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
56#define JSON_STATICALLY_LOADED true
57#include "json-extension.hpp"
58#else
59#define JSON_STATICALLY_LOADED false
60#endif
61
62#if defined(BUILD_JEMALLOC_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
63#define JEMALLOC_STATICALLY_LOADED true
64#include "jemalloc-extension.hpp"
65#else
66#define JEMALLOC_STATICALLY_LOADED false
67#endif
68
69#if defined(BUILD_EXCEL_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
70#include "excel-extension.hpp"
71#endif
72
73#if defined(BUILD_SQLSMITH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
74#include "sqlsmith-extension.hpp"
75#endif
76
77#if defined(BUILD_INET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
78#include "inet-extension.hpp"
79#endif
80
81#if defined(BUILD_AUTOCOMPLETE_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
82#define AUTOCOMPLETE_STATICALLY_LOADED true
83#include "sql_auto_complete-extension.hpp"
84#else
85#define AUTOCOMPLETE_STATICALLY_LOADED false
86#endif
87
88// Load the generated header file containing our list of extension headers
89#if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
90#include "extension_oote_loader.hpp"
91#endif
92
93namespace duckdb {
94
95//===--------------------------------------------------------------------===//
96// Default Extensions
97//===--------------------------------------------------------------------===//
98static DefaultExtension internal_extensions[] = {
99 {.name: "icu", .description: "Adds support for time zones and collations using the ICU library", ICU_STATICALLY_LOADED},
100 {.name: "parquet", .description: "Adds support for reading and writing parquet files", PARQUET_STATICALLY_LOADED},
101 {.name: "tpch", .description: "Adds TPC-H data generation and query support", TPCH_STATICALLY_LOADED},
102 {.name: "tpcds", .description: "Adds TPC-DS data generation and query support", TPCDS_STATICALLY_LOADED},
103 {.name: "fts", .description: "Adds support for Full-Text Search Indexes", FTS_STATICALLY_LOADED},
104 {.name: "httpfs", .description: "Adds support for reading and writing files over a HTTP(S) connection", HTTPFS_STATICALLY_LOADED},
105 {.name: "json", .description: "Adds support for JSON operations", JSON_STATICALLY_LOADED},
106 {.name: "jemalloc", .description: "Overwrites system allocator with JEMalloc", JEMALLOC_STATICALLY_LOADED},
107 {.name: "autocomplete", .description: "Add supports for autocomplete in the shell", AUTOCOMPLETE_STATICALLY_LOADED},
108 {.name: "motherduck", .description: "Enables motherduck integration with the system", .statically_loaded: false},
109 {.name: "sqlite_scanner", .description: "Adds support for reading SQLite database files", .statically_loaded: false},
110 {.name: "postgres_scanner", .description: "Adds support for reading from a Postgres database", .statically_loaded: false},
111 {.name: "inet", .description: "Adds support for IP-related data types and functions", .statically_loaded: false},
112 {.name: "spatial", .description: "Geospatial extension that adds support for working with spatial data and functions", .statically_loaded: false},
113 {.name: nullptr, .description: nullptr, .statically_loaded: false}};
114
115idx_t ExtensionHelper::DefaultExtensionCount() {
116 idx_t index;
117 for (index = 0; internal_extensions[index].name != nullptr; index++) {
118 }
119 return index;
120}
121
122DefaultExtension ExtensionHelper::GetDefaultExtension(idx_t index) {
123 D_ASSERT(index < DefaultExtensionCount());
124 return internal_extensions[index];
125}
126
127//===--------------------------------------------------------------------===//
128// Allow Auto-Install Extensions
129//===--------------------------------------------------------------------===//
130static const char *auto_install[] = {"motherduck", "postgres_scanner", "sqlite_scanner", nullptr};
131
132bool ExtensionHelper::AllowAutoInstall(const string &extension) {
133 auto lcase = StringUtil::Lower(str: extension);
134 for (idx_t i = 0; auto_install[i]; i++) {
135 if (lcase == auto_install[i]) {
136 return true;
137 }
138 }
139 return false;
140}
141
142//===--------------------------------------------------------------------===//
143// Load Statically Compiled Extension
144//===--------------------------------------------------------------------===//
145void ExtensionHelper::LoadAllExtensions(DuckDB &db) {
146 unordered_set<string> extensions {"parquet", "icu", "tpch", "tpcds", "fts", "httpfs", "visualizer",
147 "json", "excel", "sqlsmith", "inet", "jemalloc", "autocomplete"};
148 for (auto &ext : extensions) {
149 LoadExtensionInternal(db, extension: ext, initial_load: true);
150 }
151
152#if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
153 for (auto &ext : OOT_EXTENSIONS) {
154 LoadExtensionInternal(db, extension: ext, initial_load: true);
155 }
156#endif
157}
158
159ExtensionLoadResult ExtensionHelper::LoadExtension(DuckDB &db, const std::string &extension) {
160 return LoadExtensionInternal(db, extension, initial_load: false);
161}
162
163ExtensionLoadResult ExtensionHelper::LoadExtensionInternal(DuckDB &db, const std::string &extension,
164 bool initial_load) {
165#ifdef DUCKDB_TEST_REMOTE_INSTALL
166 if (!initial_load && StringUtil::Contains(DUCKDB_TEST_REMOTE_INSTALL, extension)) {
167 Connection con(db);
168 auto result = con.Query("INSTALL " + extension);
169 if (result->HasError()) {
170 result->Print();
171 return ExtensionLoadResult::EXTENSION_UNKNOWN;
172 }
173 result = con.Query("LOAD " + extension);
174 if (result->HasError()) {
175 result->Print();
176 return ExtensionLoadResult::EXTENSION_UNKNOWN;
177 }
178 return ExtensionLoadResult::LOADED_EXTENSION;
179 }
180#endif
181 if (extension == "parquet") {
182#if PARQUET_STATICALLY_LOADED
183 db.LoadExtension<ParquetExtension>();
184#else
185 // parquet extension required but not build: skip this test
186 return ExtensionLoadResult::NOT_LOADED;
187#endif
188 } else if (extension == "icu") {
189#if ICU_STATICALLY_LOADED
190 db.LoadExtension<ICUExtension>();
191#else
192 // icu extension required but not build: skip this test
193 return ExtensionLoadResult::NOT_LOADED;
194#endif
195 } else if (extension == "tpch") {
196#if TPCH_STATICALLY_LOADED
197 db.LoadExtension<TPCHExtension>();
198#else
199 // icu extension required but not build: skip this test
200 return ExtensionLoadResult::NOT_LOADED;
201#endif
202 } else if (extension == "tpcds") {
203#if TPCDS_STATICALLY_LOADED
204 db.LoadExtension<TPCDSExtension>();
205#else
206 // icu extension required but not build: skip this test
207 return ExtensionLoadResult::NOT_LOADED;
208#endif
209 } else if (extension == "fts") {
210#if FTS_STATICALLY_LOADED
211 db.LoadExtension<FTSExtension>();
212#else
213 // fts extension required but not build: skip this test
214 return ExtensionLoadResult::NOT_LOADED;
215#endif
216 } else if (extension == "httpfs") {
217#if HTTPFS_STATICALLY_LOADED
218 db.LoadExtension<HTTPFsExtension>();
219#else
220 return ExtensionLoadResult::NOT_LOADED;
221#endif
222 } else if (extension == "visualizer") {
223#if defined(BUILD_VISUALIZER_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
224 db.LoadExtension<VisualizerExtension>();
225#else
226 // visualizer extension required but not build: skip this test
227 return ExtensionLoadResult::NOT_LOADED;
228#endif
229 } else if (extension == "json") {
230#if JSON_STATICALLY_LOADED
231 db.LoadExtension<JSONExtension>();
232#else
233 // json extension required but not build: skip this test
234 return ExtensionLoadResult::NOT_LOADED;
235#endif
236 } else if (extension == "excel") {
237#if defined(BUILD_EXCEL_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
238 db.LoadExtension<EXCELExtension>();
239#else
240 // excel extension required but not build: skip this test
241 return ExtensionLoadResult::NOT_LOADED;
242#endif
243 } else if (extension == "sqlsmith") {
244#if defined(BUILD_SQLSMITH_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
245 db.LoadExtension<SQLSmithExtension>();
246#else
247 // excel extension required but not build: skip this test
248 return ExtensionLoadResult::NOT_LOADED;
249#endif
250 } else if (extension == "jemalloc") {
251#if defined(BUILD_JEMALLOC_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
252 db.LoadExtension<JEMallocExtension>();
253#else
254 // jemalloc extension required but not build: skip this test
255 return ExtensionLoadResult::NOT_LOADED;
256#endif
257 } else if (extension == "autocomplete") {
258#if defined(BUILD_AUTOCOMPLETE_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
259 db.LoadExtension<SQLAutoCompleteExtension>();
260#else
261 // autocomplete extension required but not build: skip this test
262 return ExtensionLoadResult::NOT_LOADED;
263#endif
264 } else if (extension == "inet") {
265#if defined(BUILD_INET_EXTENSION) && !defined(DISABLE_BUILTIN_EXTENSIONS)
266 db.LoadExtension<INETExtension>();
267#else
268 // inet extension required but not build: skip this test
269 return ExtensionLoadResult::NOT_LOADED;
270#endif
271 } else {
272
273#if defined(OOTE_HEADERS_AVAILABLE) && OOTE_HEADERS_AVAILABLE
274 if (TryLoadLinkedExtension(db, extension)) {
275 return ExtensionLoadResult::LOADED_EXTENSION;
276 }
277#endif
278 return ExtensionLoadResult::EXTENSION_UNKNOWN;
279 }
280 return ExtensionLoadResult::LOADED_EXTENSION;
281}
282
283static vector<std::string> public_keys = {
284 R"(
285-----BEGIN PUBLIC KEY-----
286MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6aZuHUa1cLR9YDDYaEfi
287UDbWY8m2t7b71S+k1ZkXfHqu+5drAxm+dIDzdOHOKZSIdwnJbT3sSqwFoG6PlXF3
288g3dsJjax5qESIhbVvf98nyipwNINxoyHCkcCIPkX17QP2xpnT7V59+CqcfDJXLqB
289ymjqoFSlaH8dUCHybM4OXlWnAtVHW/nmw0khF8CetcWn4LxaTUHptByaBz8CasSs
290gWpXgSfaHc3R9eArsYhtsVFGyL/DEWgkEHWolxY3Llenhgm/zOf3s7PsAMe7EJX4
291qlSgiXE6OVBXnqd85z4k20lCw/LAOe5hoTMmRWXIj74MudWe2U91J6GrrGEZa7zT
2927QIDAQAB
293-----END PUBLIC KEY-----
294)",
295 R"(
296-----BEGIN PUBLIC KEY-----
297MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq8Gg1S/LI6ApMAYsFc9m
298PrkFIY+nc0LXSpxm77twU8D5M0Xkz/Av4f88DQmj1OE3164bEtR7sl7xDPZojFHj
299YYyucJxEI97l5OU1d3Pc1BdKXL4+mnW5FlUGj218u8qD+G1hrkySXQkrUzIjPPNw
300o6knF3G/xqQF+KI+tc7ajnTni8CAlnUSxfnstycqbVS86m238PLASVPK9/SmIRgO
301XCEV+ZNMlerq8EwsW4cJPHH0oNVMcaG+QT4z79roW1rbJghn9ubAVdQU6VLUAikI
302b8keUyY+D0XdY9DpDBeiorb1qPYt8BPLOAQrIUAw1CgpMM9KFp9TNvW47KcG4bcB
303dQIDAQAB
304-----END PUBLIC KEY-----
305)",
306 R"(
307-----BEGIN PUBLIC KEY-----
308MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyYATA9KOQ0Azf97QAPfY
309Jc/WeZyE4E1qlRgKWKqNtYSXZqk5At0V7w2ntAWtYSpczFrVepCJ0oPMDpZTigEr
310NgOgfo5LEhPx5XmtCf62xY/xL3kgtfz9Mm5TBkuQy4KwY4z1npGr4NYYDXtF7kkf
311LQE+FnD8Yr4E0wHBib7ey7aeeKWmwqvUjzDqG+TzaqwzO/RCUsSctqSS0t1oo2hv
3124q1ofanUXsV8MXk/ujtgxu7WkVvfiSpK1zRazgeZjcrQFO9qL/pla0vBUxa1U8He
313GMLnL0oRfcMg7yKrbIMrvlEl2ZmiR9im44dXJWfY42quObwr1PuEkEoCMcMisSWl
314jwIDAQAB
315-----END PUBLIC KEY-----
316)",
317 R"(
318-----BEGIN PUBLIC KEY-----
319MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4RvbWx3zLblDHH/lGUF5
320Q512MT+v3YPriuibROMllv8WiCLAMeJ0QXbVaIzBOeHDeLx8yvoZZN+TENKxtT6u
321IfMMneUzxHBqy0AQNfIsSsOnG5nqoeE/AwbS6VqCdH1aLfoCoPffacHYa0XvTcsi
322aVlZfr+UzJS+ty8pRmFVi1UKSOADDdK8XfIovJl/zMP2TxYX2Y3fnjeLtl8Sqs2e
323P+eHDoy7Wi4EPTyY7tNTCfxwKNHn1HQ5yrv5dgvMxFWIWXGz24yikFvtwLGHe8uJ
324Wi+fBX+0PF0diZ6pIthZ149VU8qCqYAXjgpxZ0EZdrsiF6Ewz0cfg20SYApFcmW4
325pwIDAQAB
326-----END PUBLIC KEY-----
327)",
328 R"(
329-----BEGIN PUBLIC KEY-----
330MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyhd5AfwrUohG3O4DE0K9
331O3FmgB7zE4aDnkL8UUfGCh5kdP8q7ewMjekY+c6LwWOmpdJpSwqhfV1q5ZU1l6rk
3323hlt03LO3sgs28kcfOVH15hqfxts6Sg5KcRjxStE50ORmXGwXDcS9vqkJ60J1EHA
333lcZqbCRSO73ZPLhdepfd0/C6tM0L7Ge6cAE62/MTmYNGv8fDzwQr/kYIJMdoS8Zp
334thRpctFZJtPs3b0fffZA/TCLVKMvEVgTWs48751qKid7N/Lm/iEGx/tOf4o23Nec
335Pz1IQaGLP+UOLVQbqQBHJWNOqigm7kWhDgs3N4YagWgxPEQ0WVLtFji/ZjlKZc7h
336dwIDAQAB
337-----END PUBLIC KEY-----
338)",
339 R"(
340-----BEGIN PUBLIC KEY-----
341MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFDg3LhyV6BVE2Z3zQvN
3426urrKvPhygTa5+wIPGwYTzJ8DfGALqlsX3VOXMvcJTca6SbuwwkoXHuSU5wQxfcs
343bt4jTXD3NIoRwQPl+D9IbgIMuX0ACl27rJmr/f9zkY7qui4k1X82pQkxBe+/qJ4r
344TBwVNONVx1fekTMnSCEhwg5yU3TNbkObu0qlQeJfuMWLDQbW/8v/qfr/Nz0JqHDN
345yYKfKvFMlORxyJYiOyeOsbzNGEhkGQGOmKhRUhS35kD+oA0jqwPwMCM9O4kFg/L8
346iZbpBBX2By1K3msejWMRAewTOyPas6YMQOYq9BMmWQqzVtG5xcaSJwN/YnMpJyqb
347sQIDAQAB
348-----END PUBLIC KEY-----
349)",
350 R"(
351-----BEGIN PUBLIC KEY-----
352MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1z0RU8vGrfEkrscEoZKA
353GiOcGh2EMcKwjQpl4nKuR9H4o/dg+CZregVSHg7MP2f8mhLZZyoFev49oWOV4Rmi
354qs99UNxm7DyKW1fF1ovowsUW5lsDoKYLvpuzHo0s4laiV4AnIYP7tHGLdzsnK2Os
355Cp5dSuMwKHPZ9N25hXxFB/dRrAdIiXHvbSqr4N29XzfQloQpL3bGHLKY6guFHluH
356X5dJ9eirVakWWou7BR2rnD0k9vER6oRdVnJ6YKb5uhWEOQ3NmV961oyr+uiDTcep
357qqtGHWuFhENixtiWGjFJJcACwqxEAW3bz9lyrfnPDsHSW/rlQVDIAkik+fOp+R7L
358kQIDAQAB
359-----END PUBLIC KEY-----
360)",
361 R"(
362-----BEGIN PUBLIC KEY-----
363MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxwO27e1vnbNcpiDg7Wwx
364K/w5aEGukXotu3529ieq+O39H0+Bak4vIbzGhDUh3/ElmxaFMAs4PYrWe/hc2WFD
365H4JCOoFIn4y9gQeE855DGGFgeIVd1BnSs5S+5wUEMxLNyHdHSmINN6FsoZ535iUg
366KdYjRh1iZevezg7ln8o/O36uthu925ehFBXSy6jLJgQlwmq0KxZJE0OAZhuDBM60
367MtIunNa/e5y+Gw3GknFwtRLmn/nEckZx1nEtepYvvUa7UGy+8KuGuhOerCZTutbG
368k8liCVgGenRve8unA2LrBbpL+AUf3CrZU/uAxxTqWmw6Z/S6TeW5ozeeyOCh8ii6
369TwIDAQAB
370-----END PUBLIC KEY-----
371)",
372 R"(
373-----BEGIN PUBLIC KEY-----
374MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsGIFOfIQ4RI5qu4klOxf
375ge6eXwBMAkuTXyhyIIJDtE8CurnwQvUXVlt+Kf0SfuIFW6MY5ErcWE/vMFbc81IR
3769wByOAAV2CTyiLGZT63uE8pN6FSHd6yGYCLjXd3P3cnP3Qj5pBncpLuAUDfHG4wP
377bs9jIADw3HysD+eCNja8p7ZC7CzWxTcO7HsEu9deAAU19YywdpagXvQ0pJ9zV5qU
378jrHxBygl31t6TmmX+3d+azjGu9Hu36E+5wcSOOhuwAFXDejb40Ixv53ItJ3fZzzH
379PF2nj9sQvQ8c5ptjyOvQCBRdqkEWXIVHClxqWb+o59pDIh1G0UGcmiDN7K9Gz5HA
380ZQIDAQAB
381-----END PUBLIC KEY-----
382)",
383 R"(
384-----BEGIN PUBLIC KEY-----
385MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt9uUnlW/CoUXT68yaZh9
386SeXHzGRCPNEI98Tara+dgYxDX1z7nfOh8o15liT0QsAzx34EewZOxcKCNiV/dZX5
387z4clCkD8uUbZut6IVx8Eu+7Qcd5jZthRc6hQrN9Ltv7ZQEh7KGXOHa53kT2K01ws
3884jbVmd/7Nx7y0Yyqhja01pIu/CUaTkODfQxBXwriLdIzp7y/iJeF/TLqCwZWHKQx
389QOZnsPEveB1F00Va9MeAtTlXFUJ/TQXquqTjeLj4HuIRtbyuNgWoc0JyF+mcafAl
390bnrNEBIfxZhAT81aUCIAzRJp6AqfdeZxnZ/WwohtZQZLXAxFQPTWCcP+Z9M7OIQL
391WwIDAQAB
392-----END PUBLIC KEY-----
393)",
394 R"(
395-----BEGIN PUBLIC KEY-----
396MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA56NhfACkeCyZM07l2wmd
397iTp24E2tLLKU3iByKlIRWRAvXsOejRMJTHTNHWa3cQ7uLP++Tf2St7ksNsyPMNZy
3989QRTLNCYr9rN9loLwdb2sMWxFBwwzCaAOTahGI7GJQy30UB7FEND0X/5U2rZvQij
399Q6K+O4aa+K9M5qyOHNMmXywmTnAgWKNaNxQHPRtD2+dSj60T6zXdtIuCrPfcNGg5
400gj07qWGEXX83V/L7nSqCiIVYg/wqds1x52Yjk1nhXYNBTqlnhmOd8LynGxz/sXC7
401h2Q9XsHjXIChW4FHyLIOl6b4zPMBSxzCigYm3QZJWfAkZv5PBRtnq7vhYOLHzLQj
402CwIDAQAB
403-----END PUBLIC KEY-----
404)",
405 R"(
406-----BEGIN PUBLIC KEY-----
407MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmfPLe0IWGYC0MZC6YiM3
408QGfhT6zSKB0I2DW44nlBlWUcF+32jW2bFJtgE76qGGKFeU4kJBWYr99ufHoAodNg
409M1Ehl/JfQ5KmbC1WIqnFTrgbmqJde79jeCvCpbFLuqnzidwO1PbXDbfRFQcgWaXT
410mDVLNNVmLxA0GkCv+kydE2gtcOD9BDceg7F/56TDvclyI5QqAnjE2XIRMPZlXQP4
411oF2kgz4Cn7LxLHYmkU2sS9NYLzHoyUqFplWlxkQjA4eQ0neutV1Ydmc1IX8W7R38
412A7nFtaT8iI8w6Vkv7ijYN6xf5cVBPKZ3Dv7AdwPet86JD5mf5v+r7iwg5xl3r77Z
413iwIDAQAB
414-----END PUBLIC KEY-----
415)",
416 R"(
417-----BEGIN PUBLIC KEY-----
418MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoB1kWsX8YmCcFOD9ilBY
419xK076HmUAN026uJ8JpmU9Hz+QT1FNXOsnj1h2G6U6btYVIdHUTHy/BvAumrDKqRz
420qcEAzCuhxUjPjss54a/Zqu6nQcoIPHuG/Er39oZHIVkPR1WCvWj8wmyYv6T//dPH
421unO6tW29sXXxS+J1Gah6vpbtJw1pI/liah1DZzb13KWPDI6ZzviTNnW4S05r6js/
42230He+Yud6aywrdaP/7G90qcrteEFcjFy4Xf+5vG960oKoGoDplwX5poay1oCP9tb
423g8AC8VSRAGi3oviTeSWZcrLXS8AtJhGvF48cXQj2q+8YeVKVDpH6fPQxJ9Sh9aeU
424awIDAQAB
425-----END PUBLIC KEY-----
426)",
427 R"(
428-----BEGIN PUBLIC KEY-----
429MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4NTMAIYIlCMID00ufy/I
430AZXc8pocDx9N1Q5x5/cL3aIpLmx02AKo9BvTJaJuHiTjlwYhPtlhIrHV4HUVTkOX
431sISp8B8v9i2I1RIvCTAcvy3gcH6rdRWZ0cdTUiMEqnnxBX9zdzl8oMzZcyauv19D
432BeqJvzflIT96b8g8K3mvgJHs9a1j9f0gN8FuTA0c52DouKnrh8UwH7mlrumYerJw
4336goJGQuK1HEOt6bcQuvogkbgJWOoEYwjNrPwQvIcP4wyrgSnOHg1yXOFE84oVynJ
434czQEOz9ke42I3h8wrnQxilEYBVo2uX8MenqTyfGnE32lPRt3Wv1iEVQls8Cxiuy2
435CQIDAQAB
436-----END PUBLIC KEY-----
437)",
438 R"(
439-----BEGIN PUBLIC KEY-----
440MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3bUtfp66OtRyvIF/oucn
441id8mo7gvbNEH04QMLO3Ok43dlWgWI3hekJAqOYc0mvoI5anqr98h8FI7aCYZm/bY
442vpz0I1aXBaEPh3aWh8f/w9HME7ykBvmhMe3J+VFGWWL4eswfRl//GCtnSMBzDFhM
443SaQOTvADWHkC0njeI5yXjf/lNm6fMACP1cnhuvCtnx7VP/DAtvUk9usDKG56MJnZ
444UoVM3HHjbJeRwxCdlSWe12ilCdwMRKSDY92Hk38/zBLenH04C3HRQLjBGewACUmx
445uvNInehZ4kSYFGa+7UxBxFtzJhlKzGR73qUjpWzZivCe1K0WfRVP5IWsKNCCESJ/
446nQIDAQAB
447-----END PUBLIC KEY-----
448)",
449 R"(
450-----BEGIN PUBLIC KEY-----
451MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyV2dE/CRUAUE8ybq/DoS
452Lc7QlYXh04K+McbhN724TbHahLTuDk5mR5TAunA8Nea4euRzknKdMFAz1eh9gyy3
4535x4UfXQW1fIZqNo6WNrGxYJgWAXU+pov+OvxsMQWzqS4jrTHDHbblCCLKp1akwJk
454aFNyqgjAL373PcqXC+XAn8vHx4xHFoFP5lq4lLcJCOW5ee9v9El3w0USLwS+t1cF
455RY3kuV6Njlr4zsRH9iM6/zaSuCALYWJ/JrPEurSJXzFZnWsvn6aQdeNeAn08+z0F
456k2NwaauEo0xmLqzqTRGzjHqKKmeefN3/+M/FN2FrApDlxWQfhD2Y3USdAiN547Nj
4571wIDAQAB
458-----END PUBLIC KEY-----
459)",
460 R"(
461-----BEGIN PUBLIC KEY-----
462MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvm2+kTrEQWZXuxhWzBdl
463PCbQGqbrukbeS6JKSlQLJDC8ayZIxFxatqg1Q8UPyv89MVRsHOGlG1OqFaOEtPjQ
464Oo6j/moFwB4GPyJhJHOGpCKa4CLB5clhfDCLJw6ty7PcDU3T6yW4X4Qc5k4LRRWy
465yzC8lVHfBdarN+1iEe0ALMOGoeiJjVn6i/AFxktRwgd8njqv/oWQyfjJZXkNMsb6
4667ZDxNVAUrp/WXpE4Kq694bB9xa/pWsqv7FjQJUgTnEzvbN+qXnVPtA7dHcOYYJ8Z
467SbrJUfHrf8TS5B54AiopFpWG+hIbjqqdigqabBqFpmjiRDZgDy4zJJj52xJZMnrp
468rwIDAQAB
469-----END PUBLIC KEY-----
470)",
471 R"(
472-----BEGIN PUBLIC KEY-----
473MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwEAcVmY3589O02pLA22f
474MlarLyJUgy0BeJDG5AUsi17ct8sHZzRiv9zKQVCBk1CtZY//jyqnrM7iCBLWsyby
475TiTOtGYHHApaLnNjjtaHdQ6zplhbc3g2XLy+4ab8GNKG3zc8iXpsQM6r+JO5n9pm
476V9vollz9dkFxS9l+1P17lZdIgCh9O3EIFJv5QCd5c9l2ezHAan2OhkWhiDtldnH/
477MfRXbz7X5sqlwWLa/jhPtvY45x7dZaCHGqNzbupQZs0vHnAVdDu3vAWDmT/3sXHG
478vmGxswKA9tPU0prSvQWLz4LUCnGi/cC5R+fiu+fovFM/BwvaGtqBFIF/1oWVq7bZ
4794wIDAQAB
480-----END PUBLIC KEY-----
481)",
482 R"(
483-----BEGIN PUBLIC KEY-----
484MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA25qGwNO1+qHygC8mjm8L
4853I66mV/IzslgBDHC91mE8YcI5Fq0sdrtsbUhK3z89wIN/zOhbHX0NEiXm2GxUnsI
486vb5tDZXAh7AbTnXTMVbxO/e/8sPLUiObGjDvjVzyzrxOeG87yK/oIiilwk9wTsIb
487wMn2Grj4ht9gVKx3oGHYV7STNdWBlzSaJj4Ou7+5M1InjPDRFZG1K31D2d3IHByX
488lmcRPZtPFTa5C1uVJw00fI4F4uEFlPclZQlR5yA0G9v+0uDgLcjIUB4eqwMthUWc
489dHhlmrPp04LI19eksWHCtG30RzmUaxDiIC7J2Ut0zHDqUe7aXn8tOVI7dE9tTKQD
490KQIDAQAB
491-----END PUBLIC KEY-----
492)",
493 R"(
494-----BEGIN PUBLIC KEY-----
495MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7EC2bx7aRnf3TcRg5gmw
496QOKNCUheCelK8hoXLMsKSJqmufyJ+IHUejpXGOpvyYRbACiJ5GiNcww20MVpTBU7
497YESWB2QSU2eEJJXMq84qsZSO8WGmAuKpUckI+hNHKQYJBEDOougV6/vVVEm5c5bc
498SLWQo0+/ciQ21Zwz5SwimX8ep1YpqYirO04gcyGZzAfGboXRvdUwA+1bZvuUXdKC
4994zsCw2QALlcVpzPwjB5mqA/3a+SPgdLAiLOwWXFDRMnQw44UjsnPJFoXgEZiUpZm
500EMS5gLv50CzQqJXK9mNzPuYXNUIc4Pw4ssVWe0OfN3Od90gl5uFUwk/G9lWSYnBN
5013wIDAQAB
502-----END PUBLIC KEY-----
503)"};
504
505const vector<string> ExtensionHelper::GetPublicKeys() {
506 return public_keys;
507}
508
509} // namespace duckdb
510