From 8486b5d098e426ecf1524ba533cd2d1b318c4fdd Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 15 Oct 2026 22:29:41 +1300 Subject: [PATCH 1/3] fix(aggregates): refuse a floating aggregate that overflows a double MariaDB and MySQL hold a DOUBLE sum or average that overflowed as infinity but write it as `0` over the text protocol, so aggregate() answered "0" for a sum of two 1e308 readings. MariaDB's STDDEV also turns an infinite or undefined variance into DBL_MAX or NULL, and its VARIANCE goes out as `0`. SQLite answers infinity outright. PostgreSQL alone raised its own range error. The MariaDB and MySQL builders compile SUM, AVG and the variance aggregates through `+ 0`, and STDDEV as SQRT(variance + 0): the addition runs the engine's float range check, which raises error 1690 for a value that is not finite. The adapter already maps 1690 to Exception\Limit, as for stddev. An unaliased aggregate keeps the column name the engine gave it. aggregate() refuses a non-finite sum, average, deviation or variance with the same Limit error, which covers SQLite. The statement count() and sum() write out instead of building now takes its aggregate from the dialect builder, so it stays the statement the builder makes, and sum() raises the same error on MariaDB and MySQL. Co-Authored-By: Claude Opus 5.5 --- src/Database/Adapter/SQL.php | 16 +-- src/Database/Builder/MariaDB.php | 5 +- src/Database/Builder/MySQL.php | 5 +- src/Database/Builder/RaisesFloatOverflow.php | 42 ++++++++ src/Database/Trait/Documents.php | 54 +++++++++- tests/e2e/Adapter/Scopes/AggregationTests.php | 62 ++++++++++++ .../unit/Adapter/Data/Builder/statements.json | 8 +- tests/unit/AggregateOverflowTest.php | 98 +++++++++++++++++++ tests/unit/Builder/FloatOverflowTest.php | 66 +++++++++++++ tests/unit/EmptySetAggregateContractTest.php | 2 +- .../unit/StatisticalAggregateContractTest.php | 12 ++- 11 files changed, 347 insertions(+), 23 deletions(-) create mode 100644 src/Database/Builder/RaisesFloatOverflow.php create mode 100644 tests/unit/AggregateOverflowTest.php create mode 100644 tests/unit/Builder/FloatOverflowTest.php diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 6780fe816..c901ab8a8 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -1940,7 +1940,7 @@ public function count(Document $collection, array $queries = [], ?int $max = nul } if ($otherQueries === []) { - return $this->countOf($this->fetchAggregate($collectionDoc, $name, $roles, 'COUNT(1)', '1', $max, Event::DocumentCount)); + return $this->countOf($this->fetchAggregate($collectionDoc, $name, $roles, Query::count('1', 'sum'), '1', $max, Event::DocumentCount)); } $otherQueries = $this->mainRowQueries($otherQueries, $collectionDoc); @@ -1948,7 +1948,7 @@ public function count(Document $collection, array $queries = [], ?int $max = nul $filters = $this->compileRowFilters($builder, $otherQueries); if ($filters !== null) { - return $this->countOf($this->fetchAggregate($collectionDoc, $name, $roles, 'COUNT(1)', '1', $max, Event::DocumentCount, $filters)); + return $this->countOf($this->fetchAggregate($collectionDoc, $name, $roles, Query::count('1', 'sum'), '1', $max, Event::DocumentCount, $filters)); } $this->applyFilters($builder, $otherQueries, $name, $alias); @@ -2017,7 +2017,7 @@ public function sum(Document $collection, string $attribute, array $queries = [] $column = $this->quote($attribute); if ($otherQueries === []) { - return $this->sumOf($this->fetchAggregate($collectionDoc, $name, $roles, "SUM({$column})", $column, $max, Event::DocumentSum)); + return $this->sumOf($this->fetchAggregate($collectionDoc, $name, $roles, Query::sum($attribute, 'sum'), $column, $max, Event::DocumentSum)); } $otherQueries = $this->mainRowQueries($otherQueries, $collectionDoc); @@ -2025,7 +2025,7 @@ public function sum(Document $collection, string $attribute, array $queries = [] $filters = $this->compileRowFilters($builder, $otherQueries); if ($filters !== null) { - return $this->sumOf($this->fetchAggregate($collectionDoc, $name, $roles, "SUM({$column})", $column, $max, Event::DocumentSum, $filters)); + return $this->sumOf($this->fetchAggregate($collectionDoc, $name, $roles, Query::sum($attribute, 'sum'), $column, $max, Event::DocumentSum, $filters)); } $this->applyFilters($builder, $otherQueries, $name, $alias); @@ -2184,7 +2184,7 @@ private function qualifySumSelect(string $attribute, array $joinTablePrefixes, D * @param array $roles * @return array */ - private function fetchAggregate(Document $collection, string $name, array $roles, string $aggregate, string $column, ?int $max, Event $event, ?Condition $filters = null): array + private function fetchAggregate(Document $collection, string $name, array $roles, BaseQuery $aggregate, string $column, ?int $max, Event $event, ?Condition $filters = null): array { $alias = Query::DEFAULT_ALIAS; $conditions = []; @@ -2212,11 +2212,11 @@ private function fetchAggregate(Document $collection, string $name, array $roles $rows .= ' WHERE '.\implode(' AND ', $conditions); } - $sum = $this->quote('sum'); + $selection = $this->dialectBuilder()->compileAggregate($aggregate); if ($max === null) { - $sql = "SELECT {$aggregate} AS {$sum} FROM {$rows}"; + $sql = "SELECT {$selection} FROM {$rows}"; } else { - $sql = "SELECT {$aggregate} AS {$sum} FROM (SELECT {$column} FROM {$rows} LIMIT ?) AS {$this->quote('table_count')}"; + $sql = "SELECT {$selection} FROM (SELECT {$column} FROM {$rows} LIMIT ?) AS {$this->quote('table_count')}"; $bindings[] = $max; } diff --git a/src/Database/Builder/MariaDB.php b/src/Database/Builder/MariaDB.php index 3ed662874..745b7092f 100644 --- a/src/Database/Builder/MariaDB.php +++ b/src/Database/Builder/MariaDB.php @@ -5,14 +5,15 @@ use Utopia\Query\Builder\MariaDB as Base; /** - * The MariaDB builder, which also compiles filters on their own and prepares search terms and matches containsAll() - * as 7.x did. + * The MariaDB builder, which also compiles filters on their own and prepares search terms, matches containsAll() + * as 7.x did and raises a floating aggregate that overflowed. */ class MariaDB extends Base implements Filtering, Scoping { use CompilesFilters; use MatchesContainsAllPatterns; use PreparesSearchTerms; + use RaisesFloatOverflow; use RefusesJoinedWrites; use ScopesCollections; } diff --git a/src/Database/Builder/MySQL.php b/src/Database/Builder/MySQL.php index 3a4dee005..4ac3e57cc 100644 --- a/src/Database/Builder/MySQL.php +++ b/src/Database/Builder/MySQL.php @@ -5,14 +5,15 @@ use Utopia\Query\Builder\MySQL as Base; /** - * The MySQL builder, which also compiles filters on their own and prepares search terms and matches containsAll() - * as 7.x did. + * The MySQL builder, which also compiles filters on their own and prepares search terms, matches containsAll() + * as 7.x did and raises a floating aggregate that overflowed. */ class MySQL extends Base implements Filtering, Scoping { use CompilesFilters; use MatchesContainsAllPatterns; use PreparesSearchTerms; + use RaisesFloatOverflow; use RefusesJoinedWrites; use ScopesCollections; } diff --git a/src/Database/Builder/RaisesFloatOverflow.php b/src/Database/Builder/RaisesFloatOverflow.php new file mode 100644 index 000000000..bdd20c8ce --- /dev/null +++ b/src/Database/Builder/RaisesFloatOverflow.php @@ -0,0 +1,42 @@ +getMethod(); + $variance = match ($method) { + Method::Stddev => Method::Variance, + Method::StddevPop => Method::VarPop, + Method::StddevSamp => Method::VarSamp, + default => null, + }; + + if ($variance === null && ! \in_array($method, self::CHECKED_AGGREGATES, true)) { + return parent::compileAggregate($query); + } + + $expression = parent::compileAggregate(new Query($method, $query->getAttribute())); + $checked = $variance === null + ? $expression.' + 0' + : 'SQRT('.parent::compileAggregate(new Query($variance, $query->getAttribute())).' + 0)'; + + $alias = $query->getAlias(); + + return $checked.' AS '.($alias === '' ? $this->quoteLiteral($expression) : $this->quote($alias)); + } +} diff --git a/src/Database/Trait/Documents.php b/src/Database/Trait/Documents.php index 146782c0d..201d8c6cd 100644 --- a/src/Database/Trait/Documents.php +++ b/src/Database/Trait/Documents.php @@ -73,6 +73,17 @@ trait Documents { + private const array FLOATING_AGGREGATES = [ + Method::Sum, + Method::Avg, + Method::Stddev, + Method::StddevPop, + Method::StddevSamp, + Method::Variance, + Method::VarPop, + Method::VarSamp, + ]; + private const string DOCUMENT_CACHE_ACTIVE_PREFIX = 'active:'; private const string DOCUMENT_CACHE_BLOCKED_PREFIX = 'blocked:'; @@ -4933,6 +4944,7 @@ private function pages( * @return list> * * @throws DatabaseException + * @throws LimitException When a sum, average, deviation or variance overflows the range of a double * @throws QueryException When the queries hold no aggregate or groupBy */ public function aggregate(string $collection, array $queries): array @@ -4940,9 +4952,14 @@ public function aggregate(string $collection, array $queries): array $definition = $this->silent(fn () => $this->getCollection($collection)); $queries = self::aliasAggregates($this->rewriteQueries(Event::DocumentAggregate, $definition, $queries)); + $floating = self::floatingAggregates($queries); $rows = []; foreach ($this->fetch($definition, $queries, PermissionType::Read, true) as $row) { - $rows[] = $row->getArrayCopy(); + $row = $row->getArrayCopy(); + foreach ($floating as $alias) { + self::assertFinite($row[$alias] ?? null); + } + $rows[] = $row; } $listeners = $this->listens(Event::DocumentAggregate); @@ -4953,6 +4970,41 @@ public function aggregate(string $collection, array $queries): array return $rows; } + /** + * @param array $queries Each aggregate aliased by aliasAggregates() + * @return list + */ + private static function floatingAggregates(array $queries): array + { + $aliases = []; + foreach ($queries as $query) { + if (\in_array($query->getMethod(), self::FLOATING_AGGREGATES, true)) { + $aliases[] = $query->getAlias(); + } + } + + return $aliases; + } + + /** + * SQLite answers a double that overflowed with infinity, which no caller can tell from a value, so it is refused + * as MariaDB, MySQL and PostgreSQL refuse it. + * + * @throws LimitException + */ + private static function assertFinite(mixed $value): void + { + $finite = match (true) { + \is_float($value) => \is_finite($value), + \is_string($value) => \preg_match('/^[+-]?(inf|infinity|nan)$/i', $value) !== 1, + default => true, + }; + + if (! $finite) { + throw new LimitException('Value out of range'); + } + } + /** * @param array $queries * @return array diff --git a/tests/e2e/Adapter/Scopes/AggregationTests.php b/tests/e2e/Adapter/Scopes/AggregationTests.php index 709b0c506..b9cc4578b 100644 --- a/tests/e2e/Adapter/Scopes/AggregationTests.php +++ b/tests/e2e/Adapter/Scopes/AggregationTests.php @@ -15,6 +15,7 @@ use Utopia\Database\Collection; use Utopia\Database\Database; use Utopia\Database\Document; +use Utopia\Database\Exception\Limit as LimitException; use Utopia\Database\Exception\NotFound as NotFoundException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Index; @@ -1559,6 +1560,67 @@ public function testStddevAndVarianceArePopulationOnEveryAdapter(): void $database->deleteCollection('stat_contract'); } + /** + * MariaDB and MySQL sent a double aggregate that overflowed as `0`, and MariaDB's STDDEV answered an overflowing + * variance with NULL. An aggregate past the range of a double is refused on every engine instead of answered with + * a wrong number. + */ + public function testFloatAggregateOverflowIsRefused(): void + { + $database = static::getDatabase(); + if (! $database->getAdapter()->supports(Capability::Aggregations)) { + $this->expectNotToPerformAssertions(); + + return; + } + + $collection = 'agg_overflow'.$this->getAggSuffix(); + $database->createCollection(Collection::create( + id: $collection, + attributes: [ + Attribute::string(key: 'series', size: 20, required: true), + Attribute::double(key: 'reading', required: true), + ], + permissions: [Permission::create(Role::any()), Permission::read(Role::any())], + )); + foreach ([['huge', 1e308], ['huge', 1e308], ['spread', 1e308], ['spread', -1e308], ['spread', 0.0], ['single', 1e308]] as [$series, $reading]) { + $database->createDocument($collection, new Document([ + 'series' => $series, + 'reading' => $reading, + '$permissions' => [Permission::read(Role::any())], + ])); + } + + $overflows = [ + [Query::equal('series', ['huge']), Query::sum('reading', 'result')], + [Query::equal('series', ['huge']), Query::avg('reading', 'result')], + [Query::sum('reading', 'result'), Query::groupBy(['series'])], + ]; + if (! $database->getAdapter() instanceof SQLite) { + $overflows[] = [Query::equal('series', ['spread']), Query::stddevPop('reading', 'result')]; + $overflows[] = [Query::equal('series', ['spread']), Query::varSamp('reading', 'result')]; + } + + foreach ($overflows as $queries) { + try { + $database->aggregate($collection, $queries); + $this->fail('An aggregate that overflows a double is refused'); + } catch (LimitException) { + $this->addToAssertionCount(1); + } + } + + $single = $database->aggregate($collection, [ + Query::equal('series', ['single']), + Query::sum('reading', 'total'), + Query::avg('reading', 'mean'), + ]); + $this->assertEqualsWithDelta(1e308, $this->numericAttribute($single[0], 'total'), 1e293); + $this->assertEqualsWithDelta(1e308, $this->numericAttribute($single[0], 'mean'), 1e293); + + $database->deleteCollection($collection); + } + public function testStddevPopOfPrice(): void { $database = static::getDatabase(); diff --git a/tests/unit/Adapter/Data/Builder/statements.json b/tests/unit/Adapter/Data/Builder/statements.json index a9b2416d6..e62e4b551 100644 --- a/tests/unit/Adapter/Data/Builder/statements.json +++ b/tests/unit/Adapter/Data/Builder/statements.json @@ -1,8 +1,8 @@ { - "MariaDB\/plain": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` WHERE `book`.`pages` > ? ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[10,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?)",["authors"]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",["a1"]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms`",[]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId`",[]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` GROUP BY `name`",[]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?)",["renamed","a1"]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",["a1"]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors`",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors"],[1,"database/namespace_authors"]]],["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors_perms"],[1,"database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`) VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",[[1,"a1"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = VALUES(`_permissions`), `_updatedAt` = VALUES(`_updatedAt`), `name` = VALUES(`name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,"a1"],[4,"2026-09-30 00:00:00.000"],[5,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ?) LIMIT ?",[[1,"any"],[2,"read"],[3,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL)) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?) AS `table_count`",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]}}}, - "MariaDB\/shared": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,7,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND `review`._tenant IN (?) WHERE `book`.`pages` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[7,7,10,7,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?) AND (`database`.`namespace__metadata`._tenant IN (?) OR `database`.`namespace__metadata`._tenant IS NULL)",["authors",7]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND `database`.`namespace_authors_perms`._tenant IN (?)",["a1",7]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms` WHERE (`database`.`namespace__metadata_perms`._tenant IN (?) OR `database`.`namespace__metadata_perms`._tenant IS NULL)",[7]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND `review`._tenant IN (?) WHERE (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND (`review`._tenant IN (?) OR `review`.`_uid` IS NULL)",[7,7,7,7]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?) GROUP BY `name`",[7]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["renamed","a1",7]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["a1",7]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?)",[7]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors"],[1,"database/namespace_authors"]]],["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors_perms"],[1,"database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`, `_tenant`) VALUES (?, ?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"],[6,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?), (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,7],[5,"a1"],[6,"update"],[7,"user:1"],[8,7]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,7]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"],[4,7]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"],[4,7]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_tenant`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = IF(_tenant = VALUES(_tenant), VALUES(`_permissions`), `_permissions`), `_updatedAt` = IF(_tenant = VALUES(_tenant), VALUES(`_updatedAt`), `_updatedAt`), `name` = IF(_tenant = VALUES(_tenant), VALUES(`name`), `name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,7],[4,"a1"],[5,"2026-09-30 00:00:00.000"],[6,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_tenant` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,7],[3,"read"],[4,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"],[4,7]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?",[[1,"one"],[2,7],[3,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ? AND _tenant IN (?)) WHERE `table_main`._tenant IN (?) LIMIT ?",[[1,7],[2,"any"],[3,"read"],[4,7],[5,7],[6,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL))) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?) AS `table_count`",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]}}}, - "MySQL\/plain": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` WHERE `book`.`pages` > ? ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[10,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?)",["authors"]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",["a1"]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms`",[]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId`",[]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` GROUP BY `name`",[]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?)",["renamed","a1"]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",["a1"]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors`",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :name\n ",[[":name","database/namespace_authors"]]],["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :permissions\n ",[[":permissions","database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`) VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",[[1,"a1"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = VALUES(`_permissions`), `_updatedAt` = VALUES(`_updatedAt`), `name` = VALUES(`name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,"a1"],[4,"2026-09-30 00:00:00.000"],[5,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ?) LIMIT ?",[[1,"any"],[2,"read"],[3,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL)) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?) AS `table_count`",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]}}}, - "MySQL\/shared": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,7,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND `review`._tenant IN (?) WHERE `book`.`pages` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[7,7,10,7,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?) AND (`database`.`namespace__metadata`._tenant IN (?) OR `database`.`namespace__metadata`._tenant IS NULL)",["authors",7]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND `database`.`namespace_authors_perms`._tenant IN (?)",["a1",7]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms` WHERE (`database`.`namespace__metadata_perms`._tenant IN (?) OR `database`.`namespace__metadata_perms`._tenant IS NULL)",[7]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND `review`._tenant IN (?) WHERE (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND (`review`._tenant IN (?) OR `review`.`_uid` IS NULL)",[7,7,7,7]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?) GROUP BY `name`",[7]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["renamed","a1",7]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["a1",7]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?)",[7]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :name\n ",[[":name","database/namespace_authors"]]],["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :permissions\n ",[[":permissions","database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`, `_tenant`) VALUES (?, ?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"],[6,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?), (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,7],[5,"a1"],[6,"update"],[7,"user:1"],[8,7]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,7]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"],[4,7]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"],[4,7]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_tenant`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = IF(_tenant = VALUES(_tenant), VALUES(`_permissions`), `_permissions`), `_updatedAt` = IF(_tenant = VALUES(_tenant), VALUES(`_updatedAt`), `_updatedAt`), `name` = IF(_tenant = VALUES(_tenant), VALUES(`name`), `name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,7],[4,"a1"],[5,"2026-09-30 00:00:00.000"],[6,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_tenant` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,7],[3,"read"],[4,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"],[4,7]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?",[[1,"one"],[2,7],[3,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ? AND _tenant IN (?)) WHERE `table_main`._tenant IN (?) LIMIT ?",[[1,7],[2,"any"],[3,"read"],[4,7],[5,7],[6,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL))) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?) AS `table_count`",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]}}}, + "MariaDB\/plain": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` WHERE `book`.`pages` > ? ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[10,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?)",["authors"]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",["a1"]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms`",[]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId`",[]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` GROUP BY `name`",[]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?)",["renamed","a1"]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",["a1"]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors`",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors"],[1,"database/namespace_authors"]]],["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors_perms"],[1,"database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`) VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",[[1,"a1"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = VALUES(`_permissions`), `_updatedAt` = VALUES(`_updatedAt`), `name` = VALUES(`name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,"a1"],[4,"2026-09-30 00:00:00.000"],[5,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ?) LIMIT ?",[[1,"any"],[2,"read"],[3,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL)) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?) AS `table_count`",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) + 0 AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]}}}, + "MariaDB\/shared": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,7,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND `review`._tenant IN (?) WHERE `book`.`pages` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[7,7,10,7,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?) AND (`database`.`namespace__metadata`._tenant IN (?) OR `database`.`namespace__metadata`._tenant IS NULL)",["authors",7]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND `database`.`namespace_authors_perms`._tenant IN (?)",["a1",7]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms` WHERE (`database`.`namespace__metadata_perms`._tenant IN (?) OR `database`.`namespace__metadata_perms`._tenant IS NULL)",[7]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND `review`._tenant IN (?) WHERE (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND (`review`._tenant IN (?) OR `review`.`_uid` IS NULL)",[7,7,7,7]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?) GROUP BY `name`",[7]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["renamed","a1",7]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["a1",7]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?)",[7]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors"],[1,"database/namespace_authors"]]],["SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) FROM `INFORMATION_SCHEMA`.`INNODB_SYS_TABLESPACES` WHERE `NAME` IN (?)",[[1,"database/namespace_authors_perms"],[1,"database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`, `_tenant`) VALUES (?, ?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"],[6,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?), (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,7],[5,"a1"],[6,"update"],[7,"user:1"],[8,7]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,7]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"],[4,7]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"],[4,7]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_tenant`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = IF(_tenant = VALUES(_tenant), VALUES(`_permissions`), `_permissions`), `_updatedAt` = IF(_tenant = VALUES(_tenant), VALUES(`_updatedAt`), `_updatedAt`), `name` = IF(_tenant = VALUES(_tenant), VALUES(`name`), `name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,7],[4,"a1"],[5,"2026-09-30 00:00:00.000"],[6,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_tenant` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,7],[3,"read"],[4,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"],[4,7]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?",[[1,"one"],[2,7],[3,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ? AND _tenant IN (?)) WHERE `table_main`._tenant IN (?) LIMIT ?",[[1,7],[2,"any"],[3,"read"],[4,7],[5,7],[6,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL))) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?) AS `table_count`",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) + 0 AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]}}}, + "MySQL\/plain": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` WHERE `book`.`pages` > ? ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[10,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?)",["authors"]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",["a1"]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms`",[]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId`",[]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` GROUP BY `name`",[]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?)",["renamed","a1"]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",["a1"]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors`",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :name\n ",[[":name","database/namespace_authors"]]],["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :permissions\n ",[[":permissions","database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`) VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?)",[[1,"a1"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = VALUES(`_permissions`), `_updatedAt` = VALUES(`_updatedAt`), `name` = VALUES(`name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,"a1"],[4,"2026-09-30 00:00:00.000"],[5,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ?) LIMIT ?",[[1,"any"],[2,"read"],[3,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL)) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId`) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) LIMIT ?) AS `table_count`",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) + 0 AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]}}}, + "MySQL\/shared": {"reads":{"select":["SELECT `name`, `_uid` FROM `database`.`namespace_authors` WHERE `name` IN (?) AND `_id` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,7,5,2]],"join":["SELECT `database`.`namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `database`.`namespace_authors` JOIN `database`.`namespace_books` AS `book` ON `database`.`namespace_authors`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) LEFT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND `review`._tenant IN (?) WHERE `book`.`pages` > ? AND `database`.`namespace_authors`._tenant IN (?) ORDER BY `database`.`namespace_authors`.`name` ASC LIMIT ?",[7,7,10,7,3]],"metadata":["SELECT `name` FROM `database`.`namespace__metadata` WHERE `_uid` IN (?) AND (`database`.`namespace__metadata`._tenant IN (?) OR `database`.`namespace__metadata`._tenant IS NULL)",["authors",7]],"permissions":["SELECT `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND `database`.`namespace_authors_perms`._tenant IN (?)",["a1",7]],"metadataPermissions":["SELECT `_permission` FROM `database`.`namespace__metadata_perms` WHERE (`database`.`namespace__metadata_perms`._tenant IN (?) OR `database`.`namespace__metadata_perms`._tenant IS NULL)",[7]],"rightJoin":["SELECT `database`.`namespace_authors`.`name`, `review`.`stars` FROM `database`.`namespace_authors` RIGHT JOIN `database`.`namespace_reviews` AS `review` ON `database`.`namespace_authors`.`_uid` = `review`.`authorId` AND (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND `review`._tenant IN (?) WHERE (`database`.`namespace_authors`._tenant IN (?) OR `database`.`namespace_authors`.`_uid` IS NULL) AND (`review`._tenant IN (?) OR `review`.`_uid` IS NULL)",[7,7,7,7]],"aggregate":["SELECT COUNT(*) AS `total` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?) GROUP BY `name`",[7]],"update":["UPDATE `database`.`namespace_authors` SET `name` = ? WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["renamed","a1",7]],"delete":["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND `database`.`namespace_authors`._tenant IN (?)",["a1",7]],"insert":["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `database`.`namespace_authors` WHERE `database`.`namespace_authors`._tenant IN (?)",[7]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT CONNECTION_ID()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT SCHEMA_NAME FROM `INFORMATION_SCHEMA`.`SCHEMATA` WHERE `SCHEMA_NAME` IN (?)",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` IN (?) AND `TABLE_NAME` IN (?)",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT SUM(size) FROM (\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n UNION ALL\n SELECT data_length + index_length AS size\n FROM INFORMATION_SCHEMA.TABLES\n WHERE table_name = ? AND\n table_schema = ?\n ) AS sizes",[[1,"namespace_authors"],[2,"database"],[3,"namespace_authors_perms"],[4,"database"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :name\n ",[[":name","database/namespace_authors"]]],["\n SELECT SUM(FS_BLOCK_SIZE + ALLOCATED_SIZE) \n FROM INFORMATION_SCHEMA.INNODB_TABLESPACES\n WHERE NAME = :permissions\n ",[[":permissions","database/namespace_authors_perms"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`, `_tenant`) VALUES (?, ?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"],[6,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?), (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,7],[5,"a1"],[6,"update"],[7,"user:1"],[8,7]]]]},"update":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,7]]],["SELECT `_document`, `_type`, `_permission` FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"],[4,7]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `database`.`namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_id` IS NULL AND _tenant IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"],[4,7]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `database`.`namespace_authors` WHERE `_uid` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE `_document` IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `database`.`namespace_authors` (`_createdAt`, `_permissions`, `_tenant`, `_uid`, `_updatedAt`, `name`) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `_permissions` = IF(_tenant = VALUES(_tenant), VALUES(`_permissions`), `_permissions`), `_updatedAt` = IF(_tenant = VALUES(_tenant), VALUES(`_updatedAt`), `_updatedAt`), `name` = IF(_tenant = VALUES(_tenant), VALUES(`name`), `name`)",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,7],[4,"a1"],[5,"2026-09-30 00:00:00.000"],[6,"one"]]],["DELETE FROM `database`.`namespace_authors_perms` WHERE ((`_document` IN (?) AND `_tenant` IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,7],[3,"read"],[4,"any"]]],["INSERT INTO `database`.`namespace_authors_perms` (`_document`, `_type`, `_permission`, `_tenant`) VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"],[4,7]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?",[[1,"one"],[2,7],[3,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) AND `book`.`_uid` IN (SELECT _document FROM `database`.`namespace_books_perms` WHERE _permission IN (?) AND _type = ? AND _tenant IN (?)) WHERE `table_main`._tenant IN (?) LIMIT ?",[[1,7],[2,"any"],[3,"read"],[4,7],[5,7],[6,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["(SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM ((SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL))) AS `foj_rows` ORDER BY RAND() LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM ((SELECT 1 FROM `database`.`namespace_authors` AS `table_main` LEFT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND `book`._tenant IN (?) WHERE `table_main`._tenant IN (?)) UNION ALL (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` RIGHT JOIN `database`.`namespace_books` AS `book` ON `table_main`.`_uid` = `book`.`authorId` AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND `book`._tenant IN (?) WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL AND (`table_main`._tenant IN (?) OR `table_main`.`_uid` IS NULL) AND (`book`._tenant IN (?) OR `book`.`_uid` IS NULL)) LIMIT ?) AS `table_count`",[[1,7],[2,7],[3,7],[4,7],[5,7],[6,7],[7,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) + 0 AS `sum` FROM (SELECT `pages` FROM `database`.`namespace_authors` AS `table_main` WHERE `name` IN (?) AND `table_main`._tenant IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,7],[3,5]]]]}}}, "Postgres\/plain": {"reads":{"select":["SELECT \"name\", \"_uid\" FROM \"database\".\"namespace_authors\" WHERE \"name\" IN (?) AND \"_id\" > ? ORDER BY \"_createdAt\" DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT \"database\".\"namespace_authors\".\"name\", \"book\".\"pages\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" JOIN \"database\".\"namespace_books\" AS \"book\" ON \"database\".\"namespace_authors\".\"_uid\" = \"book\".\"authorId\" LEFT JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\" WHERE \"book\".\"pages\" > ? ORDER BY \"database\".\"namespace_authors\".\"name\" ASC LIMIT ?",[10,3]],"metadata":["SELECT \"name\" FROM \"database\".\"namespace__metadata\" WHERE \"_uid\" IN (?)",["authors"]],"permissions":["SELECT \"_type\", \"_permission\" FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?)",["a1"]],"metadataPermissions":["SELECT \"_permission\" FROM \"database\".\"namespace__metadata_perms\"",[]],"rightJoin":["SELECT \"database\".\"namespace_authors\".\"name\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" RIGHT JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\"",[]],"fullOuterJoin":["SELECT \"database\".\"namespace_authors\".\"name\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" FULL OUTER JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\"",[]],"aggregate":["SELECT COUNT(*) AS \"total\" FROM \"database\".\"namespace_authors\" GROUP BY \"name\"",[]],"update":["UPDATE \"database\".\"namespace_authors\" SET \"name\" = ? WHERE \"_uid\" IN (?)",["renamed","a1"]],"delete":["DELETE FROM \"database\".\"namespace_authors\" WHERE \"_uid\" IN (?)",["a1"]],"insert":["INSERT INTO \"database\".\"namespace_authors\" (\"_uid\", \"name\") VALUES (?, ?)",["a9","new"]],"reused":["SELECT \"name\" FROM \"database\".\"namespace_authors\"",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT pg_backend_pid()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT \"schema_name\" FROM information_schema.schemata WHERE \"schema_name\" = ?",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT \"table_name\" FROM information_schema.tables WHERE \"table_schema\" = ? AND \"table_name\" = ?",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT pg_relation_size(?)",[[1,"\"database\".\"namespace_authors\""],[1,"\"database\".\"namespace_authors\""]]],["SELECT pg_relation_size(?)",[[1,"\"database\".\"namespace_authors_perms\""],[1,"\"database\".\"namespace_authors_perms\""]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT pg_total_relation_size(?)",[[1,"\"database\".\"namespace_authors\""],[1,"\"database\".\"namespace_authors\""]]],["SELECT pg_total_relation_size(?)",[[1,"\"database\".\"namespace_authors_perms\""],[1,"\"database\".\"namespace_authors_perms\""]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO \"database\".\"namespace_authors\" (\"_uid\", \"name\", \"_createdAt\", \"_updatedAt\", \"_permissions\") VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\") VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE \"database\".\"namespace_authors\" SET \"name\" = ?, \"_createdAt\" = ?, \"_updatedAt\" = ?, \"_permissions\" = ? WHERE \"_id\" IS NULL",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"]]],["SELECT \"_document\", \"_type\", \"_permission\" FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?)",[[1,"a1"]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\") VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE \"database\".\"namespace_authors\" SET \"_uid\" = ?, \"name\" = ?, \"_createdAt\" = ?, \"_updatedAt\" = ?, \"_permissions\" = ? WHERE \"_id\" IS NULL",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?)",[[1,"a1"]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\") VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM \"database\".\"namespace_authors\" WHERE \"_uid\" IN (?)",[[1,"a1"]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO \"database\".\"namespace_authors\" AS \"target\" (\"_createdAt\", \"_permissions\", \"_uid\", \"_updatedAt\", \"name\") VALUES (?, ?, ?, ?, ?) ON CONFLICT (\"_uid\") DO UPDATE SET \"_permissions\" = EXCLUDED.\"_permissions\", \"_updatedAt\" = EXCLUDED.\"_updatedAt\", \"name\" = EXCLUDED.\"name\"",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,"a1"],[4,"2026-09-30 00:00:00.000"],[5,"one"]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE ((\"_document\" IN (?) AND \"_type\" IN (?) AND \"_permission\" IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\") VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" AND (\"book\".\"_permissions\" @> ?::jsonb) LIMIT ?",[[1,"[\"read(\\\"any\\\")\"]"],[2,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" ORDER BY RANDOM() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS \"sum\" FROM (SELECT 1 FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" LIMIT ?) AS \"table_count\"",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS \"sum\" FROM (SELECT 1 FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) LIMIT ?) AS \"table_count\"",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(\"pages\") AS \"sum\" FROM (SELECT \"pages\" FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) LIMIT ?) AS \"table_count\"",[[1,"one"],[2,5]]]]}}}, "Postgres\/shared": {"reads":{"select":["SELECT \"name\", \"_uid\" FROM \"database\".\"namespace_authors\" WHERE \"name\" IN (?) AND \"_id\" > ? AND \"database\".\"namespace_authors\"._tenant IN (?) ORDER BY \"_createdAt\" DESC LIMIT ? OFFSET ?",["x",3,7,5,2]],"join":["SELECT \"database\".\"namespace_authors\".\"name\", \"book\".\"pages\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" JOIN \"database\".\"namespace_books\" AS \"book\" ON \"database\".\"namespace_authors\".\"_uid\" = \"book\".\"authorId\" AND \"book\"._tenant IN (?) LEFT JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\" AND \"review\"._tenant IN (?) WHERE \"book\".\"pages\" > ? AND \"database\".\"namespace_authors\"._tenant IN (?) ORDER BY \"database\".\"namespace_authors\".\"name\" ASC LIMIT ?",[7,7,10,7,3]],"metadata":["SELECT \"name\" FROM \"database\".\"namespace__metadata\" WHERE \"_uid\" IN (?) AND (\"database\".\"namespace__metadata\"._tenant IN (?) OR \"database\".\"namespace__metadata\"._tenant IS NULL)",["authors",7]],"permissions":["SELECT \"_type\", \"_permission\" FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?) AND \"database\".\"namespace_authors_perms\"._tenant IN (?)",["a1",7]],"metadataPermissions":["SELECT \"_permission\" FROM \"database\".\"namespace__metadata_perms\" WHERE (\"database\".\"namespace__metadata_perms\"._tenant IN (?) OR \"database\".\"namespace__metadata_perms\"._tenant IS NULL)",[7]],"rightJoin":["SELECT \"database\".\"namespace_authors\".\"name\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" RIGHT JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\" AND (\"database\".\"namespace_authors\"._tenant IN (?) OR \"database\".\"namespace_authors\".\"_uid\" IS NULL) AND \"review\"._tenant IN (?) WHERE (\"database\".\"namespace_authors\"._tenant IN (?) OR \"database\".\"namespace_authors\".\"_uid\" IS NULL) AND (\"review\"._tenant IN (?) OR \"review\".\"_uid\" IS NULL)",[7,7,7,7]],"fullOuterJoin":["SELECT \"database\".\"namespace_authors\".\"name\", \"review\".\"stars\" FROM \"database\".\"namespace_authors\" FULL OUTER JOIN \"database\".\"namespace_reviews\" AS \"review\" ON \"database\".\"namespace_authors\".\"_uid\" = \"review\".\"authorId\" AND (\"database\".\"namespace_authors\"._tenant IN (?) OR \"database\".\"namespace_authors\".\"_uid\" IS NULL) AND \"review\"._tenant IN (?) WHERE (\"database\".\"namespace_authors\"._tenant IN (?) OR \"database\".\"namespace_authors\".\"_uid\" IS NULL) AND (\"review\"._tenant IN (?) OR \"review\".\"_uid\" IS NULL)",[7,7,7,7]],"aggregate":["SELECT COUNT(*) AS \"total\" FROM \"database\".\"namespace_authors\" WHERE \"database\".\"namespace_authors\"._tenant IN (?) GROUP BY \"name\"",[7]],"update":["UPDATE \"database\".\"namespace_authors\" SET \"name\" = ? WHERE \"_uid\" IN (?) AND \"database\".\"namespace_authors\"._tenant IN (?)",["renamed","a1",7]],"delete":["DELETE FROM \"database\".\"namespace_authors\" WHERE \"_uid\" IN (?) AND \"database\".\"namespace_authors\"._tenant IN (?)",["a1",7]],"insert":["INSERT INTO \"database\".\"namespace_authors\" (\"_uid\", \"name\") VALUES (?, ?)",["a9","new"]],"reused":["SELECT \"name\" FROM \"database\".\"namespace_authors\" WHERE \"database\".\"namespace_authors\"._tenant IN (?)",[7]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[["SELECT pg_backend_pid()",[]]]},"exists":{"outcome":"ok","statements":[["SELECT \"schema_name\" FROM information_schema.schemata WHERE \"schema_name\" = ?",[[1,"database"]]]]},"collectionExists":{"outcome":"ok","statements":[["SELECT \"table_name\" FROM information_schema.tables WHERE \"table_schema\" = ? AND \"table_name\" = ?",[[1,"database"],[2,"namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["SELECT pg_relation_size(?)",[[1,"\"database\".\"namespace_authors\""],[1,"\"database\".\"namespace_authors\""]]],["SELECT pg_relation_size(?)",[[1,"\"database\".\"namespace_authors_perms\""],[1,"\"database\".\"namespace_authors_perms\""]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["SELECT pg_total_relation_size(?)",[[1,"\"database\".\"namespace_authors\""],[1,"\"database\".\"namespace_authors\""]]],["SELECT pg_total_relation_size(?)",[[1,"\"database\".\"namespace_authors_perms\""],[1,"\"database\".\"namespace_authors_perms\""]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO \"database\".\"namespace_authors\" (\"_uid\", \"name\", \"_createdAt\", \"_updatedAt\", \"_permissions\", \"_tenant\") VALUES (?, ?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"],[6,7]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\", \"_tenant\") VALUES (?, ?, ?, ?), (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,7],[5,"a1"],[6,"update"],[7,"user:1"],[8,7]]]]},"update":{"outcome":"ok","statements":[["UPDATE \"database\".\"namespace_authors\" SET \"name\" = ?, \"_createdAt\" = ?, \"_updatedAt\" = ?, \"_permissions\" = ? WHERE \"_id\" IS NULL AND _tenant IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,7]]],["SELECT \"_document\", \"_type\", \"_permission\" FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\", \"_tenant\") VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"],[4,7]]]]},"rename":{"outcome":"ok","statements":[["UPDATE \"database\".\"namespace_authors\" SET \"_uid\" = ?, \"name\" = ?, \"_createdAt\" = ?, \"_updatedAt\" = ?, \"_permissions\" = ? WHERE \"_id\" IS NULL AND _tenant IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,7]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\", \"_tenant\") VALUES (?, ?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"],[4,7]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM \"database\".\"namespace_authors\" WHERE \"_uid\" IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE \"_document\" IN (?) AND _tenant IN (?)",[[1,"a1"],[2,7]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO \"database\".\"namespace_authors\" AS \"target\" (\"_createdAt\", \"_permissions\", \"_tenant\", \"_uid\", \"_updatedAt\", \"name\") VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT (\"_uid\", \"_tenant\") DO UPDATE SET \"_permissions\" = CASE WHEN target._tenant = EXCLUDED._tenant THEN EXCLUDED.\"_permissions\" ELSE target.\"_permissions\" END, \"_updatedAt\" = CASE WHEN target._tenant = EXCLUDED._tenant THEN EXCLUDED.\"_updatedAt\" ELSE target.\"_updatedAt\" END, \"name\" = CASE WHEN target._tenant = EXCLUDED._tenant THEN EXCLUDED.\"name\" ELSE target.\"name\" END",[[1,"2026-09-30 00:00:00.000"],[2,"[\"read(\\\"user:3\\\")\"]"],[3,7],[4,"a1"],[5,"2026-09-30 00:00:00.000"],[6,"one"]]],["DELETE FROM \"database\".\"namespace_authors_perms\" WHERE ((\"_document\" IN (?) AND \"_tenant\" IN (?) AND \"_type\" IN (?) AND \"_permission\" IN (?)))",[[1,"a1"],[2,7],[3,"read"],[4,"any"]]],["INSERT INTO \"database\".\"namespace_authors_perms\" (\"_document\", \"_type\", \"_permission\", \"_tenant\") VALUES (?, ?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"],[4,7]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) AND \"table_main\"._tenant IN (?) LIMIT ?",[[1,"one"],[2,7],[3,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" AND \"book\"._tenant IN (?) AND (\"book\".\"_permissions\" @> ?::jsonb) WHERE \"table_main\"._tenant IN (?) LIMIT ?",[[1,7],[2,"[\"read(\\\"any\\\")\"]"],[3,7],[4,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" AND (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND \"book\"._tenant IN (?) WHERE (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND (\"book\"._tenant IN (?) OR \"book\".\"_uid\" IS NULL) LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT \"table_main\".*, \"book\".\"_uid\" AS \"book._uid\" FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" AND (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND \"book\"._tenant IN (?) WHERE (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND (\"book\"._tenant IN (?) OR \"book\".\"_uid\" IS NULL) ORDER BY RANDOM() LIMIT ?",[[1,7],[2,7],[3,7],[4,7],[5,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS \"sum\" FROM (SELECT 1 FROM \"database\".\"namespace_authors\" AS \"table_main\" FULL OUTER JOIN \"database\".\"namespace_books\" AS \"book\" ON \"table_main\".\"_uid\" = \"book\".\"authorId\" AND (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND \"book\"._tenant IN (?) WHERE (\"table_main\"._tenant IN (?) OR \"table_main\".\"_uid\" IS NULL) AND (\"book\"._tenant IN (?) OR \"book\".\"_uid\" IS NULL) LIMIT ?) AS \"table_count\"",[[1,7],[2,7],[3,7],[4,7],[5,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS \"sum\" FROM (SELECT 1 FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) AND \"table_main\"._tenant IN (?) LIMIT ?) AS \"table_count\"",[[1,"one"],[2,7],[3,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(\"pages\") AS \"sum\" FROM (SELECT \"pages\" FROM \"database\".\"namespace_authors\" AS \"table_main\" WHERE \"name\" IN (?) AND \"table_main\"._tenant IN (?) LIMIT ?) AS \"table_count\"",[[1,"one"],[2,7],[3,5]]]]}}}, "SQLite\/plain": {"reads":{"select":["SELECT `name`, `_uid` FROM `namespace_authors` WHERE `name` IN (?) AND `_id` > ? ORDER BY `_createdAt` DESC LIMIT ? OFFSET ?",["x",3,5,2]],"join":["SELECT `namespace_authors`.`name`, `book`.`pages`, `review`.`stars` FROM `namespace_authors` JOIN `namespace_books` AS `book` ON `namespace_authors`.`_uid` COLLATE NOCASE = `book`.`authorId` LEFT JOIN `namespace_reviews` AS `review` ON `namespace_authors`.`_uid` COLLATE NOCASE = `review`.`authorId` WHERE `book`.`pages` > ? ORDER BY `namespace_authors`.`name` ASC LIMIT ?",[10,3]],"metadata":["SELECT `name` FROM `namespace__metadata` WHERE `_uid` COLLATE NOCASE IN (?)",["authors"]],"permissions":["SELECT `_type`, `_permission` FROM `namespace_authors_perms` WHERE `_document` COLLATE NOCASE IN (?)",["a1"]],"metadataPermissions":["SELECT `_permission` FROM `namespace__metadata_perms`",[]],"rightJoin":["SELECT `namespace_authors`.`name`, `review`.`stars` FROM `namespace_authors` RIGHT JOIN `namespace_reviews` AS `review` ON `namespace_authors`.`_uid` COLLATE NOCASE = `review`.`authorId`",[]],"aggregate":["SELECT COUNT(*) AS `total` FROM `namespace_authors` GROUP BY `name`",[]],"update":["UPDATE `namespace_authors` SET `name` = ? WHERE `_uid` COLLATE NOCASE IN (?)",["renamed","a1"]],"delete":["DELETE FROM `namespace_authors` WHERE `_uid` COLLATE NOCASE IN (?)",["a1"]],"insert":["INSERT INTO `namespace_authors` (`_uid`, `name`) VALUES (?, ?)",["a9","new"]],"reused":["SELECT `name` FROM `namespace_authors`",[]]},"internal":{"ping":{"outcome":"ok","statements":[["SELECT 1",[]]]},"id":{"outcome":"ok","statements":[]},"exists":{"outcome":"ok","statements":[]},"collectionExists":{"outcome":"ok","statements":[["\n\t\t\tSELECT name FROM sqlite_master\n\t\t\tWHERE type='table' AND name = :table\n\t\t",[[":table","namespace_authors"]]]]},"size":{"outcome":"ok","statements":[["\n SELECT COALESCE(SUM(\"pgsize\" - \"unused\"), 0)\n FROM \"dbstat\"\n WHERE name = :name OR name = :perms OR name LIKE :fts_pattern ESCAPE '\\';\n ",[[":name","namespace_authors"],[":perms","namespace_authors_perms"],[":fts_pattern","namespace\\_authors\\_%\\_fts%"]]]]},"sizeOnDisk":{"outcome":"ok","statements":[["\n SELECT COALESCE(SUM(\"pgsize\" - \"unused\"), 0)\n FROM \"dbstat\"\n WHERE name = :name OR name = :perms OR name LIKE :fts_pattern ESCAPE '\\';\n ",[[":name","namespace_authors"],[":perms","namespace_authors_perms"],[":fts_pattern","namespace\\_authors\\_%\\_fts%"]]]]},"create":{"outcome":"ok","statements":[["INSERT INTO `namespace_authors` (`_uid`, `name`, `_createdAt`, `_updatedAt`, `_permissions`) VALUES (?, ?, ?, ?, ?)",[[1,"a1"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"any\\\")\",\"update(\\\"user:1\\\")\"]"]]],["INSERT INTO `namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?), (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"any"],[4,"a1"],[5,"update"],[6,"user:1"]]]]},"update":{"outcome":"ok","statements":[["UPDATE `namespace_authors` SET `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_uid` COLLATE NOCASE IN (?)",[[1,"one"],[2,"2026-09-30 00:00:00.000"],[3,"2026-09-30 00:00:00.000"],[4,"[\"read(\\\"user:2\\\")\"]"],[5,"a1"]]],["SELECT `_document`, `_type`, `_permission` FROM `namespace_authors_perms` WHERE `_document` COLLATE NOCASE IN (?)",[[1,"a1"]]],["INSERT INTO `namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:2"]]]]},"rename":{"outcome":"ok","statements":[["UPDATE `namespace_authors` SET `_uid` = ?, `name` = ?, `_createdAt` = ?, `_updatedAt` = ?, `_permissions` = ? WHERE `_uid` COLLATE NOCASE IN (?)",[[1,"a2"],[2,"one"],[3,"2026-09-30 00:00:00.000"],[4,"2026-09-30 00:00:00.000"],[5,"[\"read(\\\"user:2\\\")\"]"],[6,"a1"]]],["DELETE FROM `namespace_authors_perms` WHERE `_document` COLLATE NOCASE IN (?)",[[1,"a1"]]],["INSERT INTO `namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a2"],[2,"read"],[3,"user:2"]]]]},"delete":{"outcome":"ok","statements":[["DELETE FROM `namespace_authors` WHERE `_uid` COLLATE NOCASE IN (?)",[[1,"a1"]]],["DELETE FROM `namespace_authors_perms` WHERE `_document` COLLATE NOCASE IN (?)",[[1,"a1"]]]]},"upsert":{"outcome":"ok","statements":[["INSERT INTO `namespace_authors` (`_createdAt`, `_permissions`, `_uid`, `_updatedAt`, `name`)\n VALUES (:key_0, :key_1, :key_2, :key_3, :key_4)\n ON CONFLICT (_uid) DO UPDATE\n SET `_permissions` = excluded.`_permissions`, `_updatedAt` = excluded.`_updatedAt`, `name` = excluded.`name`",[["key_0","2026-09-30 00:00:00.000"],["key_1","[\"read(\\\"user:3\\\")\"]"],["key_2","a1"],["key_3","2026-09-30 00:00:00.000"],["key_4","one"]]],["DELETE FROM `namespace_authors_perms` WHERE ((`_document` COLLATE NOCASE IN (?) AND `_type` IN (?) AND `_permission` IN (?)))",[[1,"a1"],[2,"read"],[3,"any"]]],["INSERT INTO `namespace_authors_perms` (`_document`, `_type`, `_permission`) VALUES (?, ?, ?)",[[1,"a1"],[2,"read"],[3,"user:3"]]]]},"find":{"outcome":"ok","statements":[["SELECT * FROM `namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?",[[1,"one"],[2,10]]]]},"findAuthorized":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `namespace_authors` AS `table_main` JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` AND `book`.`_uid` COLLATE NOCASE IN (SELECT _document FROM `namespace_books_perms` WHERE _permission IN (?) AND _type = ?) LIMIT ?",[[1,"any"],[2,"read"],[3,10]]]]},"fullOuterJoin":{"outcome":"ok","statements":[["SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `namespace_authors` AS `table_main` LEFT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` UNION ALL SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `namespace_authors` AS `table_main` RIGHT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL LIMIT ?",[[1,10]]]]},"fullOuterJoinRandom":{"outcome":"ok","statements":[["SELECT * FROM (SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `namespace_authors` AS `table_main` LEFT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` UNION ALL SELECT `table_main`.*, `book`.`_uid` AS `book._uid` FROM `namespace_authors` AS `table_main` RIGHT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL) AS `foj_rows` ORDER BY RANDOM() LIMIT ?",[[1,10]]]]},"fullOuterJoinCount":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `namespace_authors` AS `table_main` LEFT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` UNION ALL SELECT 1 FROM `namespace_authors` AS `table_main` RIGHT JOIN `namespace_books` AS `book` ON `table_main`.`_uid` COLLATE NOCASE = `book`.`authorId` WHERE `table_main`.`_uid` IS NULL AND `book`.`_uid` IS NOT NULL LIMIT ?) AS `table_count`",[[1,5]]]]},"count":{"outcome":"ok","statements":[["SELECT COUNT(1) AS `sum` FROM (SELECT 1 FROM `namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]},"sum":{"outcome":"ok","statements":[["SELECT SUM(`pages`) AS `sum` FROM (SELECT `pages` FROM `namespace_authors` AS `table_main` WHERE `name` IN (?) LIMIT ?) AS `table_count`",[[1,"one"],[2,5]]]]}}}, diff --git a/tests/unit/AggregateOverflowTest.php b/tests/unit/AggregateOverflowTest.php new file mode 100644 index 000000000..299825895 --- /dev/null +++ b/tests/unit/AggregateOverflowTest.php @@ -0,0 +1,98 @@ + $readings + */ + private function database(bool $stringify, array $readings): Database + { + $pdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_STRINGIFY_FETCHES => $stringify]); + $database = new Database(new SQLite($pdo), new Cache(new NoCache())); + $database + ->setDatabase('aggregate_overflow') + ->setNamespace('aggregate_overflow_'.\uniqid()) + ->setAuthorization(new Authorization()); + $database->addHook(new Permissions()); + $database->create(); + + $database->createCollection(Collection::create( + id: self::COLLECTION, + attributes: [Attribute::double(key: 'reading', required: true)], + permissions: [Permission::create(Role::any()), Permission::read(Role::any())], + )); + + foreach ($readings as $reading) { + $database->createDocument(self::COLLECTION, new Document([ + 'reading' => $reading, + '$permissions' => [Permission::read(Role::any())], + ])); + } + + return $database; + } + + /** + * @return iterable + */ + public static function overflows(): iterable + { + foreach (['native' => false, 'stringified' => true] as $fetch => $stringify) { + yield "sum {$fetch}" => [$stringify, Query::sum('reading', 'total')]; + yield "avg {$fetch}" => [$stringify, Query::avg('reading', 'total')]; + yield "default alias {$fetch}" => [$stringify, Query::sum('reading')]; + } + } + + #[DataProvider('overflows')] + public function testAnAggregateThatOverflowsIsRefused(bool $stringify, Query $aggregate): void + { + $database = $this->database($stringify, [1e308, 1e308]); + + $this->expectException(LimitException::class); + $database->aggregate(self::COLLECTION, [$aggregate]); + } + + public function testAnAggregateThatOverflowsInOneGroupIsRefused(): void + { + $database = $this->database(false, [1e308, 1e308, 1.0]); + + $this->expectException(LimitException::class); + $database->aggregate(self::COLLECTION, [Query::sum('reading', 'total'), Query::groupBy(['reading'])]); + } + + public function testTheLargestFiniteSumIsStillAnswered(): void + { + $database = $this->database(false, [1e308]); + + $rows = $database->aggregate(self::COLLECTION, [Query::sum('reading', 'total'), Query::avg('reading', 'mean')]); + + $this->assertSame(1e308, $rows[0]['total']); + $this->assertSame(1e308, $rows[0]['mean']); + } +} diff --git a/tests/unit/Builder/FloatOverflowTest.php b/tests/unit/Builder/FloatOverflowTest.php new file mode 100644 index 000000000..4a23dc5a5 --- /dev/null +++ b/tests/unit/Builder/FloatOverflowTest.php @@ -0,0 +1,66 @@ + + */ + public static function builders(): iterable + { + yield 'mariadb' => [new MariaDB()]; + yield 'mysql' => [new MySQL()]; + } + + /** + * @return iterable + */ + public static function aggregates(): iterable + { + yield 'sum' => [Query::sum('reading', 'total'), 'SUM(`reading`) + 0 AS `total`']; + yield 'avg' => [Query::avg('reading', 'total'), 'AVG(`reading`) + 0 AS `total`']; + yield 'variance' => [Query::variance('reading', 'total'), 'VARIANCE(`reading`) + 0 AS `total`']; + yield 'varPop' => [Query::varPop('reading', 'total'), 'VAR_POP(`reading`) + 0 AS `total`']; + yield 'varSamp' => [Query::varSamp('reading', 'total'), 'VAR_SAMP(`reading`) + 0 AS `total`']; + yield 'stddev' => [Query::stddev('reading', 'total'), 'SQRT(VARIANCE(`reading`) + 0) AS `total`']; + yield 'stddevPop' => [Query::stddevPop('reading', 'total'), 'SQRT(VAR_POP(`reading`) + 0) AS `total`']; + yield 'stddevSamp' => [Query::stddevSamp('reading', 'total'), 'SQRT(VAR_SAMP(`reading`) + 0) AS `total`']; + yield 'unaliased sum keeps the name the engine gives it' => [Query::sum('reading'), 'SUM(`reading`) + 0 AS `SUM(``reading``)`']; + yield 'count is an integer' => [Query::count('*', 'total'), 'COUNT(*) AS `total`']; + yield 'min cannot overflow' => [Query::min('reading', 'total'), 'MIN(`reading`) AS `total`']; + yield 'max cannot overflow' => [Query::max('reading', 'total'), 'MAX(`reading`) AS `total`']; + } + + /** + * @return iterable + */ + public static function compilations(): iterable + { + foreach (self::builders() as $engine => [$builder]) { + foreach (self::aggregates() as $name => [$query, $sql]) { + yield "{$engine} {$name}" => [$builder, $query, $sql]; + } + } + } + + #[DataProvider('compilations')] + public function testAFloatingAggregateIsCompiledThroughTheEngineRangeCheck(Builder $builder, Query $query, string $sql): void + { + $this->assertSame($sql, $builder->compileAggregate($query)); + } + + public function testPostgresRaisesAnOverflowItselfSoItsAggregatesAreLeftAsTheyAre(): void + { + $this->assertSame('SUM("reading") AS "total"', (new Postgres())->compileAggregate(Query::sum('reading', 'total'))); + $this->assertSame('STDDEV_POP("reading") AS "total"', (new Postgres())->compileAggregate(Query::stddevPop('reading', 'total'))); + } +} diff --git a/tests/unit/EmptySetAggregateContractTest.php b/tests/unit/EmptySetAggregateContractTest.php index a3ebc61b9..6eb401766 100644 --- a/tests/unit/EmptySetAggregateContractTest.php +++ b/tests/unit/EmptySetAggregateContractTest.php @@ -151,7 +151,7 @@ private function find(string $adapter, int $inputs, array $queries): array */ private function answer(string $sql, int $inputs): array { - \preg_match_all('/([A-Z_]+)\((?:DISTINCT )?[^()]*\) AS [`"]([^`"]+)[`"]/', $sql, $matches, PREG_SET_ORDER); + \preg_match_all('/([A-Z_]+)\((?:DISTINCT )?[^()]*\)(?: \+ 0)? AS [`"]([^`"]+)[`"]/', $sql, $matches, PREG_SET_ORDER); $this->assertNotSame([], $matches, 'no aggregate in: '.$sql); $row = []; diff --git a/tests/unit/StatisticalAggregateContractTest.php b/tests/unit/StatisticalAggregateContractTest.php index b45afe9ae..be4e46957 100644 --- a/tests/unit/StatisticalAggregateContractTest.php +++ b/tests/unit/StatisticalAggregateContractTest.php @@ -19,7 +19,9 @@ * * Bare SQL `STDDEV` / `VARIANCE` are population on MySQL and MariaDB and sample * on PostgreSQL, so the same query used to answer different numbers per engine. - * Every adapter now emits the explicit population form. + * Every adapter now emits the explicit population form. MySQL and MariaDB take the + * deviation as the root of the population variance, so an overflowing variance + * raises an error instead of reading as DBL_MAX or NULL. */ final class StatisticalAggregateContractTest extends TestCase { @@ -41,9 +43,9 @@ public function testStddevCompilesToThePopulationForm(string $adapter): void { $sql = $this->captureFindSql($adapter, [Query::stddev('price', 'result')]); - $this->assertMatchesRegularExpression('/\bSTDDEV_POP\s*\(/i', $sql, $sql); - $this->assertDoesNotMatchRegularExpression('/\bSTDDEV\s*\(/i', $sql, $sql); - $this->assertDoesNotMatchRegularExpression('/\bSTDDEV_SAMP\s*\(/i', $sql, $sql); + $this->assertMatchesRegularExpression('/\b(STDDEV_POP|SQRT\(VAR_POP)\s*\(/i', $sql, $sql); + $this->assertDoesNotMatchRegularExpression('/\b(STDDEV|VARIANCE)\s*\(/i', $sql, $sql); + $this->assertDoesNotMatchRegularExpression('/\b(STDDEV_SAMP|VAR_SAMP)\s*\(/i', $sql, $sql); } /** @@ -66,7 +68,7 @@ public function testVarianceCompilesToThePopulationForm(string $adapter): void public function testTheExplicitSampleFormsAreLeftAlone(string $adapter): void { $this->assertMatchesRegularExpression( - '/\bSTDDEV_SAMP\s*\(/i', + '/\b(STDDEV_SAMP|SQRT\(VAR_SAMP)\s*\(/i', $this->captureFindSql($adapter, [Query::stddevSamp('price', 'result')]), ); $this->assertMatchesRegularExpression( From ce8eb0b34366919184c145d359cef2c7c19d3026 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 15 Oct 2026 22:29:41 +1300 Subject: [PATCH 2/3] fix(sum): read a sum written with an exponent as the double it is MariaDB and MySQL write a large double sum with an exponent and no decimal point, such as `1e308`, and sumOf() cast every value without a point to an integer, so sum() answered PHP_INT_MAX for it. A DECIMAL sum of big integers past the range of an integer was clamped the same way. 7.4.2 handed the string back and let the return type convert it, which kept the double. The value is now converted as PHP converts any numeric string: an integer when it is one, a double otherwise. Co-Authored-By: Claude Opus 5.5 --- src/Database/Adapter/SQL.php | 2 +- tests/unit/Adapter/SumResultTest.php | 52 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/unit/Adapter/SumResultTest.php diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index c901ab8a8..05f2318d2 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -2259,7 +2259,7 @@ private function sumOf(array $row): int|float $sum = $row['sum'] ?? 0; if (\is_numeric($sum)) { - return \str_contains((string) $sum, '.') ? (float) $sum : (int) $sum; + return $sum + 0; } return 0; diff --git a/tests/unit/Adapter/SumResultTest.php b/tests/unit/Adapter/SumResultTest.php new file mode 100644 index 000000000..1de358180 --- /dev/null +++ b/tests/unit/Adapter/SumResultTest.php @@ -0,0 +1,52 @@ + + */ + public static function sums(): iterable + { + yield 'integer' => ['2785', 2785]; + yield 'decimal' => ['10.50', 10.5]; + yield 'double with an exponent' => ['1e308', 1e308]; + yield 'negative double with an exponent' => ['-1.5e300', -1.5e300]; + yield 'decimal past the range of an integer' => ['18446744073709551614', 18446744073709551614.0]; + yield 'no rows' => [null, 0]; + } + + #[DataProvider('sums')] + public function testASumIsReadAsTheNumberTheEngineSent(?string $sent, int|float $expected): void + { + $pdo = $this->createStub(PDO::class); + $pdo->method('prepare')->willReturnCallback(function () use ($sent): PDOStatement { + $statement = $this->createStub(PDOStatement::class); + $statement->method('execute')->willReturn(true); + $statement->method('fetchAll')->willReturn([['sum' => $sent]]); + $statement->method('closeCursor')->willReturn(true); + + return $statement; + }); + + $adapter = new MariaDB($pdo); + $adapter->setDatabase('database'); + $adapter->setNamespace('namespace'); + $adapter->setAuthorization(new Authorization()); + + $this->assertSame($expected, $adapter->sum(Collection::create(id: 'readings'), 'reading')); + } +} From 054ca5e1df7deb5c79c6f0045f643b6dd8495076 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 15 Oct 2026 22:32:33 +1300 Subject: [PATCH 3/3] fix(sum): refuse a sum that overflows a double sum() answered 0 for a double sum past the range of a double on SQLite when fetches are stringified: the engine sends `INF`, which the new sumOf() reads as no number and turns into 0. 7.4.2 handed the value back as it was. It returned INF on SQLite and failed its int|float return type on `INF`. MongoDB, Memory and Redis return INF from sum(), on 7.4.2 as on 8.x. sumOf() reads SQLite's `INF`, `-INF` and `NAN` as the doubles they name. Database::sum() refuses a non-finite sum from any adapter with the same Exception\Limit that MariaDB, MySQL and PostgreSQL raise, so sum() agrees with aggregate(). Co-Authored-By: Claude Opus 5.5 --- src/Database/Adapter/SQL.php | 10 +- src/Database/Trait/Documents.php | 6 +- tests/e2e/Adapter/Scopes/DocumentTests.php | 38 ++++++++ tests/unit/SumOverflowTest.php | 107 +++++++++++++++++++++ 4 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 tests/unit/SumOverflowTest.php diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 05f2318d2..acc9c983a 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -2252,6 +2252,9 @@ private function countOf(array $row): int } /** + * The sum in a row, with SQLite's `INF`, `-INF` and `NAN` read as the doubles they name for Database::sum() to + * refuse. + * * @param array $row */ private function sumOf(array $row): int|float @@ -2262,7 +2265,12 @@ private function sumOf(array $row): int|float return $sum + 0; } - return 0; + return match (\is_string($sum) ? \strtoupper($sum) : null) { + 'INF' => \INF, + '-INF' => -\INF, + 'NAN' => \NAN, + default => 0, + }; } /** diff --git a/src/Database/Trait/Documents.php b/src/Database/Trait/Documents.php index 201d8c6cd..03f030f1b 100644 --- a/src/Database/Trait/Documents.php +++ b/src/Database/Trait/Documents.php @@ -4622,6 +4622,7 @@ public function count(string $collection, array $queries = [], ?int $max = null) * @return float|int The sum of the attribute values * * @throws DatabaseException + * @throws LimitException When the sum overflows the range of a double * @throws QueryException When $max is not greater than 0 */ public function sum(string $collection, string $attribute, array $queries = [], ?int $max = null): float|int @@ -4667,6 +4668,7 @@ public function sum(string $collection, string $attribute, array $queries = [], $getSum = fn () => $this->adapter->sum($collection, $attribute, $queries, $max); $sum = $skipAuth ? $this->authorization->skip($getSum) : $getSum(); + self::assertFinite($sum); $listeners = $this->listens(Event::DocumentSum); if ($listeners !== []) { @@ -4987,8 +4989,8 @@ private static function floatingAggregates(array $queries): array } /** - * SQLite answers a double that overflowed with infinity, which no caller can tell from a value, so it is refused - * as MariaDB, MySQL and PostgreSQL refuse it. + * SQLite, MongoDB and the adapters that sum in PHP answer a double that overflowed with infinity, which no caller + * can tell from a value, so it is refused as MariaDB, MySQL and PostgreSQL refuse it. * * @throws LimitException */ diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index 82d4ff312..973550113 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -2830,6 +2830,44 @@ public function testSum(): void $this->getDatabase()->getAuthorization()->addRole('user:x'); } + /** + * MariaDB and MySQL sent a double sum that overflowed as `0`, and SQLite, MongoDB and the adapters that sum in + * PHP answered infinity. A sum past the range of a double is refused on every adapter instead. + */ + public function testSumOverflowIsRefused(): void + { + $database = $this->getDatabase(); + $collection = 'sum_overflow_'.\substr(\uniqid(), -6); + $database->createCollection(Collection::create( + id: $collection, + attributes: [ + Attribute::string(key: 'series', size: 20, required: true), + Attribute::double(key: 'reading', required: true), + ], + permissions: [Permission::create(Role::any()), Permission::read(Role::any())], + )); + foreach ([['huge', 1e308], ['huge', 1e308], ['single', 1e308]] as [$series, $reading]) { + $database->createDocument($collection, new Document([ + 'series' => $series, + 'reading' => $reading, + '$permissions' => [Permission::read(Role::any())], + ])); + } + + foreach ([[[], null], [[Query::equal('series', ['huge'])], null], [[Query::equal('series', ['huge'])], 5], [[Query::greaterThan('reading', 0)], null]] as [$queries, $max]) { + try { + $database->sum($collection, 'reading', $queries, $max); + $this->fail('A sum that overflows a double is refused'); + } catch (LimitException) { + $this->addToAssertionCount(1); + } + } + + $this->assertEqualsWithDelta(1e308, $database->sum($collection, 'reading', [Query::equal('series', ['single'])]), 1e293); + + $database->deleteCollection($collection); + } + public function testUpdateDocument(): void { $document = $this->initDocumentsFixture(); diff --git a/tests/unit/SumOverflowTest.php b/tests/unit/SumOverflowTest.php new file mode 100644 index 000000000..d18b74982 --- /dev/null +++ b/tests/unit/SumOverflowTest.php @@ -0,0 +1,107 @@ + + */ + public static function adapters(): iterable + { + yield 'sqlite' => [static fn (): Adapter => new SQLite(new PDO('sqlite::memory:', null, null, [PDO::ATTR_STRINGIFY_FETCHES => false]))]; + yield 'sqlite stringified' => [static fn (): Adapter => new SQLite(new PDO('sqlite::memory:', null, null, [PDO::ATTR_STRINGIFY_FETCHES => true]))]; + yield 'memory' => [static fn (): Adapter => new Memory()]; + } + + /** + * @param Closure(): Adapter $adapter + * @param list $readings + */ + private function database(Closure $adapter, array $readings): Database + { + $database = new Database($adapter(), new Cache(new NoCache())); + $database + ->setDatabase('sum_overflow') + ->setNamespace('sum_overflow_'.\uniqid()) + ->setAuthorization(new Authorization()); + $database->addHook(new Permissions()); + $database->create(); + + $database->createCollection(Collection::create( + id: self::COLLECTION, + attributes: [Attribute::double(key: 'reading', required: true)], + permissions: [Permission::create(Role::any()), Permission::read(Role::any())], + )); + + foreach ($readings as $reading) { + $database->createDocument(self::COLLECTION, new Document([ + 'reading' => $reading, + '$permissions' => [Permission::read(Role::any())], + ])); + } + + return $database; + } + + /** + * @param Closure(): Adapter $adapter + */ + #[DataProvider('adapters')] + public function testASumThatOverflowsIsRefused(Closure $adapter): void + { + $database = $this->database($adapter, [1e308, 1e308]); + + $this->expectException(LimitException::class); + $database->sum(self::COLLECTION, 'reading'); + } + + /** + * @param Closure(): Adapter $adapter + */ + #[DataProvider('adapters')] + public function testASumThatOverflowsUnderFiltersIsRefused(Closure $adapter): void + { + $database = $this->database($adapter, [1e308, 1e308, -1.0]); + + $this->expectException(LimitException::class); + $database->sum(self::COLLECTION, 'reading', [Query::greaterThan('reading', 0)], 10); + } + + /** + * @param Closure(): Adapter $adapter + */ + #[DataProvider('adapters')] + public function testTheLargestFiniteSumIsStillAnswered(Closure $adapter): void + { + $database = $this->database($adapter, [1e308]); + + $this->assertSame(1e308, $database->sum(self::COLLECTION, 'reading')); + } +}