{
  "request_duration_ms": 189.98207100958098,
  "sum_trace_duration_ms": 53.07253295904957,
  "num_traces": 17,
  "traces": [
    {
      "type": "sql",
      "start": 126900.871455703,
      "end": 126900.874546852,
      "duration_ms": 3.091149003012106,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1890, in ensure_permission\n    if not await self.allowed(action=action, resource=resource, actor=actor):\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1838, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 588, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_6798578 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_6798578": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    },
    {
      "type": "sql",
      "start": 126900.875204805,
      "end": 126900.887077846,
      "duration_ms": 11.873041003127582,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 30, in get\n    db_page = await self.ds.allowed_resources(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1740, in allowed_resources\n    result = await self.get_internal_database().execute(query, params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nbase AS (\n  \n            SELECT database_name AS parent, NULL AS child\n            FROM catalog_databases\n        \n),\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_6798579 AS reason\n            )\n),\nanon_rules AS (\n  SELECT NULL AS parent, NULL AS child, 1 AS allow, :anon_reason_6798580 AS reason\n),\nchild_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nparent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nglobal_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_child_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nanon_parent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_global_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_decisions AS (\n  SELECT\n    b.parent, b.child,\n    CASE\n      WHEN acl.any_deny = 1 THEN 0\n      WHEN acl.any_allow = 1 THEN 1\n      WHEN apl.any_deny = 1 THEN 0\n      WHEN apl.any_allow = 1 THEN 1\n      WHEN agl.any_deny = 1 THEN 0\n      WHEN agl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS anon_is_allowed\n  FROM base b\n  JOIN anon_child_lvl acl ON b.parent = acl.parent AND (b.child = acl.child OR (b.child IS NULL AND acl.child IS NULL))\n  JOIN anon_parent_lvl apl ON b.parent = apl.parent AND (b.child = apl.child OR (b.child IS NULL AND apl.child IS NULL))\n  JOIN anon_global_lvl agl ON b.parent = agl.parent AND (b.child = agl.child OR (b.child IS NULL AND agl.child IS NULL))\n),\ndecisions AS (\n  SELECT\n    b.parent, b.child,\n    -- Cascading permission logic: child \u2192 parent \u2192 global, DENY beats ALLOW at each level\n    -- Priority order:\n    --   1. Child-level deny (most specific, blocks access)\n    --   2. Child-level allow (most specific, grants access)\n    --   3. Parent-level deny (intermediate, blocks access)\n    --   4. Parent-level allow (intermediate, grants access)\n    --   5. Global-level deny (least specific, blocks access)\n    --   6. Global-level allow (least specific, grants access)\n    --   7. Default deny (no rules match)\n    CASE\n      WHEN cl.any_deny = 1 THEN 0\n      WHEN cl.any_allow = 1 THEN 1\n      WHEN pl.any_deny = 1 THEN 0\n      WHEN pl.any_allow = 1 THEN 1\n      WHEN gl.any_deny = 1 THEN 0\n      WHEN gl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS is_allowed,\n    CASE\n      WHEN cl.any_deny = 1 THEN cl.deny_reasons\n      WHEN cl.any_allow = 1 THEN cl.allow_reasons\n      WHEN pl.any_deny = 1 THEN pl.deny_reasons\n      WHEN pl.any_allow = 1 THEN pl.allow_reasons\n      WHEN gl.any_deny = 1 THEN gl.deny_reasons\n      WHEN gl.any_allow = 1 THEN gl.allow_reasons\n      ELSE '[]'\n    END AS reason\n    , CASE WHEN ad.anon_is_allowed = 0 THEN 1 ELSE 0 END AS is_private\n  FROM base b\n  JOIN child_lvl cl ON b.parent = cl.parent AND (b.child = cl.child OR (b.child IS NULL AND cl.child IS NULL))\n  JOIN parent_lvl pl ON b.parent = pl.parent AND (b.child = pl.child OR (b.child IS NULL AND pl.child IS NULL))\n  JOIN global_lvl gl ON b.parent = gl.parent AND (b.child = gl.child OR (b.child IS NULL AND gl.child IS NULL))\n  JOIN anon_decisions ad ON b.parent = ad.parent AND (b.child = ad.child OR (b.child IS NULL AND ad.child IS NULL))\n)\nSELECT parent, child, reason, is_private\nFROM decisions\nWHERE is_allowed = 1\nORDER BY parent, child LIMIT :limit",
      "params": {
        "reason_6798579": "default allow for view-database",
        "action": "view-database",
        "actor": null,
        "actor_id": null,
        "anon_reason_6798580": "default allow for view-database",
        "anon_action": "view-database",
        "anon_actor": null,
        "anon_actor_id": null,
        "limit": 101
      }
    },
    {
      "type": "sql",
      "start": 126900.887617725,
      "end": 126900.919777405,
      "duration_ms": 32.15967999130953,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 38, in get\n    table_page = await self.ds.allowed_resources(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1740, in allowed_resources\n    result = await self.get_internal_database().execute(query, params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nbase AS (\n  \n            SELECT database_name AS parent, table_name AS child\n            FROM catalog_tables\n            UNION ALL\n            SELECT database_name AS parent, view_name AS child\n            FROM catalog_views\n        \n),\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_6798581 AS reason\n            )\n),\nanon_rules AS (\n  SELECT NULL AS parent, NULL AS child, 1 AS allow, :anon_reason_6798582 AS reason\n),\nchild_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nparent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nglobal_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow,\n         json_group_array(CASE WHEN ar.allow = 0 THEN ar.source_plugin || ': ' || ar.reason END) AS deny_reasons,\n         json_group_array(CASE WHEN ar.allow = 1 THEN ar.source_plugin || ': ' || ar.reason END) AS allow_reasons\n  FROM base b\n  LEFT JOIN all_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_child_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child = b.child\n  GROUP BY b.parent, b.child\n),\nanon_parent_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent = b.parent AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_global_lvl AS (\n  SELECT b.parent, b.child,\n         MAX(CASE WHEN ar.allow = 0 THEN 1 ELSE 0 END) AS any_deny,\n         MAX(CASE WHEN ar.allow = 1 THEN 1 ELSE 0 END) AS any_allow\n  FROM base b\n  LEFT JOIN anon_rules ar ON ar.parent IS NULL AND ar.child IS NULL\n  GROUP BY b.parent, b.child\n),\nanon_decisions AS (\n  SELECT\n    b.parent, b.child,\n    CASE\n      WHEN acl.any_deny = 1 THEN 0\n      WHEN acl.any_allow = 1 THEN 1\n      WHEN apl.any_deny = 1 THEN 0\n      WHEN apl.any_allow = 1 THEN 1\n      WHEN agl.any_deny = 1 THEN 0\n      WHEN agl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS anon_is_allowed\n  FROM base b\n  JOIN anon_child_lvl acl ON b.parent = acl.parent AND (b.child = acl.child OR (b.child IS NULL AND acl.child IS NULL))\n  JOIN anon_parent_lvl apl ON b.parent = apl.parent AND (b.child = apl.child OR (b.child IS NULL AND apl.child IS NULL))\n  JOIN anon_global_lvl agl ON b.parent = agl.parent AND (b.child = agl.child OR (b.child IS NULL AND agl.child IS NULL))\n),\ndecisions AS (\n  SELECT\n    b.parent, b.child,\n    -- Cascading permission logic: child \u2192 parent \u2192 global, DENY beats ALLOW at each level\n    -- Priority order:\n    --   1. Child-level deny (most specific, blocks access)\n    --   2. Child-level allow (most specific, grants access)\n    --   3. Parent-level deny (intermediate, blocks access)\n    --   4. Parent-level allow (intermediate, grants access)\n    --   5. Global-level deny (least specific, blocks access)\n    --   6. Global-level allow (least specific, grants access)\n    --   7. Default deny (no rules match)\n    CASE\n      WHEN cl.any_deny = 1 THEN 0\n      WHEN cl.any_allow = 1 THEN 1\n      WHEN pl.any_deny = 1 THEN 0\n      WHEN pl.any_allow = 1 THEN 1\n      WHEN gl.any_deny = 1 THEN 0\n      WHEN gl.any_allow = 1 THEN 1\n      ELSE 0\n    END AS is_allowed,\n    CASE\n      WHEN cl.any_deny = 1 THEN cl.deny_reasons\n      WHEN cl.any_allow = 1 THEN cl.allow_reasons\n      WHEN pl.any_deny = 1 THEN pl.deny_reasons\n      WHEN pl.any_allow = 1 THEN pl.allow_reasons\n      WHEN gl.any_deny = 1 THEN gl.deny_reasons\n      WHEN gl.any_allow = 1 THEN gl.allow_reasons\n      ELSE '[]'\n    END AS reason\n    , CASE WHEN ad.anon_is_allowed = 0 THEN 1 ELSE 0 END AS is_private\n  FROM base b\n  JOIN child_lvl cl ON b.parent = cl.parent AND (b.child = cl.child OR (b.child IS NULL AND cl.child IS NULL))\n  JOIN parent_lvl pl ON b.parent = pl.parent AND (b.child = pl.child OR (b.child IS NULL AND pl.child IS NULL))\n  JOIN global_lvl gl ON b.parent = gl.parent AND (b.child = gl.child OR (b.child IS NULL AND gl.child IS NULL))\n  JOIN anon_decisions ad ON b.parent = ad.parent AND (b.child = ad.child OR (b.child IS NULL AND ad.child IS NULL))\n)\nSELECT parent, child, reason, is_private\nFROM decisions\nWHERE is_allowed = 1\nORDER BY parent, child LIMIT :limit",
      "params": {
        "reason_6798581": "default allow for view-table",
        "action": "view-table",
        "actor": null,
        "actor_id": null,
        "anon_reason_6798582": "default allow for view-table",
        "anon_action": "view-table",
        "anon_actor": null,
        "anon_actor_id": null,
        "limit": 101
      }
    },
    {
      "type": "sql",
      "start": 126900.920981463,
      "end": 126900.921291238,
      "duration_ms": 0.3097750013694167,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.922747477,
      "end": 126900.923105724,
      "duration_ms": 0.35824699443764985,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.923302184,
      "end": 126900.923735913,
      "duration_ms": 0.4337290010880679,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 74, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 592, in table_counts\n    for table in await self.table_names():\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 641, in table_names\n    results = await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select name from sqlite_master where type='table' order by name",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.923890498,
      "end": 126900.924288532,
      "duration_ms": 0.39803399704396725,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 74, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 595, in table_counts\n    await self.execute(\n"
      ],
      "error": null,
      "database": "counters",
      "sql": "select count(*) from (select * from [counters] limit 10001)",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.926678432,
      "end": 126900.926984863,
      "duration_ms": 0.30643100035376847,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.927146071,
      "end": 126900.927523266,
      "duration_ms": 0.37719499960076064,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 74, in get\n    table_counts = await db.table_counts(10)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 592, in table_counts\n    for table in await self.table_names():\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 641, in table_names\n    results = await self.execute(\n"
      ],
      "error": null,
      "database": "ephemeral",
      "sql": "select name from sqlite_master where type='table' order by name",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.929365059,
      "end": 126900.929644996,
      "duration_ms": 0.27993699768558145,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "extra_database",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126900.947315881,
      "end": 126900.947795637,
      "duration_ms": 0.47975599591154605,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "fixtures",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126901.013798047,
      "end": 126901.014149863,
      "duration_ms": 0.35181599378120154,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 61, in get\n    view_names_set = set(await db.view_names())\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/database.py\", line 749, in view_names\n    results = await self.execute(\"select name from sqlite_master where type='view'\")\n"
      ],
      "error": null,
      "database": "fixtures2",
      "sql": "select name from sqlite_master where type='view'",
      "params": null
    },
    {
      "type": "sql",
      "start": 126901.052191233,
      "end": 126901.052625068,
      "duration_ms": 0.4338349972385913,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/base.py\", line 134, in dispatch_request\n    response = await handler(request)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 178, in get\n    \"metadata\": await self.ds.get_instance_metadata(),\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 926, in get_instance_metadata\n    rows = await self.get_internal_database().execute(\"\"\"\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "SELECT\n                key,\n                value\n              FROM metadata_instance",
      "params": null
    },
    {
      "type": "sql",
      "start": 126901.053211267,
      "end": 126901.053824429,
      "duration_ms": 0.6131619884399697,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/views/index.py\", line 180, in get\n    \"private\": not await self.ds.allowed(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1838, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 588, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_6798588 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_6798588": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    },
    {
      "type": "sql",
      "start": 126901.05442615,
      "end": 126901.054788503,
      "duration_ms": 0.3623529919423163,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 2176, in render_template\n    extra_script = await await_me_maybe(extra_script)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/__init__.py\", line 175, in await_me_maybe\n    value = await value\n",
        "  File \"plugins/my_plugin.py\", line 96, in inner\n    await datasette.get_database().execute(\"select 3 * 5\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select 3 * 5",
      "params": null
    },
    {
      "type": "sql",
      "start": 126901.055111508,
      "end": 126901.055390768,
      "duration_ms": 0.27925999893341213,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 2279, in _asset_urls\n    hook = await await_me_maybe(hook)\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/__init__.py\", line 175, in await_me_maybe\n    value = await value\n",
        "  File \"plugins/my_plugin.py\", line 53, in inner\n    await datasette.get_database().execute(\"select 3 * 5\")\n"
      ],
      "error": null,
      "database": "_memory",
      "sql": "select 3 * 5",
      "params": null
    },
    {
      "type": "sql",
      "start": 126901.05621083,
      "end": 126901.057175963,
      "duration_ms": 0.965133003774099,
      "traceback": [
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1496, in _crumb_items\n    if await self.allowed(action=\"view-instance\", actor=actor):\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/app.py\", line 1838, in allowed\n    result = await check_permission_for_resource(\n",
        "  File \"/usr/local/lib/python3.11/site-packages/datasette/utils/actions_sql.py\", line 588, in check_permission_for_resource\n    result = await datasette.get_internal_database().execute(query, all_params)\n"
      ],
      "error": null,
      "database": "__INTERNAL__",
      "sql": "WITH\nall_rules AS (\n  SELECT parent, child, allow, reason, 'datasette.default_permissions' AS source_plugin FROM (\n                SELECT NULL AS parent, NULL AS child, 1 AS allow, :reason_6798589 AS reason\n            )\n),\nmatched_rules AS (\n  SELECT ar.*,\n    CASE\n      WHEN ar.child IS NOT NULL THEN 2  -- child-level (most specific)\n      WHEN ar.parent IS NOT NULL THEN 1  -- parent-level\n      ELSE 0                             -- root/global\n    END AS depth\n  FROM all_rules ar\n  WHERE (ar.parent IS NULL OR ar.parent = :_check_parent)\n    AND (ar.child IS NULL OR ar.child = :_check_child)\n),\nwinner AS (\n  SELECT *\n  FROM matched_rules\n  ORDER BY\n    depth DESC,                          -- specificity first (higher depth wins)\n    CASE WHEN allow=0 THEN 0 ELSE 1 END, -- then deny over allow\n    source_plugin                        -- stable tie-break\n  LIMIT 1\n)\nSELECT COALESCE((SELECT allow FROM winner), 0) AS is_allowed",
      "params": {
        "reason_6798589": "default allow for view-instance",
        "action": "view-instance",
        "actor": null,
        "actor_id": null,
        "_check_parent": null,
        "_check_child": null
      }
    }
  ]
}