1<!DOCTYPE html> 2<html lang="en" dir="ltr" data-theme="dark" data-has-sidebar class="astro-vdxcvpsm"> 3 <head> 4 <meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>VGI Documentation</title><link rel="canonical" href="https://query.farm/vgi/docs/"/><link rel="sitemap" href="/sitemap-index.xml"/>
4<script> 5 if (!/^(localhost|127\.0\.0\.1|\[::1\])$/.test(location.hostname)) { 6 window.dataLayer = window.dataLayer || []; 7 window.gtag = function gtag(){ dataLayer.push(arguments); }; 8 gtag('js', new Date()); 9 gtag('config', 'G-EZ01WJETLF'); 10 11 var gaTag = document.createElement('script'); 12 gaTag.async = true; 13 gaTag.src = 'https://www.googletagmanager.com/gtag/js?id=G-EZ01WJETLF'; 14 document.head.appendChild(gaTag); 15 } 16 </script>
16<link rel="icon" href="/favicon.ico" sizes="32x32"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v7.2.9"/><meta name="generator" content="Starlight v0.41.1"/><meta property="og:title" content="VGI Documentation"/><meta property="og:type" content="article"/><meta property="og:url" content="https://query.farm/vgi/docs/"/><meta property="og:locale" content="en"/><meta property="og:description" content="Extend DuckDB with out-of-process functions written in Python, Go, TypeScript, Rust, Java, or C#. Start with the shared Concepts, then pick your SDK."/><meta property="og:site_name" content="VGI Documentation"/><meta name="twitter:card" content="summary_large_image"/><meta name="description" content="Extend DuckDB with out-of-process functions written in Python, Go, TypeScript, Rust, Java, or C#. Start with the shared Concepts, then pick your SDK."/><meta property="og:image" content="https://query.farm/og/vgi-docs/concepts.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta name="twitter:image" content="https://query.farm/og/vgi-docs/concepts.png"/> 17 18
18<script> 19 // Seed a light default for first-time visitors, before Starlight's provider 20 // reads storage. An existing choice (including 'auto') is never overwritten. 21 (() => { 22 try { 23 const KEY = 'starlight-theme'; 24 if (!localStorage.getItem(KEY)) localStorage.setItem(KEY, 'light'); 25 } catch { 26 /* storage unavailable (private mode, embedded) â fall through to Starlight's default */ 27 } 28 })(); 29</script>
29 30 31
32<script> 33 window.StarlightThemeProvider = (() => { 34 const storedTheme = 35 typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme'); 36 const theme = 37 storedTheme || 38 (window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark'); 39 document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark'; 40 return { 41 updatePickers(theme = storedTheme || 'auto') { 42 document.querySelectorAll('starlight-theme-select').forEach((picker) => { 43 const select = picker.querySelector('select'); 44 if (select) select.value = theme; 45 /** @type {HTMLTemplateElement | null} */ 46 const tmpl = document.querySelector(`#theme-icons`); 47 const newIcon = tmpl && tmpl.content.querySelector('.' + theme); 48 if (newIcon) { 49 const oldIcon = picker.querySelector('svg.label-icon'); 50 if (oldIcon) { 51 oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes); 52 } 53 } 54 }); 55 }, 56 }; 57 })(); 58</script>
58 59 60<template id="theme-icons"> 61 <svg aria-hidden="true" class="light astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg> 62 <svg aria-hidden="true" class="dark astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg> 63 <svg aria-hidden="true" class="auto astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> 64</template> 65 <link rel="stylesheet" href="/_astro/print.ehPL0gv-.css" media="print"> 66 <link rel="stylesheet" href="/_astro/StrataSun.CKBBGMFt.css"> 67<link rel="stylesheet" href="/_astro/index.CiDEKtS1.css"> 68<style>@layer starlight.components{.card-grid:where(.astro-lmor3ela){grid-template-columns:100%;gap:1rem;display:grid}.card-grid:where(.astro-lmor3ela)>*{margin-top:0!important}@media (width>=50rem){.card-grid:where(.astro-lmor3ela){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-lmor3ela){--stagger-height:5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-lmor3ela)>:nth-child(2n){transform:translateY(var(--stagger-height))}}.sl-link-card:where(.astro-vodiqeol){border:1px solid var(--sl-color-gray-5);box-shadow:var(--sl-shadow-sm);border-radius:.5rem;grid-template-columns:1fr auto;gap:.5rem;padding:1rem;display:grid;position:relative}a:where(.astro-vodiqeol){line-height:var(--sl-line-height-headings);text-decoration:none}a:where(.astro-vodiqeol):before{content:"";position:absolute;inset:0}.stack:where(.astro-vodiqeol){flex-direction:column;gap:.5rem}.title:where(.astro-vodiqeol){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-vodiqeol){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-vodiqeol){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-vodiqeol):hover{background:var(--sl-color-gray-7,var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-vodiqeol):hover .icon:where(.astro-vodiqeol){color:var(--sl-color-white)}} 69@layer starlight.components{svg:where(.astro-n5k4ipy7){color:var(--sl-icon-color);font-size:var(--sl-icon-size,1em);width:1em;height:1em}} 70@layer starlight.components{.sl-link-button:where(.astro-hlbqph7b){font-size:var(--sl-text-sm);outline-offset:.25rem;border:1px solid #0000;border-radius:999rem;align-items:center;gap:.5em;padding:.4375rem 1.125rem;line-height:1.1875;text-decoration:none;display:inline-flex}.sl-link-button:where(.astro-hlbqph7b).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-hlbqph7b).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-hlbqph7b).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-hlbqph7b).minimal{color:var(--sl-color-white);padding-inline:0}.sl-link-button:where(.astro-hlbqph7b) svg{flex-shrink:0}@media (width>=50rem){.sl-link-button:where(.astro-hlbqph7b){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}.sl-markdown-content .sl-link-button:where(.astro-hlbqph7b){margin-inline-end:1rem}.sl-markdown-content .sl-link-button:where(.astro-hlbqph7b):not(:where(p *)){margin-block:1rem}} 71</style>
71<script type="module" src="/_astro/page.LAbJoB63.js"></script>
71<style>.docs-home-concepts:where(.astro-pzzfkzcl){border:1px solid var(--qf-accent);background:var(--qf-accent-tint-soft);color:inherit;border-radius:12px;align-items:flex-start;gap:.9rem;margin:1.75rem 0 1.25rem;padding:1.1rem 1.25rem;text-decoration:none;transition:transform .2s,box-shadow .2s;display:flex}.docs-home-concepts:where(.astro-pzzfkzcl):hover{box-shadow:0 16px 34px -26px var(--qf-shadow);transform:translateY(-2px)}.docs-home-concepts__icon:where(.astro-pzzfkzcl){width:1.6rem;height:1.6rem;color:var(--qf-accent);flex:none;margin-top:.15rem}.docs-home-concepts__body:where(.astro-pzzfkzcl){display:block}.docs-home-concepts__title:where(.astro-pzzfkzcl){font-family:var(--qf-font-display);letter-spacing:-.018em;color:var(--qf-ink);font-size:1.15rem;font-weight:600;display:block}.docs-home-concepts__blurb:where(.astro-pzzfkzcl){color:var(--qf-ink-2);margin-top:.2rem;font-size:.9rem;line-height:1.5;display:block}.docs-home-grid:where(.astro-pzzfkzcl){grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.6rem;margin:0 0 1.5rem;padding:0;list-style:none;display:grid}.docs-home-card:where(.astro-pzzfkzcl){border:1px solid var(--qf-rule);background:var(--qf-surface);height:100%;color:inherit;border-radius:10px;align-items:center;gap:.6rem;padding:.7rem .9rem;text-decoration:none;transition:border-color .2s,transform .2s,box-shadow .2s;display:flex}.docs-home-card:where(.astro-pzzfkzcl):hover{border-color:var(--qf-accent);box-shadow:0 16px 34px -26px var(--qf-shadow);transform:translateY(-2px)}.docs-home-card__icon:where(.astro-pzzfkzcl){width:1.3rem;height:1.3rem;color:var(--qf-ink-2);flex:none}.docs-home-card:where(.astro-pzzfkzcl):hover .docs-home-card__icon:where(.astro-pzzfkzcl){color:var(--qf-accent)}.docs-home-card__title:where(.astro-pzzfkzcl){font-family:var(--qf-font-display);letter-spacing:-.018em;color:var(--qf-ink);font-size:1.02rem;font-weight:600} 72</style></head> 73 <body class="astro-vdxcvpsm"> 74 <a href="#_top" class="astro-vxeigawq">Skip to content</a> 75 <div class="page sl-flex astro-gqpr5s5a"> 76 <header class="header astro-gqpr5s5a"><div class="qf-docs-nav astro-ktgj4fl6" data-pagefind-ignore> 77 <div class="section-container qf-docs-nav__inner astro-ktgj4fl6"> 78 <a class="qf-lock astro-ktgj4fl6" href="/" aria-label="Query.Farm home"> 79 <svg class="qf-mark qf-mark--settle astro-ktgj4fl6 astro-25oqwejs" viewBox="0 0 64 64" width="30" height="30" style="width:30px;height:30px" aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg"> 80 <rect class="qf-band qf-band-1 astro-25oqwejs" x="0" y="0" width="64" height="16" fill="#f0c877"></rect><rect class="qf-band qf-band-2 astro-25oqwejs" x="0" y="16" width="64" height="16" fill="#d9a441"></rect><rect class="qf-band qf-band-3 astro-25oqwejs" x="0" y="32" width="64" height="16" fill="#a9762e"></rect><rect class="qf-band qf-band-4 astro-25oqwejs" x="0" y="48" width="64" height="16" fill="#7a5230"></rect> 81</svg> 82 <span class="qf-wordmark-text astro-ktgj4fl6">Query<span class="dot astro-ktgj4fl6">.</span>Farm</span> 83 </a> 84 85 <nav class="qf-links astro-ktgj4fl6" aria-label="Site"> 86 <div class="qf-link-wrap astro-ktgj4fl6"> 87 <a href="/products" aria-current="page" class="astro-ktgj4fl6"> 88 Products 89 </a> 90 <div class="qf-panel-anchor astro-ktgj4fl6"> 91 <div class="qf-panel astro-ktgj4fl6"> 92 <p class="qf-panel__label astro-ktgj4fl6">The data farm</p> 93 <ul class="qf-panel__grid astro-ktgj4fl6"> 94 <li class="astro-ktgj4fl6"> 95 <a class="qf-panel__item astro-ktgj4fl6" href="/products/extensions"> 96 <span class="qf-panel__icon astro-ktgj4fl6"> 97 <img src="/images/duckdb-icon.svg" alt="" width="16" height="16" class="astro-ktgj4fl6"> 98 99 </span> 100 <span class="qf-panel__text astro-ktgj4fl6"> 101 <span class="qf-panel__name astro-ktgj4fl6"> 102 Extensions 103 104 </span>
105 <span class="qf-panel__outcome astro-ktgj4fl6">Connect systems and add SQL capabilities.</span> 106 </span> 107 </a> 108 </li><li class="astro-ktgj4fl6"> 109 <a class="qf-panel__item astro-ktgj4fl6" href="/products/orchard"> 110 <span class="qf-panel__icon astro-ktgj4fl6"> 111 112 <span aria-hidden="true" class="astro-ktgj4fl6">ð³</span> 113 </span> 114 <span class="qf-panel__text astro-ktgj4fl6"> 115 <span class="qf-panel__name astro-ktgj4fl6"> 116 Orchard 117 <span class="qf-panel__pill qf-panel__pill--preview astro-ktgj4fl6"> 118 Preview 119 </span> 120 </span> 121 <span class="qf-panel__outcome astro-ktgj4fl6">Discover, subscribe to, and reuse connectors.</span> 122 </span> 123 </a> 124 </li><li class="astro-ktgj4fl6"> 125 <a class="qf-panel__item astro-ktgj4fl6" href="/vgi"> 126 <span class="qf-panel__icon astro-ktgj4fl6"> 127 <img src="/vgi/vgi-logo.png" alt="" width="16" height="16" class="astro-ktgj4fl6"> 128 129 </span> 130 <span class="qf-panel__text astro-ktgj4fl6"> 131 <span class="qf-panel__name astro-ktgj4fl6"> 132 VGI 133 134 </span> 135 <span class="qf-panel__outcome astro-ktgj4fl6">Run custom or reusable workers from SQL.</span> 136 </span> 137 </a> 138 </li><li class="astro-ktgj4fl6"> 139 <a class="qf-panel__item astro-ktgj4fl6" href="/products/rowfence"> 140 <span class="qf-panel__icon astro-ktgj4fl6"> 141 <img src="/rowfence/rowfence-icon.svg" alt="" width="16" height="16" class="astro-ktgj4fl6"> 142 143 </span> 144 <span class="qf-panel__text astro-ktgj4fl6"> 145 <span class="qf-panel__name astro-ktgj4fl6"> 146 Rowfence 147 <span class="qf-panel__pill qf-panel__pill--preview astro-ktgj4fl6"> 148 Preview 149 </span> 150 </span> 151 <span class="qf-panel__outcome astro-ktgj4fl6">Enforce row, column, and function access.</span> 152 </span> 153 </a> 154 </li><li class="astro-ktgj4fl6"> 155 <a class="qf-panel__item astro-ktgj4fl6" href="/products/haybarn"> 156 <span class="qf-panel__icon astro-ktgj4fl6"> 157 <img src="/products/haybarn/haybarn-mark.svg" alt="" width="16" height="16" class="astro-ktgj4fl6"> 158 159 </span> 160 <span class="qf-panel__text astro-ktgj4fl6"> 161 <span class="qf-panel__name astro-ktgj4fl6"> 162 Haybarn 163 164 </span> 165 <span class="qf-panel__outcome astro-ktgj4fl6">Bring DuckDB into the enterprise.</span> 166 </span> 167 </a> 168 </li><li class="astro-ktgj4fl6"> 169 <a class="qf-panel__item astro-ktgj4fl6" href="/products/cupola"> 170 <span class="qf-panel__icon astro-ktgj4fl6"> 171 <img src="/cupola/cupola-mark.svg" alt="" width="16" height="16" class="astro-ktgj4fl6"> 172 173 </span>
174 <span class="qf-panel__text astro-ktgj4fl6"> 175 <span class="qf-panel__name astro-ktgj4fl6"> 176 Cupola 177 178 </span> 179 <span class="qf-panel__outcome astro-ktgj4fl6">Browse and query workers in the browser.</span> 180 </span> 181 </a> 182 </li> 183 </ul> 184 <a class="qf-panel__more astro-ktgj4fl6" href="/products">See how it all fits together â</a> 185 </div> 186 </div> 187 </div><div class="qf-link-wrap astro-ktgj4fl6"> 188 <a href="/consulting" class="astro-ktgj4fl6"> 189 Consulting 190 </a> 191 192 </div><div class="qf-link-wrap astro-ktgj4fl6"> 193 <a href="/blog" class="astro-ktgj4fl6"> 194 Blog 195 </a> 196 197 </div> 198 </nav> 199 200 <div class="qf-nav-right astro-ktgj4fl6"> 201 <!-- Trigger --> 202<button id="site-search-open" type="button" aria-label="Search Query Farm" aria-controls="site-search-modal" aria-expanded="false" class="inline-flex items-center gap-2 rounded-lg border border-soil-300 bg-white/70 px-3 py-1.5 text-sm text-soil-600 transition-colors hover:border-sun-400 hover:text-soil-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-link"> 203 <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"> 204 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-4.35-4.35M11 18a7 7 0 100-14 7 7 0 000 14z"></path> 205 </svg> 206 <span class="hidden sm:inline">Search</span> 207 <kbd class="hidden md:inline rounded border border-soil-300 bg-soil-50 px-1.5 text-[11px] font-mono text-soil-500">âK</kbd> 208</button> 209 210<!-- Modal --> 211<div id="site-search-modal" class="fixed inset-0 z-[100] hidden" role="dialog" aria-modal="true" aria-labelledby="site-search-title" tabindex="-1"> 212 <div data-search-close class="absolute inset-0 bg-soil-900/40 backdrop-blur-sm"></div> 213 <div class="relative mx-auto mt-[10vh] w-[92%] max-w-2xl overflow-hidden rounded-2xl border border-soil-300 bg-[#fffdf7] shadow-2xl"> 214 <div class="flex items-center gap-3 border-b border-soil-200 px-4"> 215 <svg class="w-5 h-5 text-soil-400 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"> 216 <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-4.35-4.35M11 18a7 7 0 100-14 7 7 0 000 14z"></path> 217 </svg> 218 <input id="site-search-input" type="search" autocomplete="off" placeholder="Search extensions, functions, docsâ¦" class="flex-1 bg-transparent py-4 text-base text-soil-900 placeholder-soil-400 focus:outline-none" aria-label="Search the site"> 219 <button data-search-close type="button" aria-label="Close search" class="rounded p-1 text-soil-400 hover:text-soil-700"> 220 <kbd class="rounded border border-soil-300 bg-soil-50 px-1.5 py-0.5 text-[11px] font-mono">Esc</kbd> 221 </button> 222 </div> 223 <div id="site-search-results" class="max-h-[55vh] overflow-y-auto p-2"></div> 224 <p id="site-search-title" class="sr-only">Search Query.Farm</p> 225 <p id="site-search-status" class="px-4 py-6 text-center text-sm text-soil-500" role="status" aria-live="polite"></p> 226 <div class="flex items-center gap-2 border-t border-soil-200 bg-soil-50 px-4 py-2.5 text-xs text-soil-600"> 227 <label class="inline-flex items-center gap-2 cursor-pointer select-none"> 228 <input id="site-search-functions" type="checkbox" class="h-3.5 w-3.5 rounded border-soil-400 text-field-700 focus:ring-link"> 229 <span>Also search function names</span> 230 </label> 231 </div> 232 </div> 233</div> 234
235<script> 236 (function () { 237 const openBtn = document.getElementById('site-search-open'); 238 const modal = document.getElementById('site-search-modal'); 239 const input = document.getElementById('site-search-input'); 240 const resultsEl = document.getElementById('site-search-results'); 241 const statusEl = document.getElementById('site-search-status'); 242 const fnToggle = document.getElementById('site-search-functions'); 243 if (!openBtn || !modal || !input || !resultsEl || !statusEl) return; 244 245 const esc = (s) => String(s ?? '').replace(/[&<>"]/g, (c) => 246 ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c])); 247 248 let pf = null; // null=not loaded, 'none'=unavailable 249 async function ensurePagefind() { 250 if (pf) return pf; 251 try { 252 const mod = await import('/pagefind/pagefind.js'); 253 await mod.init(); 254 pf = mod; 255 } catch (e) { 256 pf = 'none'; 257 } 258 return pf; 259 } 260 261 function setStatus(msg) { 262 statusEl.textContent = msg || ''; 263 statusEl.hidden = !msg; 264 } 265 266 function openModal() { 267 document.getElementById('haybarn-search')?.close(); 268 modal.classList.remove('hidden'); 269 openBtn.setAttribute('aria-expanded', 'true'); 270 document.documentElement.style.overflow = 'hidden'; 271 input.focus(); 272 ensurePagefind().then((p) => { 273 if (p === 'none') setStatus('Search is available on the published site.'); 274 else if (!input.value) setStatus('Type to search the docs and extensions.'); 275 }); 276 } 277 function closeModal() { 278 modal.classList.add('hidden'); 279 openBtn.setAttribute('aria-expanded', 'false'); 280 document.documentElement.style.overflow = ''; 281 openBtn.focus(); 282 } 283 284 openBtn.addEventListener('click', openModal); 285 modal.querySelectorAll('[data-search-close]').forEach((el) => el.addEventListener('click', closeModal)); 286 document.addEventListener('keydown', (e) => { 287 if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k' && !document.getElementById('haybarn-search')) { e.preventDefault(); openModal(); } 288 else if (e.key === 'Escape' && !modal.classList.contains('hidden')) closeModal(); 289 else if (e.key === 'Tab' && !modal.classList.contains('hidden')) { 290 const focusable = Array.from(modal.querySelectorAll('button, input, a[href]')) 291 .filter((el) => !el.hasAttribute('disabled')); 292 const first = focusable[0]; 293 const last = focusable[focusable.length - 1]; 294 if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last?.focus(); } 295 else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first?.focus(); } 296 } 297 }); 298 299 let timer; 300 input.addEventListener('input', () => { 301 clearTimeout(timer); 302 timer = setTimeout(runSearch, 140); 303 }); 304 // Re-run immediately when the "function names" toggle flips. 305 fnToggle?.addEventListener('change', runSearch); 306 307 async function runSearch() { 308 const q = input.value.trim(); 309 if (!q) { resultsEl.innerHTML = ''; setStatus('Type to search the docs and extensions.'); return; } 310 const p = await ensurePagefind(); 311 if (p === 'none') { resultsEl.innerHTML = ''; setStatus('Search is available on the published site.'); return; } 312 // Default to pages only (extensions, docs); include the 700+ function 313 // records only when the user opts in. 314 const opts = { filters: { kind: fnToggle && fnToggle.checked ? { any: ['page', 'function'] } : 'page' } }; 315 const search = await p.search(q, opts); 316 const top = await Promise.all(search.results.slice(0, 8).map((r) => r.data())); 317 if (!top.length) { resultsEl.innerHTML = ''; setStatus(`No results for â${esc(q)}â.`); return; } 318 setStatus(''); 319 resultsEl.innerHTML = top.map((d) => { 320 const title = esc((d.meta && d.meta.title) || d.url); 321 const tag = d.meta && d.meta.extension 322 ? `<span class="ml-2 shrink-0 rounded-full border border-sun-400/60 bg-sun-400/10 px-2 py-0.5 text-[11px] font-medium text-sun-700">${esc(d.meta.extension)}</span>` 323 : ''; 324 return `<a href="${esc(d.url)}" class="block rounded-lg px-3 py-2 transition-colors hover:bg-soil-100"> 325 <div class="flex items-center justify-between gap-2">
326 <span class="font-semibold text-soil-900 truncate">${title}</span>${tag} 327 </div> 328 <p class="mt-0.5 text-sm text-soil-700 line-clamp-2 [&_mark]:bg-sun-200 [&_mark]:text-soil-900 [&_mark]:rounded">${d.excerpt || ''}</p> 329 </a>`; 330 }).join(''); 331 } 332 })(); 333</script>
333 334 <starlight-theme-select> 335 336 <label style="--sl-select-width: 6.25em" class="astro-r2p65idu"> 337 <span class="sr-only astro-r2p65idu">Select theme</span> 338 <svg aria-hidden="true" class="icon label-icon astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> 339 <select autocomplete="off" class="astro-r2p65idu"> 340 <option value="dark" class="astro-r2p65idu">Dark</option><option value="light" class="astro-r2p65idu">Light</option><option value="auto" selected class="astro-r2p65idu">Auto</option> 341 </select> 342 <svg aria-hidden="true" class="icon caret astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> 343</label> 344</starlight-theme-select> 345 346
347<script> 348 StarlightThemeProvider.updatePickers(); 349</script>
349 350
351<script type="module">var e=`starlight-theme`,t=e=>e===`auto`||e===`dark`||e===`light`?e:`auto`,n=()=>t(typeof localStorage<`u`&&localStorage.getItem(e));function r(t){typeof localStorage<`u`&&localStorage.setItem(e,t===`light`||t===`dark`?t:``)}var i=()=>matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;function a(e){StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e===`auto`?i():e,r(e)}matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,()=>{n()===`auto`&&a(`auto`)});var o=class extends HTMLElement{constructor(){super(),a(n()),this.querySelector(`select`)?.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&a(t(e.currentTarget.value))})}};customElements.define(`starlight-theme-select`,o);</script>
351 352 <a class="qf-cta astro-ktgj4fl6" href="/company/schedule">Talk with Us</a> 353 </div> 354 </div> 355</div> 356 357<div class="vgi-docs-subnav astro-wsdyau2x" data-pagefind-ignore> 358 <div class="section-container vgi-docs-subnav__inner astro-wsdyau2x"> 359 <nav class="vgi-docs-subnav__bar astro-wsdyau2x" aria-label="Breadcrumb"> 360 <a href="/vgi/docs/" class="brand astro-wsdyau2x" aria-current="page"> 361 <img src="/vgi/vgi-logo.png" alt="" width="30" height="30" class="astro-wsdyau2x"> 362 <span class="astro-wsdyau2x">VGI Docs</span> 363 </a> 364 365 </nav> 366 367 <a href="https://github.com/Query-farm/vgi" target="_blank" rel="noopener noreferrer" aria-label="VGI on GitHub" title="View source on GitHub" class="gh astro-wsdyau2x"> 368 <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" class="astro-wsdyau2x"> 369 <path d="M12 .5C5.73.5.66 5.57.66 11.85c0 5.02 3.26 9.28 7.78 10.78.57.1.78-.25.78-.55v-2.1c-3.17.69-3.84-1.36-3.84-1.36-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.67 1.25 3.32.95.1-.74.4-1.25.72-1.54-2.53-.29-5.19-1.27-5.19-5.64 0-1.25.45-2.27 1.18-3.07-.12-.29-.51-1.45.11-3.02 0 0 .96-.31 3.15 1.17a10.9 10.9 0 0 1 2.87-.39c.97 0 1.95.13 2.87.39 2.18-1.48 3.14-1.17 3.14-1.17.63 1.57.24 2.73.12 3.02.74.8 1.18 1.82 1.18 3.07 0 4.38-2.67 5.35-5.21 5.63.41.36.78 1.07.78 2.15v3.19c0 .31.21.66.79.55 4.51-1.5 7.77-5.76 7.77-10.78C23.34 5.57 18.27.5 12 .5z" class="astro-wsdyau2x"></path> 370 </svg> 371 </a> 372 </div> 373</div></header> 374 <nav class="sidebar print:hidden astro-gqpr5s5a" aria-label="Main"> 375 <starlight-menu-button class="print:hidden astro-vvx7mffu"> 376 <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-vvx7mffu"> 377 <svg aria-hidden="true" class="open-menu astro-vvx7mffu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> 378 <svg aria-hidden="true" class="close-menu astro-vvx7mffu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="m13.41 12 6.3-6.29a1.004 1.004 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1.004 1.004 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 0 1.42.998.998 0 0 0 1.42 0l6.29-6.3 6.29 6.3a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.42L13.41 12Z"/></svg> 379 </button> 380</starlight-menu-button> 381
382<script type="module">var e=class extends HTMLElement{btn=this.querySelector(`button`);constructor(){super(),this.btn.addEventListener(`click`,()=>this.toggleExpanded());let e=this.closest(`nav`);e&&e.addEventListener(`keyup`,e=>this.closeOnEscape(e))}setExpanded(e){this.setAttribute(`aria-expanded`,String(e)),document.body.toggleAttribute(`data-mobile-menu-expanded`,e)}toggleExpanded(){this.setExpanded(this.getAttribute(`aria-expanded`)!==`true`)}closeOnEscape(e){e.code===`Escape`&&(this.setExpanded(!1),this.btn.focus())}};customElements.define(`starlight-menu-button`,e);</script>
382 383 <div id="starlight__sidebar" class="sidebar-pane astro-gqpr5s5a"> 384 <div class="sidebar-content sl-flex astro-gqpr5s5a"> 385 <nav class="vgi-lang-switch" aria-label="SDK language"> 386 <a class="vgi-lang-switch__home" href="/vgi/docs/"> 387 <svg width="1em" height="1em" viewBox="0 0 256 256" data-icon="ph:books-bold"> 388 389 390 <symbol id="ai:ph:books-bold"><path fill="currentColor" d="m235.57 193.73l-33.19-157.8a20 20 0 0 0-23.76-15.48l-46.81 10.06a19.82 19.82 0 0 0-11 6.65A20 20 0 0 0 104 28H56a20 20 0 0 0-20 20v160a20 20 0 0 0 20 20h48a20 20 0 0 0 20-20V90.25l25.62 121.82A20 20 0 0 0 169.15 228a20.3 20.3 0 0 0 4.23-.45l46.81-10.06a20.1 20.1 0 0 0 15.38-23.76M148.19 88.65l39-8.38l2.53 12l-39 8.38Zm7.46 35.5l39-8.38l9.16 43.58l-39 8.38Zm24.06-79.39l2.53 12l-39 8.38l-2.53-12ZM60 88h40v80H60Zm40-36v12H60V52ZM60 204v-12h40v12Zm112.29-.76l-2.53-12l39-8.38l2.53 12Z"/></symbol><use href="#ai:ph:books-bold"></use> 391 392</svg> 393 <span>All VGI documentation</span> 394 </a> 395 <ul class="vgi-lang-switch__grid"> 396 <li> 397 <a href="/vgi/docs/csharp/" class="vgi-lang-chip"> 398 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:csharp"> 399 400 401 <use href="#ai:simple-icons:csharp"></use> 402 403</svg> 404 <span>C#</span> 405 </a> 406 </li><li> 407 <a href="/vgi/docs/go/" class="vgi-lang-chip"> 408 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:go"> 409 410 411 <use href="#ai:simple-icons:go"></use> 412 413</svg> 414 <span>Go</span> 415 </a> 416 </li><li> 417 <a href="/vgi/docs/java/" class="vgi-lang-chip"> 418 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:openjdk"> 419 420 421 <use href="#ai:simple-icons:openjdk"></use> 422 423</svg> 424 <span>Java</span> 425 </a> 426 </li><li> 427 <a href="/vgi/docs/python/" class="vgi-lang-chip"> 428 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:python"> 429 430 431 <use href="#ai:simple-icons:python"></use> 432 433</svg> 434 <span>Python</span> 435 </a> 436 </li><li> 437 <a href="/vgi/docs/rust/" class="vgi-lang-chip"> 438 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:rust"> 439 440 441 <use href="#ai:simple-icons:rust"></use> 442 443</svg> 444 <span>Rust</span> 445 </a> 446 </li><li> 447 <a href="/vgi/docs/typescript/" class="vgi-lang-chip"> 448 <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="simple-icons:typescript"> 449 450 451 <use href="#ai:simple-icons:typescript"></use> 452 453</svg> 454 <span>TypeScript</span> 455 </a> 456 </li> 457 </ul> 458</nav> 459 460<sl-sidebar-state-persist data-hash="0g4lojx" class="astro-f5yvicm7"> 461
461<script aria-hidden="true"> 462 (() => { 463 try { 464 if (!matchMedia('(min-width: 50em)').matches) return; 465 /** @type {HTMLElement | null} */ 466 const target = document.querySelector('sl-sidebar-state-persist'); 467 const state = JSON.parse(sessionStorage.getItem('sl-sidebar-state') || '0'); 468 if (!target || !state || target.dataset.hash !== state.hash) return; 469 window._starlightScrollRestore = state.scroll; 470 customElements.define( 471 'sl-sidebar-restore', 472 class SidebarRestore extends HTMLElement { 473 connectedCallback() { 474 try { 475 const idx = parseInt(this.dataset.index || ''); 476 const details = this.closest('details'); 477 if (details && typeof state.open[idx] === 'boolean') details.open = state.open[idx]; 478 } catch {} 479 } 480 } 481 ); 482 } catch {} 483 })(); 484 </script>
484 485 <ul class="top-level astro-ojxuodky"> 486 <li class="astro-ojxuodky"> 487 <details open class="astro-ojxuodky"> 488 <summary class="astro-ojxuodky"> 489 <span class="group-label astro-ojxuodky"> 490 <span class="large astro-ojxuodky">Concepts</span> 491 492 </span> 493 <svg aria-hidden="true" class="caret astro-ojxuodky astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> 494 </summary> 495 <sl-sidebar-restore data-index="0"></sl-sidebar-restore> 496 <ul class="astro-ojxuodky"> 497 <li class="astro-ojxuodky"> 498 <a href="/vgi/docs/concepts/" class="astro-ojxuodky"> 499 <span class="astro-ojxuodky">Overview</span> 500 501 </a> 502 </li><li class="astro-ojxuodky"> 503 <a href="/vgi/docs/concepts/lifecycle/" class="astro-ojxuodky"> 504 <span class="astro-ojxuodky">Function lifecycle</span> 505 506 </a> 507 </li><li class="astro-ojxuodky"> 508 <a href="/vgi/docs/concepts/argument-serialization/" class="astro-ojxuodky"> 509 <span class="astro-ojxuodky">Argument serialization</span> 510 511 </a> 512 </li> 513</ul> 514 </details> 515 </li> 516</ul> 517 518 519
519<script aria-hidden="true"> 520 (() => { 521 const scroller = document.getElementById('starlight__sidebar'); 522 if (!window._starlightScrollRestore || !scroller) return; 523 scroller.scrollTop = window._starlightScrollRestore; 524 delete window._starlightScrollRestore; 525 })(); 526 </script>
526</sl-sidebar-state-persist> 527 528<div class="md:sl-hidden"> 529 <div class="mobile-preferences sl-flex astro-b5gddk54"> 530 <div class="social-icons astro-b5gddk54"> 531 532 </div> 533 <starlight-theme-select> 534 535 <label style="--sl-select-width: 6.25em" class="astro-r2p65idu"> 536 <span class="sr-only astro-r2p65idu">Select theme</span> 537 <svg aria-hidden="true" class="icon label-icon astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> 538 <select autocomplete="off" class="astro-r2p65idu"> 539 <option value="dark" class="astro-r2p65idu">Dark</option><option value="light" class="astro-r2p65idu">Light</option><option value="auto" selected class="astro-r2p65idu">Auto</option> 540 </select> 541 <svg aria-hidden="true" class="icon caret astro-r2p65idu astro-n5k4ipy7" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> 542</label> 543</starlight-theme-select> 544 545
546<script> 547 StarlightThemeProvider.updatePickers(); 548</script>
548 549 550 551 552
553<script type="module">var e=class extends HTMLElement{constructor(){super();let e=this.querySelector(`select`);e&&(e.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=e.currentTarget.value)}),window.addEventListener(`pageshow`,t=>{if(!t.persisted)return;let n=e.querySelector(`option[selected]`)?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}};customElements.define(`starlight-lang-select`,e);</script>
553 554</div> 555</div> 556 </div> 557 </div> 558 </nav> 559 <div class="main-frame astro-gqpr5s5a"> 560 561
561<script type="module">var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}),addEventListener(`pageHide`,a);</script>
561<div class="lg:sl-flex astro-abfeecmu"> 562 563 <div class="main-pane astro-abfeecmu"> 564 565 <main data-pagefind-body class="astro-vdxcvpsm" lang="en" dir="ltr"> 566 567 568 569 <div class="content-panel astro-oil7k7jf"> 570 <div class="sl-container astro-oil7k7jf"> 571 <h1 id="_top" class="astro-2sm4b3ln">VGI Documentation</h1> 572 </div> 573</div> 574 <div class="content-panel astro-oil7k7jf"> 575 <div class="sl-container astro-oil7k7jf"> 576 <div class="sl-markdown-content"> 577 <p><strong>VGI</strong> â the Vector Gateway Interface â lets you add functions, tables and catalogs to DuckDB from an 578ordinary separate program, in whatever language you like. No native extension to compile, no DuckDB 579release cadence to wait on. Data crosses the boundary as Apache Arrow record batches.</p> 580<p>Every SDK implements the same protocol, so the <strong>Concepts</strong> pages are written once and shared. Read 581them first if you want the model before the syntax; otherwise jump straight into a language.</p> 582<a class="docs-home-concepts astro-pzzfkzcl" href="/vgi/docs/concepts/"> 583 <svg width="1em" height="1em" viewBox="0 0 256 256" class="docs-home-concepts__icon astro-pzzfkzcl" data-icon="ph:compass-bold"> 584 585 586 <symbol id="ai:ph:compass-bold"><path fill="currentColor" d="M128 20a108 108 0 1 0 108 108A108.12 108.12 0 0 0 128 20m0 192a84 84 0 1 1 84-84a84.09 84.09 0 0 1-84 84m35.27-135l-56 24a12 12 0 0 0-6.3 6.3l-24 56A12 12 0 0 0 92.73 179l56-24a12 12 0 0 0 6.3-6.3l24-56A12 12 0 0 0 163.27 77m-28.41 57.89l-24 10.29l10.29-24l24-10.29Z"/></symbol><use href="#ai:ph:compass-bold"></use> 587 588</svg> 589 <span class="docs-home-concepts__body astro-pzzfkzcl"> 590 <span class="docs-home-concepts__title astro-pzzfkzcl">Concepts</span> 591 <span class="docs-home-concepts__blurb astro-pzzfkzcl">The protocol, the worker model, and the five function shapes â whichever SDK you use.</span> 592 </span> 593</a> 594 595<ul class="docs-home-grid astro-pzzfkzcl"> 596 <li class="astro-pzzfkzcl"> 597 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/csharp/"> 598 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:csharp"> 599 600 601 <symbol id="ai:simple-icons:csharp"><path fill="currentColor" d="M1.194 7.543v8.913c0 1.103.588 2.122 1.544 2.674l7.718 4.456a3.09 3.09 0 0 0 3.088 0l7.718-4.456a3.09 3.09 0 0 0 1.544-2.674V7.543a3.08 3.08 0 0 0-1.544-2.673L13.544.414a3.09 3.09 0 0 0-3.088 0L2.738 4.87a3.09 3.09 0 0 0-1.544 2.673m5.403 2.914v3.087a.77.77 0 0 0 .772.772a.773.773 0 0 0 .772-.772a.773.773 0 0 1 1.317-.546a.78.78 0 0 1 .226.546a2.314 2.314 0 1 1-4.631 0v-3.087c0-.615.244-1.203.679-1.637a2.31 2.31 0 0 1 3.274 0c.434.434.678 1.023.678 1.637a.77.77 0 0 1-.226.545a.767.767 0 0 1-1.091 0a.77.77 0 0 1-.226-.545a.77.77 0 0 0-.772-.772a.77.77 0 0 0-.772.772m12.35 3.087a.77.77 0 0 1-.772.772h-.772v.772a.773.773 0 0 1-1.544 0v-.772h-1.544v.772a.773.773 0 0 1-1.317.546a.78.78 0 0 1-.226-.546v-.772H12a.771.771 0 1 1 0-1.544h.772v-1.543H12a.77.77 0 1 1 0-1.544h.772v-.772a.773.773 0 0 1 1.317-.546a.78.78 0 0 1 .226.546v.772h1.544v-.772a.773.773 0 0 1 1.544 0v.772h.772a.772.772 0 0 1 0 1.544h-.772v1.543h.772a.776.776 0 0 1 .772.772m-3.088-2.315h-1.544v1.543h1.544z"/></symbol><use href="#ai:simple-icons:csharp"></use> 602 603</svg> 604 <span class="docs-home-card__title astro-pzzfkzcl">C#</span> 605 </a> 606 </li><li class="astro-pzzfkzcl"> 607 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/go/"> 608 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:go"> 609 610 611 <symbol id="ai:simple-icons:go"><path fill="currentColor" d="M1.811 10.231c-.047 0-.058-.023-.035-.059l.246-.315c.023-.035.081-.058.128-.058h4.172c.046 0 .058.035.035.07l-.199.303c-.023.036-.082.07-.117.07zM.047 11.306c-.047 0-.059-.023-.035-.058l.245-.316c.023-.035.082-.058.129-.058h5.328c.047 0 .07.035.058.07l-.093.28c-.012.047-.058.07-.105.07zm2.828 1.075c-.047 0-.059-.035-.035-.07l.163-.292c.023-.035.07-.07.117-.07h2.337c.047 0 .07.035.07.082l-.023.28c0 .047-.047.082-.082.082zm12.129-2.36c-.736.187-1.239.327-1.963.514c-.176.046-.187.058-.34-.117c-.174-.199-.303-.327-.548-.444c-.737-.362-1.45-.257-2.115.175c-.795.514-1.204 1.274-1.192 2.22c.011.935.654 1.706 1.577 1.835c.795.105 1.46-.175 1.987-.77c.105-.13.198-.27.315-.434H10.47c-.245 0-.304-.152-.222-.35c.152-.362.432-.97.596-1.274a.32.32 0 0 1 .292-.187h4.253c-.023.316-.023.631-.07.947a5 5 0 0 1-.958 2.29c-.841 1.11-1.94 1.8-3.33 1.986c-1.145.152-2.209-.07-3.143-.77c-.865-.655-1.356-1.52-1.484-2.595c-.152-1.274.222-2.419.993-3.424c.83-1.086 1.928-1.776 3.272-2.02c1.098-.2 2.15-.07 3.096.571c.62.41 1.063.97 1.356 1.648c.07.105.023.164-.117.2m3.868 6.461c-1.064-.024-2.034-.328-2.852-1.029a3.67 3.67 0 0 1-1.262-2.255c-.21-1.32.152-2.489.947-3.529c.853-1.122 1.881-1.706 3.272-1.95c1.192-.21 2.314-.095 3.33.595c.923.63 1.496 1.484 1.648 2.605c.198 1.578-.257 2.863-1.344 3.962c-.771.783-1.718 1.273-2.805 1.495c-.315.06-.63.07-.934.106m2.78-4.72c-.011-.153-.011-.27-.034-.387c-.21-1.157-1.274-1.81-2.384-1.554c-1.087.245-1.788.935-2.045 2.033c-.21.912.234 1.835 1.075 2.21c.643.28 1.285.244 1.905-.07c.923-.48 1.425-1.228 1.484-2.233z"/></symbol><use href="#ai:simple-icons:go"></use> 612 613</svg>
614 <span class="docs-home-card__title astro-pzzfkzcl">Go</span> 615 </a> 616 </li><li class="astro-pzzfkzcl"> 617 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/java/"> 618 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:openjdk"> 619 620 621 <symbol id="ai:simple-icons:openjdk"><path fill="currentColor" d="M11.915 0L11.7.215C9.515 2.4 7.47 6.39 6.046 10.483c-1.064 1.024-3.633 2.81-3.711 3.551c-.093.87 1.746 2.611 1.55 3.235c-.198.625-1.304 1.408-1.014 1.939c.1.188.823.011 1.277-.491a13.4 13.4 0 0 0-.017 2.14c.076.906.27 1.668.643 2.232c.372.563.956.911 1.667.911c.397 0 .727-.114 1.024-.264c.298-.149.571-.33.91-.5c.68-.34 1.634-.666 3.53-.604c1.903.062 2.872.39 3.559.704s1.15.664 1.925.664c.767 0 1.395-.336 1.807-.9c.412-.563.631-1.33.72-2.24c.06-.623.055-1.32 0-2.066c.454.45 1.117.604 1.213.424c.29-.53-.816-1.314-1.013-1.937c-.198-.624 1.642-2.366 1.549-3.236c-.08-.748-2.707-2.568-3.748-3.586C16.428 6.374 14.308 2.394 12.13.215zm.175 6.038a2.95 2.95 0 0 1 2.943 2.942a2.95 2.95 0 0 1-2.943 2.943A2.95 2.95 0 0 1 9.148 8.98a2.95 2.95 0 0 1 2.942-2.942M8.685 7.983a3.5 3.5 0 0 0-.145.997c0 1.951 1.6 3.55 3.55 3.55s3.55-1.598 3.55-3.55q-.002-.495-.132-.951q.502.143.915.336a43 43 0 0 1 2.042 5.829c.678 2.545 1.01 4.92.846 6.607c-.082.844-.29 1.51-.606 1.94c-.315.431-.713.651-1.315.651c-.593 0-.932-.27-1.673-.61c-.741-.338-1.825-.694-3.792-.758c-1.974-.064-3.073.293-3.821.669c-.375.188-.659.373-.911.5s-.466.2-.752.2c-.53 0-.876-.209-1.16-.64c-.285-.43-.474-1.101-.545-1.948c-.141-1.693.176-4.069.823-6.614a43 43 0 0 1 1.934-5.783c.348-.167.749-.31 1.192-.425m-3.382 4.362a.2.2 0 0 1 .13.031c-.166.56-.323 1.116-.463 1.665a34 34 0 0 0-.547 2.555a4 4 0 0 0-.2-.39c-.58-1.012-.914-1.642-1.16-2.08c.315-.24 1.679-1.755 2.24-1.781m13.394.01c.562.027 1.926 1.543 2.24 1.783c-.246.438-.58 1.068-1.16 2.08a4 4 0 0 0-.163.309a32 32 0 0 0-.562-2.49a41 41 0 0 0-.482-1.652a.2.2 0 0 1 .127-.03"/></symbol><use href="#ai:simple-icons:openjdk"></use> 622 623</svg> 624 <span class="docs-home-card__title astro-pzzfkzcl">Java</span> 625 </a> 626 </li><li class="astro-pzzfkzcl"> 627 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/python/"> 628 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:python"> 629 630 631 <symbol id="ai:simple-icons:python"><path fill="currentColor" d="m14.25.18l.9.2l.73.26l.59.3l.45.32l.34.34l.25.34l.16.33l.1.3l.04.26l.02.2l-.01.13V8.5l-.05.63l-.13.55l-.21.46l-.26.38l-.3.31l-.33.25l-.35.19l-.35.14l-.33.1l-.3.07l-.26.04l-.21.02H8.77l-.69.05l-.59.14l-.5.22l-.41.27l-.33.32l-.27.35l-.2.36l-.15.37l-.1.35l-.07.32l-.04.27l-.02.21v3.06H3.17l-.21-.03l-.28-.07l-.32-.12l-.35-.18l-.36-.26l-.36-.36l-.35-.46l-.32-.59l-.28-.73l-.21-.88l-.14-1.05l-.05-1.23l.06-1.22l.16-1.04l.24-.87l.32-.71l.36-.57l.4-.44l.42-.33l.42-.24l.4-.16l.36-.1l.32-.05l.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75l-.02-.37l.05-.34l.11-.31l.17-.28l.25-.26l.31-.23l.38-.2l.44-.18l.51-.15l.58-.12l.64-.1l.71-.06l.77-.04l.84-.02l1.27.05zm-6.3 1.98l-.23.33l-.08.41l.08.41l.23.34l.33.22l.41.09l.41-.09l.33-.22l.23-.34l.08-.41l-.08-.41l-.23-.33l-.33-.22l-.41-.09l-.41.09zm13.09 3.95l.28.06l.32.12l.35.18l.36.27l.36.35l.35.47l.32.59l.28.73l.21.88l.14 1.04l.05 1.23l-.06 1.23l-.16 1.04l-.24.86l-.32.71l-.36.57l-.4.45l-.42.33l-.42.24l-.4.16l-.36.09l-.32.05l-.24.02l-.16-.01h-8.22v.82h5.84l.01 2.76l.02.36l-.05.34l-.11.31l-.17.29l-.25.25l-.31.24l-.38.2l-.44.17l-.51.15l-.58.13l-.64.09l-.71.07l-.77.04l-.84.01l-1.27-.04l-1.07-.14l-.9-.2l-.73-.25l-.59-.3l-.45-.33l-.34-.34l-.25-.34l-.16-.33l-.1-.3l-.04-.25l-.02-.2l.01-.13v-5.34l.05-.64l.13-.54l.21-.46l.26-.38l.3-.32l.33-.24l.35-.2l.35-.14l.33-.1l.3-.06l.26-.04l.21-.02l.13-.01h5.84l.69-.05l.59-.14l.5-.21l.41-.28l.33-.32l.27-.35l.2-.36l.15-.36l.1-.35l.07-.32l.04-.28l.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33l-.08.41l.08.41l.23.33l.33.23l.41.08l.41-.08l.33-.23l.23-.33l.08-.41l-.08-.41l-.23-.33l-.33-.23l-.41-.08l-.41.08z"/></symbol><use href="#ai:simple-icons:python"></use> 632 633</svg>
634 <span class="docs-home-card__title astro-pzzfkzcl">Python</span> 635 </a> 636 </li><li class="astro-pzzfkzcl"> 637 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/rust/"> 638 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:rust"> 639 640 641 <symbol id="ai:simple-icons:rust"><path fill="currentColor" d="m23.835 11.703l-1.008-.623l-.028-.294l.866-.807a.348.348 0 0 0-.116-.578l-1.106-.414a9 9 0 0 0-.087-.285l.69-.96a.346.346 0 0 0-.226-.544l-1.166-.19a9 9 0 0 0-.14-.261l.49-1.076a.34.34 0 0 0-.028-.336a.35.35 0 0 0-.3-.154l-1.185.041a7 7 0 0 0-.188-.227l.273-1.153a.347.347 0 0 0-.417-.417l-1.153.273l-.228-.188l.041-1.184a.344.344 0 0 0-.49-.328l-1.076.49l-.262-.14l-.19-1.167a.348.348 0 0 0-.545-.226l-.96.69a9 9 0 0 0-.285-.086L14.597.453a.348.348 0 0 0-.578-.116l-.807.867a9 9 0 0 0-.294-.028L12.295.168a.346.346 0 0 0-.59 0l-.623 1.008l-.294.028L9.98.337a.346.346 0 0 0-.578.116l-.414 1.106l-.285.086l-.959-.69a.348.348 0 0 0-.545.226l-.19 1.167a9 9 0 0 0-.262.14l-1.076-.49a.346.346 0 0 0-.49.328l.041 1.184a8 8 0 0 0-.228.187l-1.153-.272a.347.347 0 0 0-.417.417l.271 1.153l-.186.227l-1.184-.042a.346.346 0 0 0-.328.49l.49 1.077a9 9 0 0 0-.14.262l-1.166.19a.348.348 0 0 0-.226.544l.69.958l-.087.286l-1.106.414a.348.348 0 0 0-.116.578l.866.807a9 9 0 0 0-.028.294l-1.008.623a.344.344 0 0 0 0 .59l1.008.623q.012.147.028.294l-.866.807a.346.346 0 0 0 .116.578l1.106.415q.042.144.087.285l-.69.959a.345.345 0 0 0 .227.544l1.166.19q.069.132.14.262l-.49 1.076a.346.346 0 0 0 .328.49l1.183-.041q.093.115.187.227l-.27 1.154a.346.346 0 0 0 .416.417l1.153-.272q.113.096.228.187l-.041 1.184a.344.344 0 0 0 .49.327l1.076-.49q.13.073.262.14l.19 1.167a.348.348 0 0 0 .545.227l.959-.69a9 9 0 0 0 .285.086l.414 1.107a.345.345 0 0 0 .578.115l.808-.865l.294.03l.623 1.006a.347.347 0 0 0 .59 0l.623-1.007q.148-.013.294-.03l.807.866a.348.348 0 0 0 .578-.115l.414-1.107a9 9 0 0 0 .285-.087l.959.69a.345.345 0 0 0 .545-.226l.19-1.166l.262-.14l1.076.49a.347.347 0 0 0 .49-.328l-.041-1.184a7 7 0 0 0 .227-.187l1.153.272a.347.347 0 0 0 .417-.416l-.272-1.155q.095-.112.187-.227l1.184.041a.344.344 0 0 0 .328-.49l-.49-1.076q.072-.13.141-.262l1.166-.19a.348.348 0 0 0 .226-.544l-.69-.959l.087-.285l1.106-.414a.346.346 0 0 0 .116-.579l-.866-.807q.016-.147.028-.294l1.008-.624a.344.344 0 0 0 0-.589zm-6.742 8.355a.714.714 0 0 1 .299-1.396a.714.714 0 1 1-.3 1.396zm-.342-2.314a.65.65 0 0 0-.771.5l-.358 1.669a8.7 8.7 0 0 1-3.619.78a8.7 8.7 0 0 1-3.695-.815L7.95 18.21a.65.65 0 0 0-.772-.5l-1.473.317a9 9 0 0 1-.761-.898h7.167c.081 0 .136-.014.136-.088v-2.536c0-.074-.054-.088-.136-.088h-2.096v-1.608h2.268c.206 0 1.106.059 1.393 1.209c.09.353.288 1.504.424 1.873c.134.413.683 1.238 1.268 1.238h3.572a1 1 0 0 0 .13-.013a9 9 0 0 1-.813.952zm-9.914 2.28a.714.714 0 1 1-.3-1.396a.714.714 0 0 1 .3 1.396M4.117 8.997a.714.714 0 1 1-1.303.58a.714.714 0 0 1 1.304-.58m-.834 1.981l1.534-.682a.65.65 0 0 0 .33-.858l-.316-.715h1.244v5.602H3.567a8.8 8.8 0 0 1-.284-3.348zm6.734-.543V8.784h2.96c.153 0 1.08.177 1.08.87c0 .574-.712.78-1.296.78zm10.757 1.486q0 .329-.024.651h-.9c-.09 0-.127.059-.127.148v.413c0 .973-.548 1.184-1.03 1.238c-.457.052-.964-.191-1.027-.472c-.27-1.518-.72-1.843-1.43-2.403c.882-.56 1.799-1.386 1.799-2.492c0-1.193-.82-1.945-1.377-2.315c-.783-.516-1.65-.62-1.883-.62H5.468a8.77 8.77 0 0 1 4.907-2.77l1.098 1.152a.65.65 0 0 0 .918.02l1.227-1.173a8.78 8.78 0 0 1 6.004 4.276l-.84 1.898a.65.65 0 0 0 .33.859l1.618.718q.042.43.042.872zm-9.3-9.6a.713.713 0 1 1 .984 1.032a.714.714 0 0 1-.984-1.031m8.339 6.71a.71.71 0 0 1 .939-.362a.714.714 0 1 1-.94.364z"/></symbol><use href="#ai:simple-icons:rust"></use> 642 643</svg> 644 <span class="docs-home-card__title astro-pzzfkzcl">Rust</span> 645 </a> 646 </li><li class="astro-pzzfkzcl"> 647 <a class="docs-home-card astro-pzzfkzcl" href="/vgi/docs/typescript/"> 648 <svg width="1em" height="1em" viewBox="0 0 24 24" class="docs-home-card__icon astro-pzzfkzcl" data-icon="simple-icons:typescript"> 649 650 651 <symbol id="ai:simple-icons:typescript">
651<path fill="currentColor" d="M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75q.918 0 1.627.111a6.4 6.4 0 0 1 1.306.34v2.458a4 4 0 0 0-.643-.361a5 5 0 0 0-.717-.26a5.5 5.5 0 0 0-1.426-.2q-.45 0-.819.086a2.1 2.1 0 0 0-.623.242q-.254.156-.393.374a.9.9 0 0 0-.14.49q0 .294.156.529q.156.234.443.444c.287.21.423.276.696.41q.41.203.926.416q.705.296 1.266.628q.561.333.963.753q.402.418.614.957q.213.538.214 1.253q0 .986-.373 1.656a3 3 0 0 1-1.012 1.085a4.4 4.4 0 0 1-1.487.596q-.85.18-1.79.18a10 10 0 0 1-1.84-.164a5.5 5.5 0 0 1-1.512-.493v-2.63a5.03 5.03 0 0 0 3.237 1.2q.5 0 .872-.09q.373-.09.623-.25q.249-.162.373-.38a1.02 1.02 0 0 0-.074-1.089a2.1 2.1 0 0 0-.537-.5a5.6 5.6 0 0 0-.807-.444a28 28 0 0 0-1.007-.436q-1.377-.575-2.053-1.405t-.676-2.005q0-.92.369-1.582q.368-.662 1.004-1.089a4.5 4.5 0 0 1 1.47-.629a7.5 7.5 0 0 1 1.77-.201m-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z"/></symbol><use href="#ai:simple-icons:typescript"></use> 652 653</svg> 654 <span class="docs-home-card__title astro-pzzfkzcl">TypeScript</span> 655 </a> 656 </li> 657</ul> 658<p>Still deciding? <strong><a href="/vgi/languages">Language SDKs</a></strong> compares them side by side â install command, 659feature parity, repository, and the RPC layer underneath each one.</p> 660<div class="sl-heading-wrapper level-h2"><h2 id="elsewhere-on-the-site">Elsewhere on the site</h2><a class="sl-anchor-link" href="#elsewhere-on-the-site"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 1 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 0 0-1.42-1.42m8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 1 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l3.88-3.89a4.49 4.49 0 0 0 0-6.33M8.83 15.17a1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.92-4.92a1 1 0 1 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42"></path></svg></span><span class="sr-only" data-pagefind-ignore="true">Section titled âElsewhere on the siteâ</span></a></div> 661<ul> 662<li><strong><a href="/vgi">VGI overview</a></strong> â what it is and who itâs for.</li> 663<li><strong><a href="/vgi/architecture">Architecture</a></strong> â the engineering case: why out-of-process, what it costs in 664latency, how it compares to native C++ extensions, Airport and ADBC.</li> 665<li><strong><a href="/vgi/getting-started">Getting started</a></strong> â install the extension and attach your first worker.</li> 666<li><strong><a href="https://vgi-rpc.query.farm/">vgi-rpc</a></strong> â the transport-agnostic RPC layer underneath, and its 667<a href="https://vgi-rpc.query.farm/wire-protocol">wire-protocol specification</a>.</li> 668</ul> 669 </div> 670 <footer class="sl-flex astro-xhxjzfa7"> 671 <div class="meta sl-flex astro-xhxjzfa7"> 672 673 674 </div> 675 <div class="pagination-links print:hidden astro-jgq3vlii" dir="ltr"> 676 677 678</div> 679 680 681</footer> 682 </div> 683</div> 684 685 </main> 686 </div> 687</div> 688 </div> 689</div> 690
690<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"d9c4ac386e3b4b41a12fa582343aca1e","r":1,"spa":2}' crossorigin="anonymous"></script>
690 691</body> 692</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.