diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 6780fe816..acc9c983a 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; } @@ -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 @@ -2259,10 +2262,15 @@ 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; + return match (\is_string($sum) ? \strtoupper($sum) : null) { + 'INF' => \INF, + '-INF' => -\INF, + 'NAN' => \NAN, + default => 0, + }; } /** 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..03f030f1b 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:'; @@ -4611,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 @@ -4656,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 !== []) { @@ -4933,6 +4946,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 +4954,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 +4972,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, 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 + */ + 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/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/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/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')); + } +} 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( 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')); + } +}