[{"data":1,"prerenderedAt":2703},["ShallowReactive",2],{"navigation":3,"\u002Froles\u002Frow-filters":773,"\u002Froles\u002Frow-filters-surround":2698},[4,28,63,85,103,112,269,355,453,485,506,542,576,594,647,669,693,721,747],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","01.getting-started\u002F01.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fgetting-started\u002Finstallation","01.getting-started\u002F02.installation",{"title":16,"path":17,"stem":18},"Quickstart with AI","\u002Fgetting-started\u002Fquickstart-with-ai","01.getting-started\u002F03.quickstart-with-ai",{"title":20,"path":21,"stem":22},"Quickstart by Hand","\u002Fgetting-started\u002Fquickstart-by-hand","01.getting-started\u002F04.quickstart-by-hand",{"title":24,"path":25,"stem":26},"The Admin","\u002Fgetting-started\u002Fadmin-tour","01.getting-started\u002F05.admin-tour","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":62},"Concepts","i-lucide-lightbulb","\u002Fconcepts","02.concepts",[34,38,42,46,50,54,58],{"title":35,"path":36,"stem":37},"PostgreSQL First","\u002Fconcepts\u002Fpostgresql-first","02.concepts\u002F01.postgresql-first",{"title":39,"path":40,"stem":41},"Resources","\u002Fconcepts\u002Fresources","02.concepts\u002F02.resources",{"title":43,"path":44,"stem":45},"Users and Roles","\u002Fconcepts\u002Fusers-and-roles","02.concepts\u002F03.users-and-roles",{"title":47,"path":48,"stem":49},"Permissions","\u002Fconcepts\u002Fpermissions","02.concepts\u002F04.permissions",{"title":51,"path":52,"stem":53},"Drafts and Publishing","\u002Fconcepts\u002Fdrafts-and-publishing","02.concepts\u002F05.drafts-and-publishing",{"title":55,"path":56,"stem":57},"Audit and Events","\u002Fconcepts\u002Faudit-and-events","02.concepts\u002F06.audit-and-events",{"title":59,"path":60,"stem":61},"Object Access","\u002Fconcepts\u002Fobject-access","02.concepts\u002F07.object-access",false,{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":62},"App","i-lucide-app-window","\u002Fapp","03.app",[69,73,77,81],{"title":70,"path":71,"stem":72},"The App","\u002Fapp\u002Foverview","03.app\u002F01.overview",{"title":74,"path":75,"stem":76},"DataViews","\u002Fapp\u002Fdataviews","03.app\u002F02.dataviews",{"title":78,"path":79,"stem":80},"Dashboards","\u002Fapp\u002Fdashboards","03.app\u002F03.dashboards",{"title":82,"path":83,"stem":84},"Arrange menu","\u002Fapp\u002Farrange-menu","03.app\u002F04.arrange-menu",{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":62},"Database","i-lucide-database","\u002Fdatabase","04.database",[91,95,99],{"title":92,"path":93,"stem":94},"Tables","\u002Fdatabase\u002Ftables","04.database\u002F01.tables",{"title":96,"path":97,"stem":98},"Views","\u002Fdatabase\u002Fviews","04.database\u002F02.views",{"title":100,"path":101,"stem":102},"Functions","\u002Fdatabase\u002Ffunctions","04.database\u002F03.functions",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":62},"SQL Console","i-lucide-square-terminal","\u002Fsql-console","05.sql-console",[109],{"title":104,"path":110,"stem":111},"\u002Fsql-console\u002Foverview","05.sql-console\u002F01.overview",{"title":74,"icon":113,"path":114,"stem":115,"children":116,"page":62},"i-lucide-layout-list","\u002Fdataviews","06.dataviews",[117,121,125,129,183,214],{"title":118,"path":119,"stem":120},"Overview","\u002Fdataviews\u002Foverview","06.dataviews\u002F01.overview",{"title":122,"path":123,"stem":124},"Creating a DataView","\u002Fdataviews\u002Fcreating","06.dataviews\u002F02.creating",{"title":126,"path":127,"stem":128},"Publishing","\u002Fdataviews\u002Fpublishing","06.dataviews\u002F03.publishing",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Types","i-lucide-shapes","\u002Fdataviews\u002Ftypes","06.dataviews\u002F04.types",[135,139,143,147,151,155,159,163,167,171,175,179],{"title":136,"path":137,"stem":138},"Table","\u002Fdataviews\u002Ftypes\u002Ftable","06.dataviews\u002F04.types\u002F01.table",{"title":140,"path":141,"stem":142},"Cards","\u002Fdataviews\u002Ftypes\u002Fcards","06.dataviews\u002F04.types\u002F02.cards",{"title":144,"path":145,"stem":146},"Kanban","\u002Fdataviews\u002Ftypes\u002Fkanban","06.dataviews\u002F04.types\u002F03.kanban",{"title":148,"path":149,"stem":150},"Calendar","\u002Fdataviews\u002Ftypes\u002Fcalendar","06.dataviews\u002F04.types\u002F04.calendar",{"title":152,"path":153,"stem":154},"Gantt","\u002Fdataviews\u002Ftypes\u002Fgantt","06.dataviews\u002F04.types\u002F05.gantt",{"title":156,"path":157,"stem":158},"Map","\u002Fdataviews\u002Ftypes\u002Fmap","06.dataviews\u002F04.types\u002F06.map",{"title":160,"path":161,"stem":162},"Tree","\u002Fdataviews\u002Ftypes\u002Ftree","06.dataviews\u002F04.types\u002F07.tree",{"title":164,"path":165,"stem":166},"Form","\u002Fdataviews\u002Ftypes\u002Fform","06.dataviews\u002F04.types\u002F08.form",{"title":168,"path":169,"stem":170},"Master-detail","\u002Fdataviews\u002Ftypes\u002Fmaster-detail","06.dataviews\u002F04.types\u002F09.master-detail",{"title":172,"path":173,"stem":174},"Settings","\u002Fdataviews\u002Ftypes\u002Fsettings","06.dataviews\u002F04.types\u002F10.settings",{"title":176,"path":177,"stem":178},"Custom","\u002Fdataviews\u002Ftypes\u002Fcustom","06.dataviews\u002F04.types\u002F11.custom",{"title":180,"path":181,"stem":182},"External Frame","\u002Fdataviews\u002Ftypes\u002Fexternal-frame","06.dataviews\u002F04.types\u002F12.external-frame",{"title":172,"icon":184,"path":185,"stem":186,"children":187,"page":62},"i-lucide-settings-2","\u002Fdataviews\u002Fsettings","06.dataviews\u002F05.settings",[188,192,196,199,202,206,210],{"title":189,"path":190,"stem":191},"General","\u002Fdataviews\u002Fsettings\u002Fgeneral","06.dataviews\u002F05.settings\u002F01.general",{"title":193,"path":194,"stem":195},"Data","\u002Fdataviews\u002Fsettings\u002Fdata","06.dataviews\u002F05.settings\u002F02.data",{"title":96,"path":197,"stem":198},"\u002Fdataviews\u002Fsettings\u002Fviews","06.dataviews\u002F05.settings\u002F03.views",{"title":164,"path":200,"stem":201},"\u002Fdataviews\u002Fsettings\u002Fform","06.dataviews\u002F05.settings\u002F04.form",{"title":203,"path":204,"stem":205},"Actions","\u002Fdataviews\u002Fsettings\u002Factions","06.dataviews\u002F05.settings\u002F05.actions",{"title":207,"path":208,"stem":209},"Security","\u002Fdataviews\u002Fsettings\u002Fsecurity","06.dataviews\u002F05.settings\u002F06.security",{"title":211,"path":212,"stem":213},"Versions","\u002Fdataviews\u002Fsettings\u002Fversions","06.dataviews\u002F05.settings\u002F07.versions",{"title":215,"icon":216,"path":217,"stem":218,"children":219,"page":62},"Design Form","i-lucide-pencil-ruler","\u002Fdataviews\u002Fdesign-form","06.dataviews\u002F06.design-form",[220,223,257,261,265],{"title":118,"path":221,"stem":222},"\u002Fdataviews\u002Fdesign-form\u002Foverview","06.dataviews\u002F06.design-form\u002F01.overview",{"title":224,"icon":131,"path":225,"stem":226,"children":227,"page":62},"Widgets","\u002Fdataviews\u002Fdesign-form\u002Fwidgets","06.dataviews\u002F06.design-form\u002F02.widgets",[228,231,234,238,242,246,250,254],{"title":224,"path":229,"stem":230},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverview","06.dataviews\u002F06.design-form\u002F02.widgets\u002F01.overview",{"title":164,"path":232,"stem":233},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fform","06.dataviews\u002F06.design-form\u002F02.widgets\u002F02.form",{"title":235,"path":236,"stem":237},"Inputs","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Finputs","06.dataviews\u002F06.design-form\u002F02.widgets\u002F03.inputs",{"title":239,"path":240,"stem":241},"Display","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fdisplay","06.dataviews\u002F06.design-form\u002F02.widgets\u002F04.display",{"title":243,"path":244,"stem":245},"Embeds","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fembeds","06.dataviews\u002F06.design-form\u002F02.widgets\u002F05.embeds",{"title":247,"path":248,"stem":249},"Layout","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Flayout","06.dataviews\u002F06.design-form\u002F02.widgets\u002F06.layout",{"title":251,"path":252,"stem":253},"Overlays","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverlays","06.dataviews\u002F06.design-form\u002F02.widgets\u002F07.overlays",{"title":203,"path":255,"stem":256},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Factions","06.dataviews\u002F06.design-form\u002F02.widgets\u002F08.actions",{"title":258,"path":259,"stem":260},"Variables","\u002Fdataviews\u002Fdesign-form\u002Fvariables","06.dataviews\u002F06.design-form\u002F03.variables",{"title":262,"path":263,"stem":264},"Code","\u002Fdataviews\u002Fdesign-form\u002Fcode","06.dataviews\u002F06.design-form\u002F04.code",{"title":266,"path":267,"stem":268},"Formulas","\u002Fdataviews\u002Fdesign-form\u002Fformulas","06.dataviews\u002F06.design-form\u002F05.formulas",{"title":78,"icon":270,"path":271,"stem":272,"children":273,"page":62},"i-lucide-layout-dashboard","\u002Fdashboards","07.dashboards",[274,277,281,285,332],{"title":118,"path":275,"stem":276},"\u002Fdashboards\u002Foverview","07.dashboards\u002F01.overview",{"title":278,"path":279,"stem":280},"Creating a Dashboard","\u002Fdashboards\u002Fcreating","07.dashboards\u002F02.creating",{"title":282,"path":283,"stem":284},"Editor","\u002Fdashboards\u002Feditor","07.dashboards\u002F03.editor",{"title":224,"icon":286,"path":287,"stem":288,"children":289,"page":62},"i-lucide-chart-bar","\u002Fdashboards\u002Fwidgets","07.dashboards\u002F04.widgets",[290,293,297,301,305,309,313,317,321,324,328],{"title":224,"path":291,"stem":292},"\u002Fdashboards\u002Fwidgets\u002Foverview","07.dashboards\u002F04.widgets\u002F01.overview",{"title":294,"path":295,"stem":296},"Editing a Widget","\u002Fdashboards\u002Fwidgets\u002Fediting-a-widget","07.dashboards\u002F04.widgets\u002F02.editing-a-widget",{"title":298,"path":299,"stem":300},"Indicators","\u002Fdashboards\u002Fwidgets\u002Findicators","07.dashboards\u002F04.widgets\u002F03.indicators",{"title":302,"path":303,"stem":304},"Comparison","\u002Fdashboards\u002Fwidgets\u002Fcomparison","07.dashboards\u002F04.widgets\u002F04.comparison",{"title":306,"path":307,"stem":308},"Trend","\u002Fdashboards\u002Fwidgets\u002Ftrend","07.dashboards\u002F04.widgets\u002F05.trend",{"title":310,"path":311,"stem":312},"Proportion","\u002Fdashboards\u002Fwidgets\u002Fproportion","07.dashboards\u002F04.widgets\u002F06.proportion",{"title":314,"path":315,"stem":316},"Distribution and Relation","\u002Fdashboards\u002Fwidgets\u002Fdistribution-and-relation","07.dashboards\u002F04.widgets\u002F07.distribution-and-relation",{"title":318,"path":319,"stem":320},"Maps","\u002Fdashboards\u002Fwidgets\u002Fmaps","07.dashboards\u002F04.widgets\u002F08.maps",{"title":92,"path":322,"stem":323},"\u002Fdashboards\u002Fwidgets\u002Ftables","07.dashboards\u002F04.widgets\u002F09.tables",{"title":325,"path":326,"stem":327},"Visualization and Insertion","\u002Fdashboards\u002Fwidgets\u002Fvisualization-and-insertion","07.dashboards\u002F04.widgets\u002F10.visualization-and-insertion",{"title":329,"path":330,"stem":331},"SQL Conventions","\u002Fdashboards\u002Fwidgets\u002Fsql-conventions","07.dashboards\u002F04.widgets\u002F11.sql-conventions",{"title":172,"icon":184,"path":333,"stem":334,"children":335,"page":62},"\u002Fdashboards\u002Fsettings","07.dashboards\u002F05.settings",[336,339,342,345,349,352],{"title":189,"path":337,"stem":338},"\u002Fdashboards\u002Fsettings\u002Fgeneral","07.dashboards\u002F05.settings\u002F01.general",{"title":258,"path":340,"stem":341},"\u002Fdashboards\u002Fsettings\u002Fvariables","07.dashboards\u002F05.settings\u002F02.variables",{"title":193,"path":343,"stem":344},"\u002Fdashboards\u002Fsettings\u002Fdata","07.dashboards\u002F05.settings\u002F03.data",{"title":346,"path":347,"stem":348},"Share","\u002Fdashboards\u002Fsettings\u002Fshare","07.dashboards\u002F05.settings\u002F04.share",{"title":207,"path":350,"stem":351},"\u002Fdashboards\u002Fsettings\u002Fsecurity","07.dashboards\u002F05.settings\u002F05.security",{"title":211,"path":353,"stem":354},"\u002Fdashboards\u002Fsettings\u002Fversions","07.dashboards\u002F05.settings\u002F06.versions",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":62},"Workflows","i-lucide-workflow","\u002Fworkflows","08.workflows",[361,364,368,371,393,432],{"title":118,"path":362,"stem":363},"\u002Fworkflows\u002Foverview","08.workflows\u002F01.overview",{"title":365,"path":366,"stem":367},"Creating a Workflow","\u002Fworkflows\u002Fcreating","08.workflows\u002F02.creating",{"title":282,"path":369,"stem":370},"\u002Fworkflows\u002Feditor","08.workflows\u002F03.editor",{"title":372,"icon":373,"path":374,"stem":375,"children":376,"page":62},"Triggers","i-lucide-zap","\u002Fworkflows\u002Ftriggers","08.workflows\u002F04.triggers",[377,381,385,389],{"title":378,"path":379,"stem":380},"Manual","\u002Fworkflows\u002Ftriggers\u002Fmanual","08.workflows\u002F04.triggers\u002F01.manual",{"title":382,"path":383,"stem":384},"Database Event","\u002Fworkflows\u002Ftriggers\u002Fdatabase-event","08.workflows\u002F04.triggers\u002F02.database-event",{"title":386,"path":387,"stem":388},"Schedule","\u002Fworkflows\u002Ftriggers\u002Fschedule","08.workflows\u002F04.triggers\u002F03.schedule",{"title":390,"path":391,"stem":392},"Webhook","\u002Fworkflows\u002Ftriggers\u002Fwebhook","08.workflows\u002F04.triggers\u002F04.webhook",{"title":394,"icon":357,"path":395,"stem":396,"children":397,"page":62},"Steps","\u002Fworkflows\u002Fsteps","08.workflows\u002F05.steps",[398,401,405,408,412,416,420,424,428],{"title":193,"path":399,"stem":400},"\u002Fworkflows\u002Fsteps\u002Fdata","08.workflows\u002F05.steps\u002F01.data",{"title":402,"path":403,"stem":404},"Control","\u002Fworkflows\u002Fsteps\u002Fcontrol","08.workflows\u002F05.steps\u002F02.control",{"title":262,"path":406,"stem":407},"\u002Fworkflows\u002Fsteps\u002Fcode","08.workflows\u002F05.steps\u002F03.code",{"title":409,"path":410,"stem":411},"Integration","\u002Fworkflows\u002Fsteps\u002Fintegration","08.workflows\u002F05.steps\u002F04.integration",{"title":413,"path":414,"stem":415},"Communication","\u002Fworkflows\u002Fsteps\u002Fcommunication","08.workflows\u002F05.steps\u002F05.communication",{"title":417,"path":418,"stem":419},"Files","\u002Fworkflows\u002Fsteps\u002Ffiles","08.workflows\u002F05.steps\u002F06.files",{"title":421,"path":422,"stem":423},"Documents","\u002Fworkflows\u002Fsteps\u002Fdocuments","08.workflows\u002F05.steps\u002F07.documents",{"title":425,"path":426,"stem":427},"Composition","\u002Fworkflows\u002Fsteps\u002Fcomposition","08.workflows\u002F05.steps\u002F08.composition",{"title":429,"path":430,"stem":431},"Values","\u002Fworkflows\u002Fsteps\u002Fvalues","08.workflows\u002F05.steps\u002F09.values",{"title":172,"icon":184,"path":433,"stem":434,"children":435,"page":62},"\u002Fworkflows\u002Fsettings","08.workflows\u002F06.settings",[436,439,443,446,449],{"title":189,"path":437,"stem":438},"\u002Fworkflows\u002Fsettings\u002Fgeneral","08.workflows\u002F06.settings\u002F01.general",{"title":440,"path":441,"stem":442},"Trigger","\u002Fworkflows\u002Fsettings\u002Ftrigger","08.workflows\u002F06.settings\u002F02.trigger",{"title":207,"path":444,"stem":445},"\u002Fworkflows\u002Fsettings\u002Fsecurity","08.workflows\u002F06.settings\u002F03.security",{"title":211,"path":447,"stem":448},"\u002Fworkflows\u002Fsettings\u002Fversions","08.workflows\u002F06.settings\u002F04.versions",{"title":450,"path":451,"stem":452},"Runs","\u002Fworkflows\u002Fsettings\u002Fruns","08.workflows\u002F06.settings\u002F05.runs",{"title":417,"icon":454,"path":455,"stem":456,"children":457,"page":62},"i-lucide-files","\u002Ffiles","09.files",[458,461,465,469,473,477,481],{"title":118,"path":459,"stem":460},"\u002Ffiles\u002Foverview","09.files\u002F01.overview",{"title":462,"path":463,"stem":464},"Uploading","\u002Ffiles\u002Fuploading","09.files\u002F02.uploading",{"title":466,"path":467,"stem":468},"File Details","\u002Ffiles\u002Ffile-details","09.files\u002F03.file-details",{"title":470,"path":471,"stem":472},"Editing Files","\u002Ffiles\u002Fediting-files","09.files\u002F04.editing-files",{"title":474,"path":475,"stem":476},"Using Files in Tables","\u002Ffiles\u002Fusing-files-in-tables","09.files\u002F05.using-files-in-tables",{"title":478,"path":479,"stem":480},"Image Transformations","\u002Ffiles\u002Fimage-transformations","09.files\u002F06.image-transformations",{"title":482,"path":483,"stem":484},"Who Can See a File","\u002Ffiles\u002Fwho-can-see-a-file","09.files\u002F07.who-can-see-a-file",{"title":486,"icon":487,"path":488,"stem":489,"children":490,"page":62},"Templates","i-lucide-file-text","\u002Ftemplates","10.templates",[491,494,498,502],{"title":118,"path":492,"stem":493},"\u002Ftemplates\u002Foverview","10.templates\u002F01.overview",{"title":495,"path":496,"stem":497},"Emails","\u002Ftemplates\u002Femails","10.templates\u002F02.emails",{"title":499,"path":500,"stem":501},"PDF","\u002Ftemplates\u002Fpdf","10.templates\u002F03.pdf",{"title":503,"path":504,"stem":505},"System Emails","\u002Ftemplates\u002Fsystem-emails","10.templates\u002F04.system-emails",{"title":507,"icon":508,"path":509,"stem":510,"children":511,"page":62},"Users","i-lucide-users","\u002Fusers","11.users",[512,516,520,524,528],{"title":513,"path":514,"stem":515},"Managing Users","\u002Fusers\u002Fmanaging-users","11.users\u002F01.managing-users",{"title":517,"path":518,"stem":519},"A User's Page","\u002Fusers\u002Fa-users-page","11.users\u002F02.a-users-page",{"title":521,"path":522,"stem":523},"API Tokens","\u002Fusers\u002Fapi-tokens","11.users\u002F03.api-tokens",{"title":525,"path":526,"stem":527},"Sessions","\u002Fusers\u002Fsessions","11.users\u002F04.sessions",{"title":529,"icon":530,"path":531,"stem":532,"children":533,"page":62},"Insights","i-lucide-chart-line","\u002Fusers\u002Finsights","11.users\u002F05.insights",[534,538],{"title":535,"path":536,"stem":537},"Sign-ins","\u002Fusers\u002Finsights\u002Fsign-ins","11.users\u002F05.insights\u002F01.sign-ins",{"title":539,"path":540,"stem":541},"Activity","\u002Fusers\u002Finsights\u002Factivity","11.users\u002F05.insights\u002F02.activity",{"title":543,"icon":544,"path":545,"stem":546,"children":547,"page":62},"Roles","i-lucide-shield-check","\u002Froles","12.roles",[548,552,556,560,564,568,572],{"title":549,"path":550,"stem":551},"Creating a Role","\u002Froles\u002Fcreating-a-role","12.roles\u002F01.creating-a-role",{"title":553,"path":554,"stem":555},"Granting Permissions","\u002Froles\u002Fgranting-permissions","12.roles\u002F02.granting-permissions",{"title":557,"path":558,"stem":559},"Row Filters","\u002Froles\u002Frow-filters","12.roles\u002F03.row-filters",{"title":561,"path":562,"stem":563},"Payload Checks","\u002Froles\u002Fpayload-checks","12.roles\u002F04.payload-checks",{"title":565,"path":566,"stem":567},"Members","\u002Froles\u002Fmembers","12.roles\u002F05.members",{"title":569,"path":570,"stem":571},"Access Reviews","\u002Froles\u002Faccess-reviews","12.roles\u002F06.access-reviews",{"title":573,"path":574,"stem":575},"Delegated Administration","\u002Froles\u002Fdelegated-administration","12.roles\u002F07.delegated-administration",{"title":577,"icon":578,"path":579,"stem":580,"children":581,"page":62},"Logs","i-lucide-scroll-text","\u002Flogs","13.logs",[582,586,590],{"title":583,"path":584,"stem":585},"Audit Log","\u002Flogs\u002Faudit-log","13.logs\u002F01.audit-log",{"title":587,"path":588,"stem":589},"An Entry","\u002Flogs\u002Fan-entry","13.logs\u002F02.an-entry",{"title":591,"path":592,"stem":593},"Where Else It Shows","\u002Flogs\u002Fwhere-else-it-shows","13.logs\u002F03.where-else-it-shows",{"title":595,"icon":596,"path":597,"stem":598,"children":599,"page":62},"Data API","i-lucide-braces","\u002Fdata-api","14.data-api",[600,603,607,611,615,619,623,627,631,635,639,643],{"title":118,"path":601,"stem":602},"\u002Fdata-api\u002Foverview","14.data-api\u002F01.overview",{"title":604,"path":605,"stem":606},"Authentication","\u002Fdata-api\u002Fauthentication","14.data-api\u002F02.authentication",{"title":608,"path":609,"stem":610},"Reading","\u002Fdata-api\u002Freading","14.data-api\u002F03.reading",{"title":612,"path":613,"stem":614},"Filtering","\u002Fdata-api\u002Ffiltering","14.data-api\u002F04.filtering",{"title":616,"path":617,"stem":618},"Aggregating","\u002Fdata-api\u002Faggregating","14.data-api\u002F05.aggregating",{"title":620,"path":621,"stem":622},"Writing","\u002Fdata-api\u002Fwriting","14.data-api\u002F06.writing",{"title":624,"path":625,"stem":626},"Nested Writes","\u002Fdata-api\u002Fnested-writes","14.data-api\u002F07.nested-writes",{"title":628,"path":629,"stem":630},"Transactions","\u002Fdata-api\u002Ftransactions","14.data-api\u002F08.transactions",{"title":632,"path":633,"stem":634},"Calling Functions","\u002Fdata-api\u002Fcalling-functions","14.data-api\u002F09.calling-functions",{"title":636,"path":637,"stem":638},"OpenAPI","\u002Fdata-api\u002Fopenapi","14.data-api\u002F10.openapi",{"title":640,"path":641,"stem":642},"Routes","\u002Fdata-api\u002Froutes","14.data-api\u002F11.routes",{"title":644,"path":645,"stem":646},"A client, end to end","\u002Fdata-api\u002Fa-client","14.data-api\u002F12.a-client",{"title":172,"icon":648,"path":649,"stem":650,"children":651,"page":62},"i-lucide-settings","\u002Fsettings","15.settings",[652,655,659,662,665],{"title":189,"path":653,"stem":654},"\u002Fsettings\u002Fgeneral","15.settings\u002F01.general",{"title":656,"path":657,"stem":658},"Access","\u002Fsettings\u002Faccess","15.settings\u002F02.access",{"title":207,"path":660,"stem":661},"\u002Fsettings\u002Fsecurity","15.settings\u002F03.security",{"title":595,"path":663,"stem":664},"\u002Fsettings\u002Fdata-api","15.settings\u002F04.data-api",{"title":666,"path":667,"stem":668},"Features","\u002Fsettings\u002Ffeatures","15.settings\u002F05.features",{"title":670,"icon":671,"path":672,"stem":673,"children":674,"page":62},"User Profile","i-lucide-circle-user","\u002Fuser-profile","16.user-profile",[675,679,682,686,690],{"title":676,"path":677,"stem":678},"My Account","\u002Fuser-profile\u002Fmy-account","16.user-profile\u002F01.my-account",{"title":525,"path":680,"stem":681},"\u002Fuser-profile\u002Fsessions","16.user-profile\u002F02.sessions",{"title":683,"path":684,"stem":685},"Tokens","\u002Fuser-profile\u002Ftokens","16.user-profile\u002F03.tokens",{"title":687,"path":688,"stem":689},"Preferences","\u002Fuser-profile\u002Fpreferences","16.user-profile\u002F04.preferences",{"title":539,"path":691,"stem":692},"\u002Fuser-profile\u002Factivity","16.user-profile\u002F05.activity",{"title":694,"icon":695,"path":696,"stem":697,"children":698,"page":62},"AI Agents","i-lucide-bot","\u002Fai-agents","17.ai-agents",[699,702,705,709,713,717],{"title":118,"path":700,"stem":701},"\u002Fai-agents\u002Foverview","17.ai-agents\u002F01.overview",{"title":683,"path":703,"stem":704},"\u002Fai-agents\u002Ftokens","17.ai-agents\u002F02.tokens",{"title":706,"path":707,"stem":708},"MCP Server","\u002Fai-agents\u002Fmcp-server","17.ai-agents\u002F03.mcp-server",{"title":710,"path":711,"stem":712},"Recipes","\u002Fai-agents\u002Frecipes","17.ai-agents\u002F04.recipes",{"title":714,"path":715,"stem":716},"Tools","\u002Fai-agents\u002Ftools","17.ai-agents\u002F05.tools",{"title":718,"path":719,"stem":720},"llms.txt","\u002Fai-agents\u002Fllms-txt","17.ai-agents\u002F06.llms-txt",{"title":722,"icon":723,"path":724,"stem":725,"children":726,"page":62},"Operations","i-lucide-server","\u002Foperations","18.operations",[727,731,735,739,743],{"title":728,"path":729,"stem":730},"Deployment","\u002Foperations\u002Fdeployment","18.operations\u002F01.deployment",{"title":732,"path":733,"stem":734},"PostgreSQL","\u002Foperations\u002Fpostgresql","18.operations\u002F02.postgresql",{"title":736,"path":737,"stem":738},"Public URL, Proxy and CORS","\u002Foperations\u002Fpublic-url-proxy-cors","18.operations\u002F03.public-url-proxy-cors",{"title":740,"path":741,"stem":742},"Backup and Restore","\u002Foperations\u002Fbackup-restore","18.operations\u002F04.backup-restore",{"title":744,"path":745,"stem":746},"Upgrading","\u002Foperations\u002Fupgrading","18.operations\u002F05.upgrading",{"title":748,"icon":749,"path":750,"stem":751,"children":752,"page":62},"Reference","i-lucide-library","\u002Freference","19.reference",[753,757,761,765,769],{"title":754,"path":755,"stem":756},"Query Language","\u002Freference\u002Fquery-language","19.reference\u002F01.query-language",{"title":758,"path":759,"stem":760},"Errors","\u002Freference\u002Ferrors","19.reference\u002F02.errors",{"title":762,"path":763,"stem":764},"Admin API","\u002Freference\u002Fadmin-api","19.reference\u002F03.admin-api",{"title":766,"path":767,"stem":768},"Authentication API","\u002Freference\u002Fauth-api","19.reference\u002F04.auth-api",{"title":770,"path":771,"stem":772},"Environment Variables","\u002Freference\u002Fenvironment","19.reference\u002F05.environment",{"id":774,"title":557,"admin":775,"body":776,"description":2692,"extension":2693,"links":2694,"meta":2695,"navigation":2615,"path":558,"seo":2696,"stem":559,"__hash__":2697},"docs\u002F12.roles\u002F03.row-filters.md","Roles › a role › Permissions › a cell › Row filter",{"type":777,"value":778,"toc":2671},"minimark",[779,788,793,801,859,862,867,874,884,964,970,974,988,1025,1028,1032,1042,1046,1084,1289,1308,1311,1448,1466,1470,1551,1587,1591,1667,1711,1715,1771,1786,1812,1816,1892,1923,1927,2007,2018,2023,2130,2137,2140,2276,2280,2376,2379,2470,2473,2477,2500,2504,2507,2551,2565,2569,2579,2583,2589,2640,2650,2654,2667],[780,781,782,783,787],"p",{},"A row filter limits a grant to the rows that match it. It uses the same filter syntax as a request's ",[784,785,786],"code",{},"where",", written as JSON, and PostgreSQL evaluates it as part of every query and write the grant covers.",[789,790,792],"h2",{"id":791},"writing-one","Writing one",[780,794,795,796,800],{},"Open a grant in the role's permission matrix and its ",[797,798,799],"strong",{},"Row filter"," tab. Build the filter with the condition builder, or write the JSON directly:",[802,803,808],"pre",{"className":804,"code":805,"language":806,"meta":807,"style":807},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"branch\": { \"_eq\": \"$USER.branch\" } }\n","json","",[784,809,810],{"__ignoreMap":807},[811,812,815,819,822,826,829,832,835,837,841,843,845,847,851,853,856],"span",{"class":813,"line":814},"line",1,[811,816,818],{"class":817},"sMK4o","{",[811,820,821],{"class":817}," \"",[811,823,825],{"class":824},"spNyl","branch",[811,827,828],{"class":817},"\"",[811,830,831],{"class":817},":",[811,833,834],{"class":817}," {",[811,836,821],{"class":817},[811,838,840],{"class":839},"sBMFI","_eq",[811,842,828],{"class":817},[811,844,831],{"class":817},[811,846,821],{"class":817},[811,848,850],{"class":849},"sfazB","$USER.branch",[811,852,828],{"class":817},[811,854,855],{"class":817}," }",[811,857,858],{"class":817}," }\n",[780,860,861],{},"A grant without a filter covers every row.",[863,864],"screenshot",{"caption":865,"id":866},"The Row filter tab of the Dispatcher's work_orders READ grant.","row-filter-editor",[789,868,870,871],{"id":869},"the-users-own-fields-user","The user's own fields: ",[784,872,873],{},"$USER",[780,875,876,879,880,883],{},[784,877,878],{},"$USER.\u003Ccolumn>"," is a column of the current user's row in ",[784,881,882],{},"totalbase.users",", read fresh on every request. That includes columns you add yourself, which is what makes per-user rules short:",[885,886,887,903],"table",{},[888,889,890],"thead",{},[891,892,893,897,900],"tr",{},[894,895,896],"th",{},"Role",[894,898,899],{},"Resource",[894,901,902],{},"Filter",[904,905,906,922,936,951],"tbody",{},[891,907,908,912,917],{},[909,910,911],"td",{},"Dispatcher",[909,913,914],{},[784,915,916],{},"work_orders",[909,918,919],{},[784,920,921],{},"{ \"branch\": { \"_eq\": \"$USER.branch\" } }",[891,923,924,927,931],{},[909,925,926],{},"Technician",[909,928,929],{},[784,930,916],{},[909,932,933],{},[784,934,935],{},"{ \"technician.user\": { \"_eq\": \"$USER.id\" } }",[891,937,938,941,946],{},[909,939,940],{},"Sales",[909,942,943],{},[784,944,945],{},"customers",[909,947,948],{},[784,949,950],{},"{ \"account_manager\": { \"_eq\": \"$USER.id\" } }",[891,952,953,955,960],{},[909,954,926],{},[909,956,957],{},[784,958,959],{},"vehicles",[909,961,962],{},[784,963,935],{},[780,965,966,967,969],{},"Because ",[784,968,873],{}," is read on every request, moving a dispatcher to another branch changes what they see on their next click. Nothing about the user is stored in their session or token. A personal access token reads its owner's row.",[789,971,973],{"id":972},"following-relations","Following relations",[780,975,976,977,980,981,980,984,987],{},"A filter can follow foreign keys with dotted paths: ",[784,978,979],{},"technician.user",", ",[784,982,983],{},"site.branch",[784,985,986],{},"work_order.branch",". Acme's Dispatchers see the visits of their branch's orders:",[802,989,991],{"className":804,"code":990,"language":806,"meta":807,"style":807},"{ \"work_order.branch\": { \"_eq\": \"$USER.branch\" } }\n",[784,992,993],{"__ignoreMap":807},[811,994,995,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023],{"class":813,"line":814},[811,996,818],{"class":817},[811,998,821],{"class":817},[811,1000,986],{"class":824},[811,1002,828],{"class":817},[811,1004,831],{"class":817},[811,1006,834],{"class":817},[811,1008,821],{"class":817},[811,1010,840],{"class":839},[811,1012,828],{"class":817},[811,1014,831],{"class":817},[811,1016,821],{"class":817},[811,1018,850],{"class":849},[811,1020,828],{"class":817},[811,1022,855],{"class":817},[811,1024,858],{"class":817},[780,1026,1027],{},"Fields named in a filter don't need to be granted as fields. The filter is the administrator's rule, not something the user reads. They can't be password or other protected columns, though.",[789,1029,1031],{"id":1030},"operators-and-combinations","Operators and combinations",[780,1033,1034,1035,1038,1039,1041],{},"A condition is ",[784,1036,1037],{},"{ \"\u003Cfield>\": { \"\u003Coperator>\": \"\u003Cvalue>\" } }",". The field is a column or a dotted path through foreign keys. The operators are the Data API's own, so a filter you can write in a request's ",[784,1040,786],{}," works here too, and PostgreSQL evaluates it.",[1043,1044,429],"h3",{"id":1045},"values",[780,1047,1048,1049,980,1052,980,1055,1058,1059,1062,1063,1066,1067,1069,1070,1073,1074,980,1077,1062,1080,1083],{},"A value is a string, a number or a boolean: ",[784,1050,1051],{},"\"2026-10-01\"",[784,1053,1054],{},"20",[784,1056,1057],{},"true"," (",[784,1060,1061],{},"\"20\""," and ",[784,1064,1065],{},"\"true\""," work the same). TotalBase converts it to the column's type: ",[784,1068,1057],{}," or ",[784,1071,1072],{},"false"," for a boolean, a number for a numeric column. Anything else is passed to PostgreSQL, which casts it the way it casts any literal. ",[784,1075,1076],{},"_in",[784,1078,1079],{},"_nin",[784,1081,1082],{},"_between"," take a list, or the same values as comma-separated text:",[802,1085,1087],{"className":804,"code":1086,"language":806,"meta":807,"style":807},"{ \"discount_pct\": { \"_lte\": 20 } }            ✓\n{ \"status\": { \"_in\": [\"NEW\", \"ASSIGNED\"] } }  ✓\n{ \"status\": { \"_in\": \"NEW,ASSIGNED\" } }       ✓\n{ \"status\": { \"_eq\": [\"NEW\"] } }              ✗  INVALID_QUERY - a list only for _in, _nin, _between\n{ \"status\": { \"_in\": [] } }                   ✗  INVALID_QUERY\n",[784,1088,1089,1125,1179,1216,1256],{"__ignoreMap":807},[811,1090,1091,1093,1095,1098,1100,1102,1104,1106,1109,1111,1113,1117,1119,1121],{"class":813,"line":814},[811,1092,818],{"class":817},[811,1094,821],{"class":817},[811,1096,1097],{"class":824},"discount_pct",[811,1099,828],{"class":817},[811,1101,831],{"class":817},[811,1103,834],{"class":817},[811,1105,821],{"class":817},[811,1107,1108],{"class":839},"_lte",[811,1110,828],{"class":817},[811,1112,831],{"class":817},[811,1114,1116],{"class":1115},"sbssI"," 20",[811,1118,855],{"class":817},[811,1120,855],{"class":817},[811,1122,1124],{"class":1123},"sTEyZ","            ✓\n",[811,1126,1128,1130,1132,1135,1137,1139,1141,1143,1145,1147,1149,1152,1154,1157,1159,1162,1164,1167,1169,1172,1174,1176],{"class":813,"line":1127},2,[811,1129,818],{"class":817},[811,1131,821],{"class":817},[811,1133,1134],{"class":824},"status",[811,1136,828],{"class":817},[811,1138,831],{"class":817},[811,1140,834],{"class":817},[811,1142,821],{"class":817},[811,1144,1076],{"class":839},[811,1146,828],{"class":817},[811,1148,831],{"class":817},[811,1150,1151],{"class":817}," [",[811,1153,828],{"class":817},[811,1155,1156],{"class":849},"NEW",[811,1158,828],{"class":817},[811,1160,1161],{"class":817},",",[811,1163,821],{"class":817},[811,1165,1166],{"class":849},"ASSIGNED",[811,1168,828],{"class":817},[811,1170,1171],{"class":817},"]",[811,1173,855],{"class":817},[811,1175,855],{"class":817},[811,1177,1178],{"class":1123},"  ✓\n",[811,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1207,1209,1211,1213],{"class":813,"line":1181},3,[811,1183,818],{"class":817},[811,1185,821],{"class":817},[811,1187,1134],{"class":824},[811,1189,828],{"class":817},[811,1191,831],{"class":817},[811,1193,834],{"class":817},[811,1195,821],{"class":817},[811,1197,1076],{"class":839},[811,1199,828],{"class":817},[811,1201,831],{"class":817},[811,1203,821],{"class":817},[811,1205,1206],{"class":849},"NEW,ASSIGNED",[811,1208,828],{"class":817},[811,1210,855],{"class":817},[811,1212,855],{"class":817},[811,1214,1215],{"class":1123},"       ✓\n",[811,1217,1219,1221,1223,1225,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253],{"class":813,"line":1218},4,[811,1220,818],{"class":817},[811,1222,821],{"class":817},[811,1224,1134],{"class":824},[811,1226,828],{"class":817},[811,1228,831],{"class":817},[811,1230,834],{"class":817},[811,1232,821],{"class":817},[811,1234,840],{"class":839},[811,1236,828],{"class":817},[811,1238,831],{"class":817},[811,1240,1151],{"class":817},[811,1242,828],{"class":817},[811,1244,1156],{"class":849},[811,1246,828],{"class":817},[811,1248,1171],{"class":817},[811,1250,855],{"class":817},[811,1252,855],{"class":817},[811,1254,1255],{"class":1123},"              ✗  INVALID_QUERY - a list only for _in, _nin, _between\n",[811,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1282,1284,1286],{"class":813,"line":1258},5,[811,1260,818],{"class":817},[811,1262,821],{"class":817},[811,1264,1134],{"class":824},[811,1266,828],{"class":817},[811,1268,831],{"class":817},[811,1270,834],{"class":817},[811,1272,821],{"class":817},[811,1274,1076],{"class":839},[811,1276,828],{"class":817},[811,1278,831],{"class":817},[811,1280,1281],{"class":817}," []",[811,1283,855],{"class":817},[811,1285,855],{"class":817},[811,1287,1288],{"class":1123},"                   ✗  INVALID_QUERY\n",[780,1290,1291,1292,1295,1296,1299,1300,1303,1304,1307],{},"A value that doesn't fit the column fails when the filter is used: ",[784,1293,1294],{},"\"abc\""," for a number is ",[784,1297,1298],{},"400 INVALID_TYPE",", and ",[784,1301,1302],{},"\"yesterday-ish\""," for a date is PostgreSQL's ",[784,1305,1306],{},"400 INVALID_TEXT_REPRESENTATION",".",[1043,1309,302],{"id":1310},"comparison",[885,1312,1313,1329],{},[888,1314,1315],{},[891,1316,1317,1320,1323,1326],{},[894,1318,1319],{},"Operator",[894,1321,1322],{},"SQL",[894,1324,1325],{},"Matches rows where the field…",[894,1327,1328],{},"Example",[904,1330,1331,1349,1369,1389,1409,1429],{},[891,1332,1333,1337,1342,1345],{},[909,1334,1335],{},[784,1336,840],{},[909,1338,1339],{},[784,1340,1341],{},"=",[909,1343,1344],{},"equals the value",[909,1346,1347],{},[784,1348,921],{},[891,1350,1351,1356,1361,1364],{},[909,1352,1353],{},[784,1354,1355],{},"_neq",[909,1357,1358],{},[784,1359,1360],{},"\u003C>",[909,1362,1363],{},"differs from the value",[909,1365,1366],{},[784,1367,1368],{},"{ \"status\": { \"_neq\": \"CANCELLED\" } }",[891,1370,1371,1376,1381,1384],{},[909,1372,1373],{},[784,1374,1375],{},"_gt",[909,1377,1378],{},[784,1379,1380],{},">",[909,1382,1383],{},"is greater than the value",[909,1385,1386],{},[784,1387,1388],{},"{ \"quantity\": { \"_gt\": \"0\" } }",[891,1390,1391,1396,1401,1404],{},[909,1392,1393],{},[784,1394,1395],{},"_gte",[909,1397,1398],{},[784,1399,1400],{},">=",[909,1402,1403],{},"is greater than or equal to the value",[909,1405,1406],{},[784,1407,1408],{},"{ \"reported_at\": { \"_gte\": \"$INTERVAL.30d\" } }",[891,1410,1411,1416,1421,1424],{},[909,1412,1413],{},[784,1414,1415],{},"_lt",[909,1417,1418],{},[784,1419,1420],{},"\u003C",[909,1422,1423],{},"is less than the value",[909,1425,1426],{},[784,1427,1428],{},"{ \"due_at\": { \"_lt\": \"$CURRENT_TIMESTAMP\" } }",[891,1430,1431,1435,1440,1443],{},[909,1432,1433],{},[784,1434,1108],{},[909,1436,1437],{},[784,1438,1439],{},"\u003C=",[909,1441,1442],{},"is less than or equal to the value",[909,1444,1445],{},[784,1446,1447],{},"{ \"discount_pct\": { \"_lte\": \"20\" } }",[780,1449,1450,1451,980,1454,980,1457,980,1460,980,1463,1307],{},"These work on numbers, text (alphabetical order, by the column's collation), dates and times, uuids and booleans. The value can be a variable: ",[784,1452,1453],{},"$USER.*",[784,1455,1456],{},"$ROW.\u003Ccolumn>",[784,1458,1459],{},"$CURRENT_DATE",[784,1461,1462],{},"$INTERVAL.*",[784,1464,1465],{},"$PERIOD.*",[1043,1467,1469],{"id":1468},"text-patterns","Text patterns",[885,1471,1472,1484],{},[888,1473,1474],{},[891,1475,1476,1478,1480,1482],{},[894,1477,1319],{},[894,1479,1322],{},[894,1481,1325],{},[894,1483,1328],{},[904,1485,1486,1509,1531],{},[891,1487,1488,1493,1498,1504],{},[909,1489,1490],{},[784,1491,1492],{},"_like",[909,1494,1495],{},[784,1496,1497],{},"LIKE",[909,1499,1500,1501],{},"matches a pattern, ",[797,1502,1503],{},"case-sensitive",[909,1505,1506],{},[784,1507,1508],{},"{ \"sku\": { \"_like\": \"HV-%\" } }",[891,1510,1511,1516,1521,1526],{},[909,1512,1513],{},[784,1514,1515],{},"_ilike",[909,1517,1518],{},[784,1519,1520],{},"ILIKE",[909,1522,1500,1523],{},[797,1524,1525],{},"ignoring case",[909,1527,1528],{},[784,1529,1530],{},"{ \"name\": { \"_ilike\": \"%salta%\" } }",[891,1532,1533,1538,1543,1546],{},[909,1534,1535],{},[784,1536,1537],{},"_regex",[909,1539,1540],{},[784,1541,1542],{},"~",[909,1544,1545],{},"matches a POSIX regular expression, case-sensitive",[909,1547,1548],{},[784,1549,1550],{},"{ \"plate\": { \"_regex\": \"^A[A-Z]\" } }",[780,1552,1553,1554,1062,1556,980,1558,1561,1562,1565,1566,1568,1569,1572,1573,1575,1576,1062,1579,1582,1583,1586],{},"In ",[784,1555,1492],{},[784,1557,1515],{},[784,1559,1560],{},"%"," stands for any run of characters and ",[784,1563,1564],{},"_"," for exactly one. Without a ",[784,1567,1560],{},", the pattern must match the whole value: ",[784,1570,1571],{},"\"_ilike\": \"salta\""," matches only \"Salta\", not \"Salta Norte\". ",[784,1574,1537],{}," matches anywhere in the value unless you anchor it with ",[784,1577,1578],{},"^",[784,1580,1581],{},"$",". Add ",[784,1584,1585],{},"(?i)"," at the start to ignore case.",[1043,1588,1590],{"id":1589},"lists-and-ranges","Lists and ranges",[885,1592,1593,1605],{},[888,1594,1595],{},[891,1596,1597,1599,1601,1603],{},[894,1598,1319],{},[894,1600,1322],{},[894,1602,1325],{},[894,1604,1328],{},[904,1606,1607,1626,1645],{},[891,1608,1609,1613,1618,1621],{},[909,1610,1611],{},[784,1612,1076],{},[909,1614,1615],{},[784,1616,1617],{},"= ANY(array)",[909,1619,1620],{},"is one of the listed values",[909,1622,1623],{},[784,1624,1625],{},"{ \"status\": { \"_in\": \"NEW,ASSIGNED,IN_PROGRESS\" } }",[891,1627,1628,1632,1637,1640],{},[909,1629,1630],{},[784,1631,1079],{},[909,1633,1634],{},[784,1635,1636],{},"\u003C> ALL(array)",[909,1638,1639],{},"is none of the listed values",[909,1641,1642],{},[784,1643,1644],{},"{ \"priority\": { \"_nin\": \"LOW,NORMAL\" } }",[891,1646,1647,1651,1656,1662],{},[909,1648,1649],{},[784,1650,1082],{},[909,1652,1653],{},[784,1654,1655],{},"BETWEEN a AND b",[909,1657,1658,1659],{},"lies between two values, ",[797,1660,1661],{},"both ends included",[909,1663,1664],{},[784,1665,1666],{},"{ \"reported_at\": { \"_between\": \"$PERIOD.last_month.from,$PERIOD.last_month.to\" } }",[1668,1669,1670,1691],"ul",{},[1671,1672,1673,1062,1675,1677,1678,1680,1681,980,1684,1062,1687,1690],"li",{},[784,1674,1076],{},[784,1676,1079],{}," take a list, or one string with the values separated by commas; a value that itself contains a comma needs the list. The list is sent to PostgreSQL as a single array, so it can be as long as you need. Inside the list, only literal values and ",[784,1679,1453],{}," are accepted. ",[784,1682,1683],{},"$ROW",[784,1685,1686],{},"$INTERVAL",[784,1688,1689],{},"$PERIOD"," aren't.",[1671,1692,1693,1695,1696,1698,1699,1062,1702,1698,1704,1707,1708,1710],{},[784,1694,1082],{}," takes exactly two values, a list or comma-separated. Both ends count. For a period, where the end belongs to the next period, ",[784,1697,1395],{}," on ",[784,1700,1701],{},".from",[784,1703,1415],{},[784,1705,1706],{},".to"," is the exact form. ",[784,1709,1082],{}," also includes the first instant of the next period.",[1043,1712,1714],{"id":1713},"empty-values","Empty values",[885,1716,1717,1729],{},[888,1718,1719],{},[891,1720,1721,1723,1725,1727],{},[894,1722,1319],{},[894,1724,1322],{},[894,1726,1325],{},[894,1728,1328],{},[904,1730,1731,1751],{},[891,1732,1733,1738,1743,1746],{},[909,1734,1735],{},[784,1736,1737],{},"_null",[909,1739,1740],{},[784,1741,1742],{},"IS NULL",[909,1744,1745],{},"has no value",[909,1747,1748],{},[784,1749,1750],{},"{ \"technician\": { \"_null\": true } }",[891,1752,1753,1758,1763,1766],{},[909,1754,1755],{},[784,1756,1757],{},"_nnull",[909,1759,1760],{},[784,1761,1762],{},"IS NOT NULL",[909,1764,1765],{},"has a value",[909,1767,1768],{},[784,1769,1770],{},"{ \"customer_signature\": { \"_nnull\": true } }",[780,1772,1773,1774,1776,1777,1779,1780,1783,1784,1307],{},"These take no value. Write ",[784,1775,1057],{}," by convention; whatever you write is ignored. To match \"empty\", ",[784,1778,840],{}," doesn't work, because in SQL nothing equals ",[784,1781,1782],{},"NULL",". Use ",[784,1785,1737],{},[1787,1788,1789],"warning",{},[780,1790,1791,1794,1795,1797,1798,1800,1801,1803,1804,980,1806,1808,1809,1307],{},[797,1792,1793],{},"Rows with no value don't match comparisons."," PostgreSQL never treats ",[784,1796,1782],{}," as equal or different to anything, so ",[784,1799,1368],{}," leaves out rows where ",[784,1802,1134],{}," is empty, and so do ",[784,1805,1079],{},[784,1807,1415],{}," and the rest. When empty values should pass, say so:\n",[784,1810,1811],{},"{ \"_or\": [ { \"status\": { \"_neq\": \"CANCELLED\" } }, { \"status\": { \"_null\": true } } ] }",[1043,1813,1815],{"id":1814},"arrays-and-json","Arrays and JSON",[885,1817,1818,1830],{},[888,1819,1820],{},[891,1821,1822,1824,1826,1828],{},[894,1823,1319],{},[894,1825,1322],{},[894,1827,1325],{},[894,1829,1328],{},[904,1831,1832,1852,1872],{},[891,1833,1834,1839,1844,1847],{},[909,1835,1836],{},[784,1837,1838],{},"_contains",[909,1840,1841],{},[784,1842,1843],{},"@>",[909,1845,1846],{},"contains every element of the value",[909,1848,1849],{},[784,1850,1851],{},"{ \"skills\": { \"_contains\": \"{HVAC,ELECTRICAL}\" } }",[891,1853,1854,1859,1864,1867],{},[909,1855,1856],{},[784,1857,1858],{},"_contained_by",[909,1860,1861],{},[784,1862,1863],{},"\u003C@",[909,1865,1866],{},"has only elements that are in the value",[909,1868,1869],{},[784,1870,1871],{},"{ \"skills\": { \"_contained_by\": \"{HVAC,SOLAR}\" } }",[891,1873,1874,1879,1884,1887],{},[909,1875,1876],{},[784,1877,1878],{},"_overlap",[909,1880,1881],{},[784,1882,1883],{},"&&",[909,1885,1886],{},"shares at least one element with the value (arrays only)",[909,1888,1889],{},[784,1890,1891],{},"{ \"skills\": { \"_overlap\": \"{SOLAR,ELECTRICAL}\" } }",[780,1893,1894,1895,980,1898,1901,1902,1905,1906,1909,1910,1913,1914,1917,1918,1920,1921,1307],{},"For an array column (",[784,1896,1897],{},"text[]",[784,1899,1900],{},"integer[]","), write the value as a PostgreSQL array literal: ",[784,1903,1904],{},"{HVAC,SOLAR}",". For a ",[784,1907,1908],{},"jsonb"," column, write JSON text: ",[784,1911,1912],{},"{ \"metadata\": { \"_contains\": \"{\\\"plan\\\":\\\"PREMIUM\\\"}\" } }"," matches rows whose ",[784,1915,1916],{},"metadata"," holds that key and value. ",[784,1919,1878],{}," doesn't apply to ",[784,1922,1908],{},[1043,1924,1926],{"id":1925},"combining-conditions","Combining conditions",[885,1928,1929,1941],{},[888,1930,1931],{},[891,1932,1933,1935,1938],{},[894,1934,1319],{},[894,1936,1937],{},"Takes",[894,1939,1940],{},"Matches rows where…",[904,1942,1943,1960,1975,1990],{},[891,1944,1945,1951,1954],{},[909,1946,1947],{},[1948,1949,1950],"em",{},"(sibling conditions)",[909,1952,1953],{},"an object",[909,1955,1956,1959],{},[797,1957,1958],{},"all"," the conditions hold (AND)",[891,1961,1962,1967,1970],{},[909,1963,1964],{},[784,1965,1966],{},"_and",[909,1968,1969],{},"an array of filters",[909,1971,1972,1974],{},[797,1973,1958],{}," the filters hold",[891,1976,1977,1982,1984],{},[909,1978,1979],{},[784,1980,1981],{},"_or",[909,1983,1969],{},[909,1985,1986,1989],{},[797,1987,1988],{},"at least one"," filter holds",[891,1991,1992,1997,2000],{},[909,1993,1994],{},[784,1995,1996],{},"_not",[909,1998,1999],{},"a filter, or an array of filters",[909,2001,2002,2003,2006],{},"the filter does ",[797,2004,2005],{},"not"," hold (an array is combined with AND first)",[780,2008,2009,2010,1783,2013,2015,2016,1307],{},"Two conditions in the same object are an AND, and so are two operators on the same field: ",[784,2011,2012],{},"{ \"quantity\": { \"_gt\": \"0\", \"_lte\": \"50\" } }",[784,2014,1966],{}," when the same field appears in separate conditions, or to group inside an ",[784,2017,1981],{},[780,2019,2020,2022],{},[784,2021,1996],{}," turns a filter around: technicians don't see cancelled orders, whatever else their filter allows:",[802,2024,2026],{"className":804,"code":2025,"language":806,"meta":807,"style":807},"{ \"_and\": [\n  { \"technician.user\": { \"_eq\": \"$USER.id\" } },\n  { \"_not\": { \"status\": { \"_eq\": \"CANCELLED\" } } }\n] }\n",[784,2027,2028,2043,2078,2124],{"__ignoreMap":807},[811,2029,2030,2032,2034,2036,2038,2040],{"class":813,"line":814},[811,2031,818],{"class":817},[811,2033,821],{"class":817},[811,2035,1966],{"class":824},[811,2037,828],{"class":817},[811,2039,831],{"class":817},[811,2041,2042],{"class":817}," [\n",[811,2044,2045,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2068,2071,2073,2075],{"class":813,"line":1127},[811,2046,2047],{"class":817},"  {",[811,2049,821],{"class":817},[811,2051,979],{"class":839},[811,2053,828],{"class":817},[811,2055,831],{"class":817},[811,2057,834],{"class":817},[811,2059,821],{"class":817},[811,2061,840],{"class":1115},[811,2063,828],{"class":817},[811,2065,831],{"class":817},[811,2067,821],{"class":817},[811,2069,2070],{"class":849},"$USER.id",[811,2072,828],{"class":817},[811,2074,855],{"class":817},[811,2076,2077],{"class":817}," },\n",[811,2079,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2107,2109,2111,2113,2116,2118,2120,2122],{"class":813,"line":1181},[811,2081,2047],{"class":817},[811,2083,821],{"class":817},[811,2085,1996],{"class":839},[811,2087,828],{"class":817},[811,2089,831],{"class":817},[811,2091,834],{"class":817},[811,2093,821],{"class":817},[811,2095,1134],{"class":1115},[811,2097,828],{"class":817},[811,2099,831],{"class":817},[811,2101,834],{"class":817},[811,2103,821],{"class":817},[811,2105,840],{"class":2106},"swJcz",[811,2108,828],{"class":817},[811,2110,831],{"class":817},[811,2112,821],{"class":817},[811,2114,2115],{"class":849},"CANCELLED",[811,2117,828],{"class":817},[811,2119,855],{"class":817},[811,2121,855],{"class":817},[811,2123,858],{"class":817},[811,2125,2126,2128],{"class":813,"line":1218},[811,2127,1171],{"class":817},[811,2129,858],{"class":817},[780,2131,2132,2133,2136],{},"Filters can nest up to ",[784,2134,2135],{},"api.max_filter_depth"," levels.",[780,2138,2139],{},"Sales see their own customers, plus prospects nobody has claimed yet:",[802,2141,2143],{"className":804,"code":2142,"language":806,"meta":807,"style":807},"{ \"_or\": [\n  { \"account_manager\": { \"_eq\": \"$USER.id\" } },\n  { \"_and\": [ { \"status\": { \"_eq\": \"PROSPECT\" } }, { \"account_manager\": { \"_null\": true } } ] }\n] }\n",[784,2144,2145,2159,2192,2270],{"__ignoreMap":807},[811,2146,2147,2149,2151,2153,2155,2157],{"class":813,"line":814},[811,2148,818],{"class":817},[811,2150,821],{"class":817},[811,2152,1981],{"class":824},[811,2154,828],{"class":817},[811,2156,831],{"class":817},[811,2158,2042],{"class":817},[811,2160,2161,2163,2165,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190],{"class":813,"line":1127},[811,2162,2047],{"class":817},[811,2164,821],{"class":817},[811,2166,2167],{"class":839},"account_manager",[811,2169,828],{"class":817},[811,2171,831],{"class":817},[811,2173,834],{"class":817},[811,2175,821],{"class":817},[811,2177,840],{"class":1115},[811,2179,828],{"class":817},[811,2181,831],{"class":817},[811,2183,821],{"class":817},[811,2185,2070],{"class":849},[811,2187,828],{"class":817},[811,2189,855],{"class":817},[811,2191,2077],{"class":817},[811,2193,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2231,2233,2235,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2261,2263,2265,2268],{"class":813,"line":1181},[811,2195,2047],{"class":817},[811,2197,821],{"class":817},[811,2199,1966],{"class":839},[811,2201,828],{"class":817},[811,2203,831],{"class":817},[811,2205,1151],{"class":817},[811,2207,834],{"class":817},[811,2209,821],{"class":817},[811,2211,1134],{"class":1115},[811,2213,828],{"class":817},[811,2215,831],{"class":817},[811,2217,834],{"class":817},[811,2219,821],{"class":817},[811,2221,840],{"class":2106},[811,2223,828],{"class":817},[811,2225,831],{"class":817},[811,2227,821],{"class":817},[811,2229,2230],{"class":849},"PROSPECT",[811,2232,828],{"class":817},[811,2234,855],{"class":817},[811,2236,2237],{"class":817}," },",[811,2239,834],{"class":817},[811,2241,821],{"class":817},[811,2243,2167],{"class":1115},[811,2245,828],{"class":817},[811,2247,831],{"class":817},[811,2249,834],{"class":817},[811,2251,821],{"class":817},[811,2253,1737],{"class":2106},[811,2255,828],{"class":817},[811,2257,831],{"class":817},[811,2259,2260],{"class":817}," true",[811,2262,855],{"class":817},[811,2264,855],{"class":817},[811,2266,2267],{"class":817}," ]",[811,2269,858],{"class":817},[811,2271,2272,2274],{"class":813,"line":1218},[811,2273,1171],{"class":817},[811,2275,858],{"class":817},[789,2277,2279],{"id":2278},"time-and-other-variables","Time and other variables",[885,2281,2282,2292],{},[888,2283,2284],{},[891,2285,2286,2289],{},[894,2287,2288],{},"Variable",[894,2290,2291],{},"Means",[904,2293,2294,2309,2338,2367],{},[891,2295,2296,2306],{},[909,2297,2298,980,2300,980,2303],{},[784,2299,1459],{},[784,2301,2302],{},"$CURRENT_TIMESTAMP",[784,2304,2305],{},"$CURRENT_TIME",[909,2307,2308],{},"PostgreSQL's current date and time",[891,2310,2311,2316],{},[909,2312,2313],{},[784,2314,2315],{},"$INTERVAL.7d",[909,2317,2318,2319,980,2322,980,2325,980,2328,980,2331,980,2334,2337],{},"seven days ago (",[784,2320,2321],{},"s",[784,2323,2324],{},"m",[784,2326,2327],{},"h",[784,2329,2330],{},"d",[784,2332,2333],{},"w",[784,2335,2336],{},"y",")",[891,2339,2340,2348],{},[909,2341,2342,2345,2346],{},[784,2343,2344],{},"$PERIOD.this_month.from"," \u002F ",[784,2347,1706],{},[909,2349,2350,2351,980,2354,980,2357,980,2360,980,2363,2366],{},"the start and end of a calendar period: ",[784,2352,2353],{},"today",[784,2355,2356],{},"this_week",[784,2358,2359],{},"last_month",[784,2361,2362],{},"this_quarter",[784,2364,2365],{},"this_year",", …",[891,2368,2369,2373],{},[909,2370,2371],{},[784,2372,1456],{},[909,2374,2375],{},"another column of the same row",[780,2377,2378],{},"Technicians see their own visits from the last 30 days onward, and nothing older:",[802,2380,2382],{"className":804,"code":2381,"language":806,"meta":807,"style":807},"{ \"_and\": [\n  { \"technician.user\": { \"_eq\": \"$USER.id\" } },\n  { \"scheduled_start\": { \"_gte\": \"$INTERVAL.30d\" } }\n] }\n",[784,2383,2384,2398,2430,2464],{"__ignoreMap":807},[811,2385,2386,2388,2390,2392,2394,2396],{"class":813,"line":814},[811,2387,818],{"class":817},[811,2389,821],{"class":817},[811,2391,1966],{"class":824},[811,2393,828],{"class":817},[811,2395,831],{"class":817},[811,2397,2042],{"class":817},[811,2399,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428],{"class":813,"line":1127},[811,2401,2047],{"class":817},[811,2403,821],{"class":817},[811,2405,979],{"class":839},[811,2407,828],{"class":817},[811,2409,831],{"class":817},[811,2411,834],{"class":817},[811,2413,821],{"class":817},[811,2415,840],{"class":1115},[811,2417,828],{"class":817},[811,2419,831],{"class":817},[811,2421,821],{"class":817},[811,2423,2070],{"class":849},[811,2425,828],{"class":817},[811,2427,855],{"class":817},[811,2429,2077],{"class":817},[811,2431,2432,2434,2436,2439,2441,2443,2445,2447,2449,2451,2453,2455,2458,2460,2462],{"class":813,"line":1181},[811,2433,2047],{"class":817},[811,2435,821],{"class":817},[811,2437,2438],{"class":839},"scheduled_start",[811,2440,828],{"class":817},[811,2442,831],{"class":817},[811,2444,834],{"class":817},[811,2446,821],{"class":817},[811,2448,1395],{"class":1115},[811,2450,828],{"class":817},[811,2452,831],{"class":817},[811,2454,821],{"class":817},[811,2456,2457],{"class":849},"$INTERVAL.30d",[811,2459,828],{"class":817},[811,2461,855],{"class":817},[811,2463,858],{"class":817},[811,2465,2466,2468],{"class":813,"line":1218},[811,2467,1171],{"class":817},[811,2469,858],{"class":817},[780,2471,2472],{},"Periods are calculated by PostgreSQL in the user's time zone, so \"today\" starts at midnight where the user is.",[789,2474,2476],{"id":2475},"how-filters-combine","How filters combine",[1668,2478,2479,2485,2494],{},[1671,2480,2481,2484],{},[797,2482,2483],{},"OR across roles."," A user who is Dispatcher and Technician sees their branch's orders plus the orders assigned to them. If any of their roles allows the action without a filter, they see every row.",[1671,2486,2487,2490,2491,2493],{},[797,2488,2489],{},"AND with the request."," A request's ",[784,2492,786],{}," can only narrow what the filter allows.",[1671,2495,2496,2499],{},[797,2497,2498],{},"A DENY ignores filters."," A denied action is denied for every row.",[789,2501,2503],{"id":2502},"filters-on-writes","Filters on writes",[780,2505,2506],{},"For writes, the filter decides which rows may be touched, and which rows may result:",[885,2508,2509,2519],{},[888,2510,2511],{},[891,2512,2513,2516],{},[894,2514,2515],{},"Action",[894,2517,2518],{},"Filter checked on",[904,2520,2521,2531,2541],{},[891,2522,2523,2528],{},[909,2524,2525],{},[784,2526,2527],{},"CREATE",[909,2529,2530],{},"the new row",[891,2532,2533,2538],{},[909,2534,2535],{},[784,2536,2537],{},"UPDATE",[909,2539,2540],{},"the row before and the row after",[891,2542,2543,2548],{},[909,2544,2545],{},[784,2546,2547],{},"DELETE",[909,2549,2550],{},"the row before",[780,2552,2553,2554,2556,2557,2560,2561,2564],{},"A filter that follows relations works the same on writes: a technician whose filter is ",[784,2555,979],{}," updates only their own orders, and adds parts only to them (",[784,2558,2559],{},"work_order.technician.user","). A Salta dispatcher can't create an order for Jujuy, and can't move a Salta order to Jujuy. The second case fails on the row after, with ",[784,2562,2563],{},"403 ACTION_DENIED",", and nothing is written. PostgreSQL checks the row as it will be stored, after defaults and triggers have run.",[789,2566,2568],{"id":2567},"what-a-caller-sees","What a caller sees",[780,2570,2571,2572,2575,2576,1307],{},"A row outside the filter doesn't exist for that caller. Lists leave it out, ",[784,2573,2574],{},"count"," doesn't count it, and reading it by key returns ",[784,2577,2578],{},"404 ROW_NOT_FOUND",[789,2580,2582],{"id":2581},"what-postgresql-runs","What PostgreSQL runs",[780,2584,2585,2586,2588],{},"A row filter becomes part of the SQL itself, so PostgreSQL applies it. A Dispatcher's filter, ",[784,2587,921],{},", on a read and on an update of an order:",[802,2590,2594],{"className":2591,"code":2592,"language":2593,"meta":807,"style":807},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- A read: the request's own where, AND the role's filter.\nSELECT … FROM \"public\".\"work_orders\" AS t0\nWHERE (t0.\"status\" = $1 AND t0.\"priority\" = $2) AND t0.\"branch\" = $3;    -- $3 = the user's branch, read when the request arrives\n\n-- An update: the old row must pass the filter to be touched, and the new row to be kept.\nWITH old_rows AS (SELECT … FROM \"public\".\"work_orders\" AS t0 WHERE t0.\"id\" = $3 AND t0.\"branch\" = $4 FOR UPDATE OF t0),\n     upd AS (UPDATE \"public\".\"work_orders\" AS t0 SET \"status\" = $1, \"technician\" = $2 FROM old_rows WHERE … RETURNING …)\nSELECT *, (upd.\"branch\" = $5) AS __authorized FROM upd;               -- false: 403 ACTION_DENIED, rolled back\n","sql",[784,2595,2596,2601,2606,2611,2617,2622,2628,2634],{"__ignoreMap":807},[811,2597,2598],{"class":813,"line":814},[811,2599,2600],{},"-- A read: the request's own where, AND the role's filter.\n",[811,2602,2603],{"class":813,"line":1127},[811,2604,2605],{},"SELECT … FROM \"public\".\"work_orders\" AS t0\n",[811,2607,2608],{"class":813,"line":1181},[811,2609,2610],{},"WHERE (t0.\"status\" = $1 AND t0.\"priority\" = $2) AND t0.\"branch\" = $3;    -- $3 = the user's branch, read when the request arrives\n",[811,2612,2613],{"class":813,"line":1218},[811,2614,2616],{"emptyLinePlaceholder":2615},true,"\n",[811,2618,2619],{"class":813,"line":1258},[811,2620,2621],{},"-- An update: the old row must pass the filter to be touched, and the new row to be kept.\n",[811,2623,2625],{"class":813,"line":2624},6,[811,2626,2627],{},"WITH old_rows AS (SELECT … FROM \"public\".\"work_orders\" AS t0 WHERE t0.\"id\" = $3 AND t0.\"branch\" = $4 FOR UPDATE OF t0),\n",[811,2629,2631],{"class":813,"line":2630},7,[811,2632,2633],{},"     upd AS (UPDATE \"public\".\"work_orders\" AS t0 SET \"status\" = $1, \"technician\" = $2 FROM old_rows WHERE … RETURNING …)\n",[811,2635,2637],{"class":813,"line":2636},8,[811,2638,2639],{},"SELECT *, (upd.\"branch\" = $5) AS __authorized FROM upd;               -- false: 403 ACTION_DENIED, rolled back\n",[780,2641,2642,1062,2646,2649],{},[2643,2644,608],"a",{"href":2645},"\u002Fdata-api\u002Freading#the-sql-it-runs",[2643,2647,620],{"href":2648},"\u002Fdata-api\u002Fwriting#the-sql-it-runs"," show the whole statements.",[789,2651,2653],{"id":2652},"next-steps","Next steps",[1668,2655,2656,2662],{},[1671,2657,2658,2661],{},[2643,2659,2660],{"href":562},"Payload checks",": rules on the values a role writes.",[1671,2663,2664,2666],{},[2643,2665,612],{"href":613},": the full syntax.",[2668,2669,2670],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":807,"searchDepth":814,"depth":1127,"links":2672},[2673,2674,2676,2677,2686,2687,2688,2689,2690,2691],{"id":791,"depth":1127,"text":792},{"id":869,"depth":1127,"text":2675},"The user's own fields: $USER",{"id":972,"depth":1127,"text":973},{"id":1030,"depth":1127,"text":1031,"children":2678},[2679,2680,2681,2682,2683,2684,2685],{"id":1045,"depth":1181,"text":429},{"id":1310,"depth":1181,"text":302},{"id":1468,"depth":1181,"text":1469},{"id":1589,"depth":1181,"text":1590},{"id":1713,"depth":1181,"text":1714},{"id":1814,"depth":1181,"text":1815},{"id":1925,"depth":1181,"text":1926},{"id":2278,"depth":1127,"text":2279},{"id":2475,"depth":1127,"text":2476},{"id":2502,"depth":1127,"text":2503},{"id":2567,"depth":1127,"text":2568},{"id":2581,"depth":1127,"text":2582},{"id":2652,"depth":1127,"text":2653},"Limit a grant to some rows with a filter evaluated by PostgreSQL - by the user's own fields, by relations, by time.","md",null,{},{"title":557,"description":2692},"76NUNutbX6wS0z5jIzqSauScETlm4ExPsOzbv4LAV6I",[2699,2701],{"title":553,"path":554,"stem":555,"description":2700,"children":-1},"The role permission matrix step by step: actions, fields, relation paths, and checking the result.",{"title":561,"path":562,"stem":563,"description":2702,"children":-1},"Role-specific rules on the values written - checked by PostgreSQL on the resulting row, and how they differ from a CHECK constraint.",1792339941052]