[{"data":1,"prerenderedAt":1277},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fengines\u002Fengine-differences":3,"docs-nav":1052},{"id":4,"title":5,"body":6,"description":1043,"extension":1044,"meta":1045,"navigation":1047,"path":1048,"seo":1049,"stem":1050,"__hash__":1051},"docs\u002Fdocs\u002Fengines\u002Fengine-differences.md","Engine differences",{"type":7,"value":8,"toc":1029},"minimark",[9,13,22,27,30,52,65,69,188,194,198,201,312,316,319,324,577,597,618,622,625,941,945,1013,1017],[10,11,5],"h1",{"id":12},"engine-differences",[14,15,16,17,21],"p",{},"Tabularia runs the same flow on five interchangeable engines. Most of the semantics are\nguaranteed to be identical — that guarantee is defined below and enforced by a test suite.\nThe rest is genuine engine behaviour, and ",[18,19,20],"strong",{},"this page is the contract for it",": read it\nbefore you pick an engine, and especially before you run a flow on an engine other than\nthe one you designed it with.",[23,24,26],"h2",{"id":25},"which-engine-runs-your-flow","Which engine runs your flow",[14,28,29],{},"Every flow carries two engine settings:",[31,32,33,41],"ul",{},[34,35,36,37,40],"li",{},"the ",[18,38,39],{},"development engine"," — used by the editor: previews, the Viewer, manual runs;",[34,42,36,43,46,47,51],{},[18,44,45],{},"production engine"," (optional, per flow) — used by scheduled runs and ",[48,49,50],"em",{},"Run in\nproduction",". When unset, production uses the development engine.",[14,53,54,55,60,61,64],{},"This is deliberate: you can design on Polars locally and run the scheduled DAG on an\nexternal ClickHouse or on BigQuery (how to choose and enable them:\n",[56,57,59],"a",{"href":58},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines","). It also means ",[18,62,63],{},"the engine can change between the result you saw and\nthe result you ship",". Every run records the engine it actually ran on — check it in the\nrun history when a number surprises you.",[23,66,68],{"id":67},"operation-coverage","Operation coverage",[70,71,72,91],"table",{},[73,74,75],"thead",{},[76,77,78,82,85,88],"tr",{},[79,80,81],"th",{},"Engine",[79,83,84],{},"id",[79,86,87],{},"Operations",[79,89,90],{},"Notes",[92,93,94,112,127,146,163],"tbody",{},[76,95,96,100,106,109],{},[97,98,99],"td",{},"Polars",[97,101,102],{},[103,104,105],"code",{},"polars",[97,107,108],{},"all 20",[97,110,111],{},"Default. In-process, lazy, streaming.",[76,113,114,117,122,124],{},[97,115,116],{},"DuckDB",[97,118,119],{},[103,120,121],{},"duckdb",[97,123,108],{},[97,125,126],{},"Out-of-core SQL, spills to disk. Good for very large joins and aggregations.",[76,128,129,132,137,143],{},[97,130,131],{},"chDB",[97,133,134],{},[103,135,136],{},"chdb",[97,138,139,140],{},"19 — no ",[103,141,142],{},"foreach",[97,144,145],{},"Out-of-core SQL, ClickHouse dialect, in-process.",[76,147,148,151,156,160],{},[97,149,150],{},"ClickHouse (external)",[97,152,153],{},[103,154,155],{},"clickhouse",[97,157,139,158],{},[103,159,142],{},[97,161,162],{},"Same dialect and operation set as chDB, executed on a remote server.",[76,164,165,168,173,185],{},[97,166,167],{},"BigQuery",[97,169,170],{},[103,171,172],{},"bigquery",[97,174,139,175,177,178,181,182],{},[103,176,142],{},"; no ",[103,179,180],{},"median"," inside ",[103,183,184],{},"pivot",[97,186,187],{},"GoogleSQL over temporary external tables on Google Cloud Storage; results through the Storage Read API.",[14,189,190,193],{},[18,191,192],{},"There is no silent fallback."," If an engine does not implement an operation, the run\nfails with an explicit message naming the engine and suggesting another one — it does not\nquietly hand the work to a different engine. (The external ClickHouse engine reuses chDB's\nimplementations, so its message mentions chDB. BigQuery names itself: a median inside a\npivot, for instance, is refused with a message suggesting another engine.)",[23,195,197],{"id":196},"what-is-guaranteed-identical","What is guaranteed identical",[14,199,200],{},"These are the semantics of SQL, and they hold on every engine. They are verified by an\noracle suite where each case declares a hand-computed expected result, run against all\nfive engines (BigQuery live, against a real project):",[31,202,203,222,250,270,275,282,292,305],{},[34,204,205,206,209,210,213,214,217,218,221],{},"comparisons with ",[103,207,208],{},"NULL"," are false — ",[103,211,212],{},"ne"," and ",[103,215,216],{},"not_in"," do ",[18,219,220],{},"not"," keep nulls;",[34,223,224,225,213,228,231,232,235,236,239,240,235,243,246,247,249],{},"aggregates ignore nulls; ",[103,226,227],{},"count",[103,229,230],{},"distinct count"," never count nulls; ",[103,233,234],{},"sum",", ",[103,237,238],{},"mean",",\n",[103,241,242],{},"min",[103,244,245],{},"max"," over an all-null group return ",[103,248,208],{},";",[34,251,252,213,255,258,259,262,263,265,266,269],{},[103,253,254],{},"std",[103,256,257],{},"var"," are the ",[18,260,261],{},"sample"," versions (n−1), and ",[103,264,208],{}," with fewer than 2 values —\non every engine, the ClickHouse ones included (ClickHouse alone would give ",[103,267,268],{},"NaN","), and in\nthe pivot too;",[34,271,272,274],{},[103,273,180],{}," uses linear interpolation (R7);",[34,276,277,278,281],{},"sorting always puts ",[18,279,280],{},"nulls last",", ascending and descending — a \"top N\" never returns\nnulls; on several columns each keeps its own direction, the next ones breaking the ties;",[34,283,284,285,287,288,291],{},"a failed cast yields ",[103,286,208],{},", never an error; numbers cast to integer are ",[18,289,290],{},"truncated",",\nnot rounded; numeric strings are trimmed of surrounding whitespace;",[34,293,294,295,297,298,300,301,304],{},"in a join, a ",[103,296,208],{}," key never matches; a missing side is ",[103,299,208],{},", never a default value;\na non-key column with the same name on the right gets the ",[103,302,303],{},"_right"," suffix;",[34,306,307,308,311],{},"a datetime without timezone is an instant in ",[18,309,310],{},"UTC",".",[23,313,315],{"id":314},"what-differs","What differs",[14,317,318],{},"Two kinds of difference. The first kind is the dangerous one, because the result changes\nwithout any error.",[320,321,323],"h3",{"id":322},"differences-that-change-results-silently","Differences that change results silently",[70,325,326,337],{},[73,327,328],{},[76,329,330,333,335],{},[79,331,332],{},"Operation",[79,334,315],{},[79,336,59],{},[92,338,339,363,394,420,441,466,496,518],{},[76,340,341,349,360],{},[97,342,343,345,346,348],{},[103,344,216],{}," with a ",[103,347,208],{}," in the list",[97,350,351,352,355,356,359],{},"DuckDB and BigQuery return ",[18,353,354],{},"zero rows"," (strict SQL: ",[103,357,358],{},"\u003C> NULL"," is never true).",[97,361,362],{},"DuckDB, BigQuery",[76,364,365,374,392],{},[97,366,367,370,371],{},[103,368,369],{},"round()"," in ",[103,372,373],{},"compute",[97,375,376,377,380,381,384,385,380,388,391],{},"Polars and the ClickHouse engines round half to ",[18,378,379],{},"even"," (",[103,382,383],{},"0.5 → 0","); DuckDB and BigQuery round half ",[18,386,387],{},"away from zero",[103,389,390],{},"0.5 → 1","). Relevant for money.",[97,393,362],{},[76,395,396,403,418],{},[97,397,398,370,401],{},[103,399,400],{},"CAST(x AS INTEGER)",[103,402,373],{},[97,404,405,406,409,410,413,414,417],{},"Polars and the ClickHouse engines truncate (",[103,407,408],{},"47.5 → 47","); DuckDB rounds (",[103,411,412],{},"47.5 → 48","). The ",[103,415,416],{},"cast"," operation truncates on every engine: prefer it.",[97,419,116],{},[76,421,422,428,439],{},[97,423,424,427],{},[103,425,426],{},"%"," (modulo) with negative numbers",[97,429,430,431,434,435,438],{},"Polars takes the sign of the divisor (",[103,432,433],{},"-5 % 3 = 1","); the others take the sign of the dividend (",[103,436,437],{},"-5 % 3 = -2",").",[97,440,99],{},[76,442,443,450,463],{},[97,444,445,370,448],{},[103,446,447],{},"concat()",[103,449,373],{},[97,451,452,453,455,456,458,459,462],{},"Polars, DuckDB and BigQuery skip a ",[103,454,208],{}," argument; the ClickHouse engines return ",[103,457,208],{},". The ",[103,460,461],{},"||"," operator is consistent everywhere — prefer it.",[97,464,465],{},"chDB, ClickHouse",[76,467,468,482,493],{},[97,469,470,473,474,477,478,481],{},[103,471,472],{},"contains"," \u002F ",[103,475,476],{},"ends_with"," on a ",[18,479,480],{},"numeric"," column",[97,483,484,485,488,489,492],{},"The number is turned into text differently: ",[103,486,487],{},"100.0"," on Polars and DuckDB, ",[103,490,491],{},"100"," on the ClickHouse engines and BigQuery.",[97,494,495],{},"chDB, ClickHouse, BigQuery",[76,497,498,504,515],{},[97,499,500,503],{},[103,501,502],{},"join"," with key columns of different types",[97,505,506,507,510,511,514],{},"Two integer types of different widths join on every engine, on a common type (the only pair refused: ",[103,508,509],{},"Int64"," with ",[103,512,513],{},"UInt64"," on the ClickHouse engines). A date with a datetime, or a decimal with an integer, also joins on DuckDB and the ClickHouse engines. A number with a text, or an integer with a float, joins only on DuckDB, which coerces and finds matches. Everywhere else these pairs raise an error.",[97,516,517],{},"all",[76,519,520,525,575],{},[97,521,522,524],{},[103,523,416],{}," to boolean",[97,526,527,528,531,532,535,536,539,540,535,543,535,546,535,549,213,552,535,555,535,558,535,561,564,565,568,569,572,573,311],{},"Polars ",[18,529,530],{},"fails"," on text; DuckDB and BigQuery parse ",[103,533,534],{},"\"true\"","\u002F",[103,537,538],{},"\"false\""," (DuckDB also ",[103,541,542],{},"t",[103,544,545],{},"1",[103,547,548],{},"yes",[103,550,551],{},"y",[103,553,554],{},"f",[103,556,557],{},"0",[103,559,560],{},"no",[103,562,563],{},"n",", in any case; BigQuery: any non-zero number is ",[103,566,567],{},"true","); the ClickHouse engines return an integer and turn ",[103,570,571],{},"-1"," into ",[103,574,208],{},[97,576,517],{},[14,578,579,585,586,589,590,213,593,596],{},[18,580,581,582,584],{},"The size of the ",[103,583,472],{}," difference, measured on real data."," On a table of 150,000\nItalian company names, 37,396 of which contain a full stop, the filter ",[103,587,588],{},"contains \".\"","\nreturns ",[18,591,592],{},"150,000 rows on Polars",[18,594,595],{},"37,396 on DuckDB and chDB",": to Polars the full\nstop is a metacharacter matching any character. A filter written during design and run in\nproduction on another engine can silently go from \"every customer\" to \"a quarter of them\".",[14,598,599,600,602,603,606,607,610,611,213,614,617],{},"Until ",[103,601,472],{}," is made uniform, treat it as a ",[18,604,605],{},"regex on Polars"," and a ",[18,608,609],{},"literal\nsubstring elsewhere",". For literal matching that behaves the same everywhere, prefer\n",[103,612,613],{},"starts with",[103,615,616],{},"ends with",", which have no such difference.",[320,619,621],{"id":620},"engine-level-behaviour","Engine-level behaviour",[14,623,624],{},"Legitimate dialect differences. Know them, choose accordingly.",[70,626,627,637],{},[73,628,629],{},[76,630,631,634],{},[79,632,633],{},"Topic",[79,635,636],{},"Behaviour",[92,638,639,649,675,721,746,773,799,812,841,890,898,919],{},[76,640,641,646],{},[97,642,643,644],{},"Integer overflow in ",[103,645,234],{},[97,647,648],{},"Polars and chDB wrap around silently; DuckDB and BigQuery raise an error.",[76,650,651,664],{},[97,652,653,473,656,659,660,663],{},[103,654,655],{},"first",[103,657,658],{},"last",", and which row ",[103,661,662],{},"unique"," keeps",[97,665,666,667,670,671,674],{},"After a ",[103,668,669],{},"sort",", the first and last rows ",[18,672,673],{},"in that order",", on Polars, DuckDB and the ClickHouse engines (checked on 400 000 rows, a ClickHouse server included). Without a sort, the first and last rows of the data as read on Polars and DuckDB; any row of the group on the ClickHouse engines and BigQuery.",[76,676,677,683],{},[97,678,679,680],{},"Casting text to ",[103,681,682],{},"datetime",[97,684,685,686,688,689,692,693,696,697,700,701,704,705,707,708,711,712,714,715,718,719,438],{},"The ClickHouse engines parse almost anything, including a numeric string read as a Unix timestamp; Polars, DuckDB and BigQuery only accept standard formats and return ",[103,687,208],{}," otherwise. Polars and DuckDB ",[18,690,691],{},"drop"," a ",[103,694,695],{},"Z"," or a UTC offset written after the seconds and keep the clock time: ",[103,698,699],{},"2024-01-05 10:30:00+02"," is 10:30 UTC, not 08:30. They disagree on ",[103,702,703],{},"24:00:00"," (DuckDB: midnight of the next day; Polars: ",[103,706,208],{},"), on ",[103,709,710],{},"23:59:60",", a ",[103,713,695],{}," right after the minutes, a lowercase ",[103,716,717],{},"z"," and an offset after a space (Polars reads them; DuckDB: ",[103,720,208],{},[76,722,723,728],{},[97,724,679,725],{},[103,726,727],{},"date",[97,729,730,731,734,735,213,738,741,742,745],{},"Permissiveness varies: ",[103,732,733],{},"2024-1-5"," works on Polars, DuckDB and BigQuery, ",[103,736,737],{},"2024\u002F01\u002F05",[103,739,740],{},"2024-01-05 10:00"," only on DuckDB. A two-digit year is that year, not this century's: ",[103,743,744],{},"24-01-05"," is the year 24 on Polars and DuckDB. Use ISO dates.",[76,747,748,753],{},[97,749,679,750],{},[103,751,752],{},"float",[97,754,755,235,758,761,762,765,766,769,770,772],{},[103,756,757],{},"inf",[103,759,760],{},"nan"," and a number beyond the double range (",[103,763,764],{},"1e400"," → infinity) agree on Polars and DuckDB; ",[103,767,768],{},"1_000.5"," is 1000.5 on DuckDB and ",[103,771,208],{}," on Polars.",[76,774,775,785],{},[97,776,777,778,235,781,784],{},"Position of a text (",[103,779,780],{},"strpos",[103,782,783],{},"position",")",[97,786,787,788,790,791,794,795,798],{},"DuckDB counts characters; Polars, and ClickHouse's ",[103,789,783],{},", count bytes: ",[103,792,793],{},"strpos('città x', 'x')"," is 7 on DuckDB and 8 on Polars. ClickHouse's ",[103,796,797],{},"positionUTF8"," counts characters.",[76,800,801,806],{},[97,802,803,805],{},[103,804,238],{}," of a boolean column",[97,807,808,809,811],{},"Polars and the ClickHouse engines count ",[103,810,567],{}," as 1 (true, false, true → 0.667); DuckDB has no mean of a boolean, and the run fails.",[76,813,814,820],{},[97,815,816,817],{},"Integer division ",[103,818,819],{},"\u002F\u002F",[97,821,822,823,826,827,830,831,834,835,473,837,840],{},"Polars floors (",[103,824,825],{},"-7 \u002F\u002F 2 = -4","), DuckDB truncates (",[103,828,829],{},"-3","), BigQuery translates it to ",[103,832,833],{},"DIV",", which truncates. ",[103,836,833],{},[103,838,839],{},"intDiv"," exist only on the ClickHouse engines and BigQuery.",[76,842,843,848],{},[97,844,845,846],{},"SQL functions inside ",[103,847,373],{},[97,849,850,852,853,856,857,860,861,864,865,380,868,870,871,235,874,870,877,235,880,870,883,235,885,870,887,889],{},[103,851,373],{}," parses real SQL expressions, so the dialect is the engine's: ",[103,854,855],{},"year(d)"," works on DuckDB and the ClickHouse engines but not on Polars (use ",[103,858,859],{},"EXTRACT","); ",[103,862,863],{},"^"," is a power operator only on DuckDB. These fail loudly. ",[18,866,867],{},"BigQuery transpiles the expression from the DuckDB dialect with sqlglot",[103,869,426],{}," → ",[103,872,873],{},"MOD",[103,875,876],{},"strftime",[103,878,879],{},"FORMAT_DATE",[103,881,882],{},"year()",[103,884,859],{},[103,886,819],{},[103,888,833],{},"); GoogleSQL-only functions pass through untouched, and an expression sqlglot cannot parse is sent as written.",[76,891,892,895],{},[97,893,894],{},"Whitespace trimmed when casting text to a number",[97,896,897],{},"Polars and BigQuery remove tabs and newlines too; DuckDB and the ClickHouse engines remove spaces only.",[76,899,900,905],{},[97,901,902,904],{},[103,903,261],{}," (random p%)",[97,906,907,908,911,912,915,916,438],{},"Deterministic on every engine, but each engine hashes rows its own way, so the ",[48,909,910],{},"same"," fraction picks ",[48,913,914],{},"different"," rows on Polars, DuckDB, the ClickHouse engines and BigQuery (",[103,917,918],{},"FARM_FINGERPRINT",[76,920,921,924],{},[97,922,923],{},"Column names on BigQuery",[97,925,926,927,930,931,934,935,930,937,940],{},"BigQuery only accepts letters, digits and underscores. Names such as ",[103,928,929],{},"Ragione Sociale"," or ",[103,932,933],{},"Importo (€)"," are mapped to safe names inside the query and restored in the results; nothing changes for the flow, but a ",[103,936,373],{},[103,938,939],{},"sql"," expression must quote such a column with backticks exactly as the flow names it.",[23,942,944],{"id":943},"rules-of-thumb","Rules of thumb",[946,947,948,954,966,980,998,1004],"ol",{},[34,949,950,953],{},[18,951,952],{},"Keep the production engine equal to the development engine"," unless you have a\nreason not to. When they differ, re-check any flow that uses an operation from the\nfirst table above.",[34,955,956,965],{},[18,957,958,959,962,963],{},"Prefer ",[103,960,961],{},"\\|\\|"," over ",[103,964,447],{},", and ISO dates in text you cast.",[34,967,968,971,972,235,974,976,977,979],{},[18,969,970],{},"Sort explicitly"," when you rely on ",[103,973,655],{},[103,975,658],{},", or which duplicate ",[103,978,662],{}," keeps.",[34,981,982,988,989,711,991,994,995,997],{},[18,983,984,985,987],{},"In ",[103,986,373],{},", write the engine's SQL"," (its dialect): ",[103,990,369],{},[103,992,993],{},"CAST"," to an integer, ",[103,996,426],{},"\nand the date functions can give other numbers on another engine.",[34,999,1000,1003],{},[18,1001,1002],{},"Check the engine recorded on the run"," when a production number differs from what you\nsaw in the editor. It is the first thing to look at.",[34,1005,1006,1012],{},[18,1007,1008,1009,1011],{},"On BigQuery, write ",[103,1010,373],{}," expressions in the DuckDB dialect",": they are translated;\nGoogleSQL-only functions work too but will not run elsewhere.",[23,1014,1016],{"id":1015},"where-these-findings-come-from","Where these findings come from",[14,1018,1019,1020,1028],{},"The catalogue above is the result of an audit that ran the same inputs through the four\nin-process and ClickHouse engines and compared them; the BigQuery entries come from the\nsame oracle suite run live against a GCP project on 2026-09-18. The guarantees are locked\nby that suite, ",[56,1021,1025],{"href":1022,"rel":1023},"https:\u002F\u002Fgithub.com\u002FJumpAsAService\u002FTabularia\u002Fblob\u002Fmain\u002Fbackend\u002Ftests\u002Ftest_data_correctness.py",[1024],"nofollow",[103,1026,1027],{},"backend\u002Ftests\u002Ftest_data_correctness.py",",\nwhere each case declares its hand-computed expected result.",{"title":1030,"searchDepth":1031,"depth":1032,"links":1033},"",2,3,[1034,1035,1036,1037,1041,1042],{"id":25,"depth":1031,"text":26},{"id":67,"depth":1031,"text":68},{"id":196,"depth":1031,"text":197},{"id":314,"depth":1031,"text":315,"children":1038},[1039,1040],{"id":322,"depth":1032,"text":323},{"id":620,"depth":1032,"text":621},{"id":943,"depth":1031,"text":944},{"id":1015,"depth":1031,"text":1016},"Tabularia runs the same flow on five interchangeable engines. Most of the semantics are\nguaranteed to be identical — that guarantee is defined below and enforced by a test suite.\nThe rest is genuine engine behaviour, and this page is the contract for it: read it\nbefore you pick an engine, and especially before you run a flow on an engine other than\nthe one you designed it with.","md",{"source":1046},"docs\u002Fengines\u002Fengine-differences.md",true,"\u002Fdocs\u002Fengines\u002Fengine-differences",{"title":5,"description":1043},"docs\u002Fengines\u002Fengine-differences","cNjMYharKWDRkdUk_CG45UdWgrx3oIjYrbI25wLrPfs",[1053,1072,1124,1156,1188,1217,1243,1269],{"title":1054,"icon":1055,"intro":1056,"items":1057},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[1058,1060,1063,1066,1069],{"path":1059,"title":1054},"\u002Fdocs\u002Fgetting-started",{"path":1061,"title":1062},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":1064,"title":1065},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":1067,"title":1068},"\u002Fdocs\u002Fconcepts","Concepts",{"path":1070,"title":1071},"\u002Fdocs\u002Foverview","Overview (README)",{"title":1073,"icon":1074,"intro":1075,"items":1076},"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.",[1077,1080,1083,1086,1089,1092,1095,1098,1101,1104,1107,1110,1113,1116,1119,1122,1123],{"path":1078,"title":1079},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":1081,"title":1082},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":1084,"title":1085},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":1087,"title":1088},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":1090,"title":1091},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":1093,"title":1094},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":1096,"title":1097},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":1099,"title":1100},"\u002Fdocs\u002Fscripting","Python and R",{"path":1102,"title":1103},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":1105,"title":1106},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":1108,"title":1109},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":1111,"title":1112},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":1114,"title":1115},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":1117,"title":1118},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":1120,"title":1121},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":58,"title":59},{"path":1048,"title":5},{"title":1125,"icon":1126,"intro":1127,"items":1128},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[1129,1132,1135,1138,1141,1144,1147,1150,1153],{"path":1130,"title":1131},"\u002Fdocs\u002Fsources","All sources",{"path":1133,"title":1134},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":1136,"title":1137},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":1139,"title":1140},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":1142,"title":1143},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":1145,"title":1146},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":1148,"title":1149},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":1151,"title":1152},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":1154,"title":1155},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":1157,"icon":1158,"intro":1159,"items":1160},"Connections","connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[1161,1164,1167,1170,1173,1175,1176,1178,1179,1182,1185],{"path":1162,"title":1163},"\u002Fdocs\u002Fconnections","All connections",{"path":1165,"title":1166},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":1168,"title":1169},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":1171,"title":1172},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":1142,"title":1174},"SFTP servers",{"path":1145,"title":1146},{"path":1148,"title":1177},"SharePoint",{"path":1151,"title":1152},{"path":1180,"title":1181},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1183,"title":1184},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":1186,"title":1187},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":1189,"icon":1190,"intro":1191,"items":1192},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1193,1196,1199,1202,1205,1208,1211,1214],{"path":1194,"title":1195},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1197,"title":1198},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":1200,"title":1201},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":1203,"title":1204},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":1206,"title":1207},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1209,"title":1210},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1212,"title":1213},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1215,"title":1216},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1218,"icon":1219,"intro":1220,"items":1221},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1222,1225,1228,1231,1234,1237,1240],{"path":1223,"title":1224},"\u002Fdocs\u002Fgovernance","Overview",{"path":1226,"title":1227},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":1229,"title":1230},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1232,"title":1233},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1235,"title":1236},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1238,"title":1239},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1241,"title":1242},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1244,"icon":1245,"intro":1246,"items":1247},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1248,1251,1254,1257,1260,1263,1266],{"path":1249,"title":1250},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1252,"title":1253},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1255,"title":1256},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1258,"title":1259},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1261,"title":1262},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1264,"title":1265},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1267,"title":1268},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1270,"icon":1271,"intro":1272,"items":1273},"Reference","reference","Release process and the remaining reference pages.",[1274],{"path":1275,"title":1276},"\u002Fdocs\u002Frelease-process","Release process",1793656371140]