[{"data":1,"prerenderedAt":1123},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fcapabilities\u002Fengines":3,"docs-nav":907},{"id":4,"title":5,"body":6,"description":16,"extension":899,"meta":900,"navigation":902,"path":903,"seo":904,"stem":905,"__hash__":906},"docs\u002Fdocs\u002Fcapabilities\u002Fengines.md","Engines: where the work runs",{"type":7,"value":8,"toc":883},"minimark",[9,13,17,22,168,175,179,184,195,199,253,257,260,316,323,330,336,350,357,376,380,401,407,414,418,437,441,444,709,716,720,723,743,747,800,804,847,851,879],[10,11,5],"h1",{"id":12},"engines-where-the-work-runs",[14,15,16],"p",{},"Tabularia computes flows, previews and the Viewer on one of five engines: Polars, DuckDB\nand chDB inside the workers, or an external ClickHouse server and Google BigQuery\noutside them. The flow does not change from one to the other, because it is stored as a\nlist of operations and each engine translates them; the engine is a setting of the flow,\nand a flow can use one engine while you design it and another in production. An\nadministrator decides which engines may be chosen.",[18,19,21],"h2",{"id":20},"at-a-glance","At a glance",[23,24,25,47],"table",{},[26,27,28],"thead",{},[29,30,31,35,38,41,44],"tr",{},[32,33,34],"th",{},"Engine",[32,36,37],{},"id",[32,39,40],{},"Where the compute runs",[32,42,43],{},"What it needs",[32,45,46],{},"Choose it when",[48,49,50,79,99,120,144],"tbody",{},[29,51,52,64,70,73,76],{},[53,54,55,59,60],"td",{},[56,57,58],"strong",{},"Polars"," ",[61,62,63],"em",{},"(default)",[53,65,66],{},[67,68,69],"code",{},"polars",[53,71,72],{},"In the worker process, streaming",[53,74,75],{},"Nothing",[53,77,78],{},"Day-to-day work, anything that fits the worker's memory",[29,80,81,86,91,94,96],{},[53,82,83],{},[56,84,85],{},"DuckDB",[53,87,88],{},[67,89,90],{},"duckdb",[53,92,93],{},"In the worker process, spilling to disk",[53,95,75],{},[53,97,98],{},"Very large joins and aggregations on one machine",[29,100,101,106,111,114,117],{},[53,102,103],{},[56,104,105],{},"chDB",[53,107,108],{},[67,109,110],{},"chdb",[53,112,113],{},"In the worker process (embedded ClickHouse)",[53,115,116],{},"An image built with chDB",[53,118,119],{},"Trying the ClickHouse dialect without a server",[29,121,122,127,132,135,141],{},[53,123,124],{},[56,125,126],{},"ClickHouse (external)",[53,128,129],{},[67,130,131],{},"clickhouse",[53,133,134],{},"On a managed or self-hosted ClickHouse server",[53,136,137,140],{},[67,138,139],{},"CLICKHOUSE_EXTERNAL__HOST"," and a server the workers can reach",[53,142,143],{},"Big tables, a ClickHouse you already run",[29,145,146,151,156,159,165],{},[53,147,148],{},[56,149,150],{},"BigQuery",[53,152,153],{},[67,154,155],{},"bigquery",[53,157,158],{},"On Google BigQuery, serverless",[53,160,161,164],{},[67,162,163],{},"BIGQUERY__PROJECT",", a service account, and Google Cloud Storage as the object storage",[53,166,167],{},"Data already on Google Cloud, no servers to run",[14,169,170,171,174],{},"Polars and DuckDB run every operation. chDB, ClickHouse and BigQuery run all of them but\nthe ",[56,172,173],{},"Foreach loop",", and BigQuery has no median inside a pivot. An engine that cannot\nrun an operation fails with a message that names it; it never hands the work to another\nengine without saying so.",[18,176,178],{"id":177},"how-it-works","How it works",[180,181,183],"h3",{"id":182},"each-engine-reads-the-same-parquet-files","Each engine reads the same parquet files",[14,185,186,187,190,191,194],{},"Datasources, cached steps and results are parquet files in one bucket. The in-process\nengines read them in the worker, DuckDB and chDB reading only the columns and row groups\na query needs. The external ClickHouse engine, with the ",[67,188,189],{},"s3"," transport (the default),\nhas the server read and write the files on the storage itself, so nothing passes\nthrough the workers; with ",[67,192,193],{},"push",", the worker loads the source into a staging table and\nstreams the result back, for a server that cannot see the bucket. BigQuery reads each\nfile as a temporary external table of the query, so nothing is loaded into a dataset.",[180,196,198],{"id":197},"which-engines-exist-on-an-installation","Which engines exist on an installation",[200,201,202,211,220,243],"ul",{},[203,204,205,207,208,210],"li",{},[56,206,58],{}," and ",[56,209,85],{}," are always there.",[203,212,213,215,216,219],{},[56,214,105],{}," is only in images built with ",[67,217,218],{},"WITH_CHDB=true",". The published images are built\nwithout it; the development Docker Compose stack builds its images with it. Where it\nis missing, the engine picker shows it as «not configured».",[203,221,222,224,225,227,228,233,234,237,238,242],{},[56,223,126],{}," appears once ",[67,226,139],{}," is set, with the\nconnection settings in ",[229,230,232],"a",{"href":231},"\u002Fdocs\u002Fconfiguration#external-clickhouse-engine","Configuration",",\nor once an administrator sets the server in ",[56,235,236],{},"Administration → Settings → ClickHouse\nconnection",", with a connection test (",[229,239,241],{"href":240},"\u002Fdocs\u002Fengine-settings#the-clickhouse-connection","guide",").",[203,244,245,224,247,249,250,242],{},[56,246,150],{},[67,248,163],{}," and the service account's key are set;\nthe object storage must be Google Cloud Storage\n(",[229,251,232],{"href":252},"\u002Fdocs\u002Fconfiguration#bigquery-engine",[180,254,256],{"id":255},"choosing-the-engine-of-a-flow","Choosing the engine of a flow",[14,258,259],{},"Every flow carries two engines:",[200,261,262,299],{},[203,263,264,267,268,271,272,275,276,279,280,282,283,286,287,290,291,294,295,298],{},[56,265,266],{},"The development engine",", chosen when the flow is created: ",[56,269,270],{},"Explore"," → ",[56,273,274],{},"New"," →\n",[56,277,278],{},"New flow",", or ",[56,281,278],{}," in the ",[56,284,285],{},"Flows"," tab, opens the ",[56,288,289],{},"Execution engine","\nlist, where your ",[56,292,293],{},"Preferred engine"," is marked «preferred». The editor uses it for\npreviews, charts, downloads and the ",[56,296,297],{},"Run"," button. The editor's toolbar shows it\nbeside the brand, followed by the production engine when that is another one\n(«Polars → ClickHouse»).",[203,300,301,304,305,307,308,311,312,315],{},[56,302,303],{},"The production engine",", optional: in the ",[56,306,285],{}," tab, open the flow's card and\nset ",[56,309,310],{},"Engine (production)",". Scheduled runs, flow groups and ",[56,313,314],{},"Run in production"," use\nit; «same as development» leaves them on the development engine.",[14,317,318],{},[319,320],"img",{"alt":321,"src":322},"The New flow button open on the Execution engine list: Polars marked preferred, DuckDB, chDB, ClickHouse (external), BigQuery","\u002Fmedia\u002Fguide\u002Fengines\u002Fnew-flow-engine-picker.png",[14,324,325],{},[61,326,327,329],{},[56,328,278],{}," asks for the development engine first; your preferred one is marked.",[14,331,332],{},[319,333],{"alt":334,"src":335},"A flow's card in the Flows tab with Engine (production) set to same as development","\u002Fmedia\u002Fguide\u002Fengines\u002Fflow-card-production-engine.png",[14,337,338],{},[61,339,340,341,343,344,346,347,349],{},"A flow's card in the ",[56,342,285],{}," tab: ",[56,345,310],{},", the engine of its schedules and of ",[56,348,314],{},".",[14,351,352,353,356],{},"So a flow can be designed on Polars, with a development sample on its sources, and run\nevery night on ClickHouse or BigQuery on the whole table. Every run records the engine it\nactually ran on (the ",[67,354,355],{},"engine"," field of the run in the API), which is the first thing to\ncheck when a production number differs from what the editor showed.",[14,358,359,360,362,363,367,368,371,372,375],{},"The engine is chosen in three more places, each for itself: the Viewer (",[56,361,355],{},", at\nthe top), a ",[229,364,366],{"href":365},"\u002Fdocs\u002Fsql-scripts","SQL script"," on the catalogue, and the ",[56,369,370],{},"Preferred\nengine"," in ",[56,373,374],{},"Settings",", which is only the default the Viewer and new flows start from.",[180,377,379],{"id":378},"the-engines-the-administrator-allows","The engines the administrator allows",[14,381,382,385,386,389,390,393,394,397,398,242],{},[56,383,384],{},"Administration → Engines"," lists each engine with ",[56,387,388],{},"Flows still using it",". Turning one\noff («Stop new flows from choosing it») removes it from every picker: it can no longer be\nchosen for a new flow, as a development or production engine of an existing one, or in\nthe Viewer. It does ",[56,391,392],{},"not"," stop the flows that already use it: their schedules keep\nrunning, and the count beside the engine is the list of flows to move. At least one\nengine always stays allowed. The pickers tell «not allowed here» apart from «not\nconfigured», so nobody looks for a missing variable when the reason is a policy.\nAllowing and disallowing are in the audit log (",[67,395,396],{},"engine.allow",", ",[67,399,400],{},"engine.disallow",[14,402,403],{},[319,404],{"alt":405,"src":406},"Administration, Engines: polars used by 13 flows, duckdb, chdb, clickhouse and bigquery by none, each with its switch","\u002Fmedia\u002Fguide\u002Fadmin\u002Fengines-allowed.png",[14,408,409],{},[61,410,411,413],{},[56,412,384],{},": each engine, the flows still using it, and the switch that allows or stops it.",[180,415,417],{"id":416},"one-semantics-documented-differences","One semantics, documented differences",[14,419,420,421,424,425,207,428,431,432,436],{},"The engines follow one data standard, the semantics of SQL: comparisons with null are\nfalse, aggregates ignore nulls, a failed cast gives null, sorting puts nulls last, a null\njoin key never matches, datetimes are UTC instants. An oracle test suite runs the same\nhand-computed expectations on all five engines. What still differs (rounding of a ",[67,422,423],{},".5",",\nthe modulo of negative numbers, how text is cast to dates, the SQL dialect of\n",[56,426,427],{},"Computed column",[56,429,430],{},"Execute SQL",") is listed in\n",[229,433,435],{"href":434},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",": read it before giving a flow a\nproduction engine other than its development one.",[18,438,440],{"id":439},"example-design-on-polars-run-on-clickhouse","Example: design on Polars, run on ClickHouse",[14,442,443],{},"A team designs on Polars and wants the nightly run on the company's ClickHouse.",[445,446,447,607,626,690,698],"ol",{},[203,448,449,452,453,592,595,596,599,600,603,604,606],{},[56,450,451],{},"The administrator enables the engine."," With Helm, in the values:",[454,455,460],"pre",{"className":456,"code":457,"language":458,"meta":459,"style":459},"language-yaml shiki shiki-themes github-dark-dimmed github-light","externalServices:\n  clickhouse:\n    host: clickhouse.example.com\n    port: 8443\n    secure: true\n    username: tabularia\n    database: tabularia\n    transport: s3\n    s3Endpoint: https:\u002F\u002Fs3.example.com\n    s3NamedCollection: tabularia_bucket\nsecrets:\n  clickhousePassword: \"…\"\n","yaml","",[67,461,462,475,483,496,508,519,530,540,551,562,573,581],{"__ignoreMap":459},[463,464,467,471],"span",{"class":465,"line":466},"line",1,[463,468,470],{"class":469},"shb1k","externalServices",[463,472,474],{"class":473},"ssh_m",":\n",[463,476,478,481],{"class":465,"line":477},2,[463,479,480],{"class":469},"  clickhouse",[463,482,474],{"class":473},[463,484,486,489,492],{"class":465,"line":485},3,[463,487,488],{"class":469},"    host",[463,490,491],{"class":473},": ",[463,493,495],{"class":494},"sXfbr","clickhouse.example.com\n",[463,497,499,502,504],{"class":465,"line":498},4,[463,500,501],{"class":469},"    port",[463,503,491],{"class":473},[463,505,507],{"class":506},"swcJU","8443\n",[463,509,511,514,516],{"class":465,"line":510},5,[463,512,513],{"class":469},"    secure",[463,515,491],{"class":473},[463,517,518],{"class":506},"true\n",[463,520,522,525,527],{"class":465,"line":521},6,[463,523,524],{"class":469},"    username",[463,526,491],{"class":473},[463,528,529],{"class":494},"tabularia\n",[463,531,533,536,538],{"class":465,"line":532},7,[463,534,535],{"class":469},"    database",[463,537,491],{"class":473},[463,539,529],{"class":494},[463,541,543,546,548],{"class":465,"line":542},8,[463,544,545],{"class":469},"    transport",[463,547,491],{"class":473},[463,549,550],{"class":494},"s3\n",[463,552,554,557,559],{"class":465,"line":553},9,[463,555,556],{"class":469},"    s3Endpoint",[463,558,491],{"class":473},[463,560,561],{"class":494},"https:\u002F\u002Fs3.example.com\n",[463,563,565,568,570],{"class":465,"line":564},10,[463,566,567],{"class":469},"    s3NamedCollection",[463,569,491],{"class":473},[463,571,572],{"class":494},"tabularia_bucket\n",[463,574,576,579],{"class":465,"line":575},11,[463,577,578],{"class":469},"secrets",[463,580,474],{"class":473},[463,582,584,587,589],{"class":465,"line":583},12,[463,585,586],{"class":469},"  clickhousePassword",[463,588,491],{"class":473},[463,590,591],{"class":494},"\"…\"\n",[593,594],"br",{},"With Docker Compose, the same settings are the ",[67,597,598],{},"CLICKHOUSE_EXTERNAL__*"," variables in\n",[67,601,602],{},"infrastructure\u002F.env",". After the restart, ",[56,605,126],{}," appears in the\npickers.",[203,608,609,612,613,617,618,621,622,625],{},[56,610,611],{},"The analyst keeps designing on Polars."," The flow «Revenue by Region and Channel»\n(",[229,614,616],{"href":615},"\u002Fdocs\u002Fcapabilities\u002Fflows#example-revenue-by-region-and-channel-on-the-sample-data","the flows example",")\nstays on Polars; its ",[67,619,620],{},"order_rows"," source gets a ",[56,623,624],{},"Development sample"," of the first\n100,000 rows, so previews stay fast.",[203,627,628,631,632,634,635,271,637,639,640],{},[56,629,630],{},"The production engine is set."," In the ",[56,633,285],{}," tab, on the flow's card,\n",[56,636,310],{},[56,638,126],{},". The same change through the API:",[454,641,645],{"className":642,"code":643,"language":644,"meta":459,"style":459},"language-bash shiki shiki-themes github-dark-dimmed github-light","curl -X PATCH https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42 \\\n  -H \"Authorization: Bearer tab_…\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"production_engine\": \"clickhouse\"}'\n","bash",[67,646,647,666,682],{"__ignoreMap":459},[463,648,649,653,656,659,662],{"class":465,"line":466},[463,650,652],{"class":651},"sqRhv","curl",[463,654,655],{"class":506}," -X",[463,657,658],{"class":494}," PATCH",[463,660,661],{"class":494}," https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42",[463,663,665],{"class":664},"sxsTv"," \\\n",[463,667,668,671,674,677,680],{"class":465,"line":477},[463,669,670],{"class":506},"  -H",[463,672,673],{"class":494}," \"Authorization: Bearer tab_…\"",[463,675,676],{"class":506}," -H",[463,678,679],{"class":494}," \"Content-Type: application\u002Fjson\"",[463,681,665],{"class":664},[463,683,684,687],{"class":465,"line":485},[463,685,686],{"class":506},"  -d",[463,688,689],{"class":494}," '{\"production_engine\": \"clickhouse\"}'\n",[203,691,692,695,696,349],{},[56,693,694],{},"A trial run."," The card's run button («Run now with the production engine») runs\nthe flow on ClickHouse, on every row: the development sample is never applied in\nproduction. Compare the result with the editor's; if a number differs, check the\noperations listed in ",[229,697,435],{"href":434},[203,699,700,703,704,708],{},[56,701,702],{},"The schedule."," Put the flow on a schedule (",[229,705,707],{"href":706},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling","): every\nscheduled run uses ClickHouse, and records it.",[14,710,711,712,715],{},"On BigQuery the steps are the same, with ",[67,713,714],{},"BIGQUERY__MAXIMUM_BYTES_BILLED"," (20 GiB by\ndefault) as the ceiling every query is checked against before it runs.",[180,717,719],{"id":718},"measured-numbers","Measured numbers",[14,721,722],{},"From the measurements published with the project:",[200,724,725,738],{},[203,726,727,733,734,737],{},[56,728,729,730,732],{},"External ClickHouse, ",[67,731,189],{}," transport",": an aggregation over 25 million rows answers\nin 0.6 s instead of 18 s, because the parquet files are written with large row groups\n(",[67,735,736],{},"INGEST__PARQUET_ROW_GROUP_ROWS",", one million by default) that the server can skip.",[203,739,740,742],{},[56,741,150],{},", on a table of 25 million rows and 50 columns with a development sample\nof 100,000 rows: 0.6–1.1 s per click in the editor with the step cache, 1.1–2.9 s\nwithout. BigQuery bills the columns a query touches: on that table an aggregation\nread 100 MB–1 GB, a sort of whole rows about 19 GB.",[18,744,746],{"id":745},"permissions","Permissions",[23,748,749,759],{},[26,750,751],{},[29,752,753,756],{},[32,754,755],{},"To",[32,757,758],{},"You need",[48,760,761,772,782,792],{},[29,762,763,766],{},[53,764,765],{},"Choose the development engine of a new flow",[53,767,768,771],{},[56,769,770],{},"EDIT"," on the folder, and the engine allowed",[29,773,774,777],{},[53,775,776],{},"Change a flow's development or production engine",[53,778,779,781],{},[56,780,770],{}," on the flow's folder, and the engine allowed",[29,783,784,786],{},[53,785,314],{},[53,787,788,791],{},[56,789,790],{},"RUN"," on the flow's folder",[29,793,794,797],{},[53,795,796],{},"Allow or disallow an engine",[53,798,799],{},"Administrator; observers see the panel read-only",[18,801,803],{"id":802},"limits-and-good-to-know","Limits and good to know",[200,805,806,816,819,826,836],{},[203,807,808,809,812,813,815],{},"The development engine can be changed after creation only through the API\n(",[67,810,811],{},"PATCH \u002Fflows\u002F{id}"," with ",[67,814,355],{},"); the interface changes the production engine.",[203,817,818],{},"A duplicate keeps both engines of the original; if one of them is no longer allowed,\nthe copy is refused.",[203,820,821,822,825],{},"Multi-replica ClickHouse services are not handled yet: cancelling a query and the\n",[56,823,824],{},"Performance"," page talk to one replica.",[203,827,828,829,832,833,242],{},"DuckDB spills to the worker's temporary disk; on Kubernetes it uses at most half of\n",[67,830,831],{},"TMP_SIZE_LIMIT",". chDB has its own memory and spill limits (",[67,834,835],{},"CHDB_MAX_*",[203,837,838,839,842,843,242],{},"Engine limits that can change while everything runs are in ",[56,840,841],{},"Administration →\nSettings"," (",[229,844,846],{"href":845},"\u002Fdocs\u002Fengine-settings","Settings from the panel",[18,848,850],{"id":849},"related","Related",[200,852,853,858,864,873],{},[203,854,855,857],{},[229,856,435],{"href":434},": the contract between engines",[203,859,860],{},[229,861,863],{"href":862},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","The ClickHouse user for the assistant",[203,865,866,207,869],{},[229,867,285],{"href":868},"\u002Fdocs\u002Fcapabilities\u002Fflows",[229,870,872],{"href":871},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",[203,874,875,878],{},[229,876,232],{"href":877},"\u002Fdocs\u002Fconfiguration#embedded-engines-chdb-duckdb-polars",": every engine variable",[880,881,882],"style",{},"html pre.shiki code .shb1k, html code.shiki .shb1k{--shiki-default:#8DDB8C;--shiki-light:#22863A}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .sxsTv, html code.shiki .sxsTv{--shiki-default:#F47067;--shiki-light:#005CC5}",{"title":459,"searchDepth":477,"depth":485,"links":884},[885,886,893,896,897,898],{"id":20,"depth":477,"text":21},{"id":177,"depth":477,"text":178,"children":887},[888,889,890,891,892],{"id":182,"depth":485,"text":183},{"id":197,"depth":485,"text":198},{"id":255,"depth":485,"text":256},{"id":378,"depth":485,"text":379},{"id":416,"depth":485,"text":417},{"id":439,"depth":477,"text":440,"children":894},[895],{"id":718,"depth":485,"text":719},{"id":745,"depth":477,"text":746},{"id":802,"depth":477,"text":803},{"id":849,"depth":477,"text":850},"md",{"source":901},"docs\u002Fcapabilities\u002Fengines.md",true,"\u002Fdocs\u002Fcapabilities\u002Fengines",{"title":5,"description":16},"docs\u002Fcapabilities\u002Fengines","GCDGuf9sbBnTDI7qtyfGHWw_SyDOoeoAPUDA_ivYb-s",[908,927,974,1006,1038,1067,1091,1115],{"title":909,"icon":910,"intro":911,"items":912},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[913,915,918,921,924],{"path":914,"title":909},"\u002Fdocs\u002Fgetting-started",{"path":916,"title":917},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":919,"title":920},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":922,"title":923},"\u002Fdocs\u002Fconcepts","Concepts",{"path":925,"title":926},"\u002Fdocs\u002Foverview","Overview (README)",{"title":928,"icon":929,"intro":930,"items":931},"Capabilities","capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[932,935,937,938,941,944,947,950,953,955,958,961,964,965,968,971,973],{"path":933,"title":934},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":868,"title":936},"Low-code flows",{"path":871,"title":872},{"path":939,"title":940},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":942,"title":943},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":945,"title":946},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":948,"title":949},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":951,"title":952},"\u002Fdocs\u002Fscripting","Python and R",{"path":365,"title":954},"SQL scripts",{"path":956,"title":957},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":959,"title":960},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":962,"title":963},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":706,"title":707},{"path":966,"title":967},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":969,"title":970},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":903,"title":972},"Engines",{"path":434,"title":435},{"title":975,"icon":976,"intro":977,"items":978},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[979,982,985,988,991,994,997,1000,1003],{"path":980,"title":981},"\u002Fdocs\u002Fsources","All sources",{"path":983,"title":984},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":986,"title":987},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":989,"title":990},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":992,"title":993},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":995,"title":996},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":998,"title":999},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":1001,"title":1002},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":1004,"title":1005},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":1007,"icon":1008,"intro":1009,"items":1010},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[1011,1014,1017,1020,1023,1025,1026,1028,1029,1032,1035],{"path":1012,"title":1013},"\u002Fdocs\u002Fconnections","All connections",{"path":1015,"title":1016},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":1018,"title":1019},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":1021,"title":1022},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":992,"title":1024},"SFTP servers",{"path":995,"title":996},{"path":998,"title":1027},"SharePoint",{"path":1001,"title":1002},{"path":1030,"title":1031},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1033,"title":1034},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":1036,"title":1037},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":1039,"icon":1040,"intro":1041,"items":1042},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1043,1046,1049,1052,1055,1058,1061,1064],{"path":1044,"title":1045},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1047,"title":1048},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":1050,"title":1051},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":1053,"title":1054},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":1056,"title":1057},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1059,"title":1060},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1062,"title":1063},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1065,"title":1066},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1068,"icon":1069,"intro":1070,"items":1071},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1072,1075,1077,1080,1083,1086,1089],{"path":1073,"title":1074},"\u002Fdocs\u002Fgovernance","Overview",{"path":1076,"title":746},"\u002Fdocs\u002Fgovernance\u002Fpermissions",{"path":1078,"title":1079},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1081,"title":1082},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1084,"title":1085},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1087,"title":1088},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":862,"title":1090},"A ClickHouse user for the AI assistant",{"title":1092,"icon":1093,"intro":1094,"items":1095},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1096,1099,1102,1105,1108,1111,1112],{"path":1097,"title":1098},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1100,"title":1101},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1103,"title":1104},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1106,"title":1107},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1109,"title":1110},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":845,"title":846},{"path":1113,"title":1114},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1116,"icon":1117,"intro":1118,"items":1119},"Reference","reference","Release process and the remaining reference pages.",[1120],{"path":1121,"title":1122},"\u002Fdocs\u002Frelease-process","Release process",1793656371733]