From 922258431c9fffc50b74b18461abb3c219a7d2ab Mon Sep 17 00:00:00 2001 From: Vojta Biberle Date: Thu, 23 Jan 2025 12:51:43 +0100 Subject: [PATCH] DMD-33 add test for empty schema --- .../Snowflake/SnowflakeSchemaReflection.php | 76 ++++++++++++++++++- .../Schema/SnowflakeSchemaReflectionTest.php | 8 ++ 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/packages/php-table-backend-utils/src/Schema/Snowflake/SnowflakeSchemaReflection.php b/packages/php-table-backend-utils/src/Schema/Snowflake/SnowflakeSchemaReflection.php index 18df427d0..a7efd0a8f 100644 --- a/packages/php-table-backend-utils/src/Schema/Snowflake/SnowflakeSchemaReflection.php +++ b/packages/php-table-backend-utils/src/Schema/Snowflake/SnowflakeSchemaReflection.php @@ -5,6 +5,7 @@ namespace Keboola\TableBackendUtils\Schema\Snowflake; use Doctrine\DBAL\Connection; +use Keboola\Datatype\Definition\Snowflake; use Keboola\TableBackendUtils\Column\ColumnCollection; use Keboola\TableBackendUtils\Column\Snowflake\SnowflakeColumn; use Keboola\TableBackendUtils\Escaping\Snowflake\SnowflakeQuote; @@ -68,18 +69,33 @@ public function getDefinitions(): array SnowflakeQuote::quote($this->schemaName), ); + // Snowflake maps in DESC TABLE few data-type aliases to their basic types + // but in INFORMATION_SCHEMA.COLUMNS table keep data-type aliases + // here is implemented same mapping as DESC TABLE uses $columnsQuery = sprintf( << $informations */ $informations = $this->connection->fetchAllAssociative($informationsQuery); + + // short-circuit > no tables no need to continue + if (count($informations) === 0) { + return []; + } + /** @var array $columns */ $columns = $this->connection->fetchAllAssociative($columnsQuery); /** @var arraygetBinaryColumnLength($column['TABLE_NAME'], $column['name']); + if ($info !== null) { + $column['type'] = sprintf( + '%s(%s)', + Snowflake::TYPE_BINARY, + $info['length'], + ); + } + } $tables[$column['TABLE_NAME']]['COLUMNS'][] = SnowflakeColumn::createFromDB($column); } @@ -166,4 +200,38 @@ public function getDefinitions(): array } return $definitions; } + + /** + * @return array{type: string, length: string}|null + */ + private function getBinaryColumnLength(string $tableName, string $columnName): ?array + { + $sql = sprintf('DESCRIBE TABLE %s', SnowflakeQuote::quote($tableName)); + /** @var array< + * int, + * array{ + * name: string, + * type: string, + * kind: string, + * null?: string, + * default: ?string, + * "primary key": string, + * "unique key": string, + * check: ?string, + * expression: ?string, + * comment: ?string, + * "policy name": ?string, + * "privacy domain": ?string + * } + * > $columns + */ + $columns = $this->connection->fetchAllAssociative($sql); + foreach ($columns as $column) { + if ($column['name'] === $columnName) { + return SnowflakeColumn::extractTypeAndLengthFromDB($column['type']); + } + } + + return null; + } } diff --git a/packages/php-table-backend-utils/tests/Functional/Snowflake/Schema/SnowflakeSchemaReflectionTest.php b/packages/php-table-backend-utils/tests/Functional/Snowflake/Schema/SnowflakeSchemaReflectionTest.php index da5a78232..d45855e3e 100644 --- a/packages/php-table-backend-utils/tests/Functional/Snowflake/Schema/SnowflakeSchemaReflectionTest.php +++ b/packages/php-table-backend-utils/tests/Functional/Snowflake/Schema/SnowflakeSchemaReflectionTest.php @@ -155,4 +155,12 @@ public function testGetDefinitions(): void self::assertFalse($definitions[$genericViewKey]->isTemporary()); self::assertEquals('view', $definitions[$genericViewKey]->getTableType()->value); } + + public function testGetDefinitionsWithEmptySchema(): void + { + $this->createSchema(self::TEST_SCHEMA); + $definitions = $this->schemaRef->getDefinitions(); + + self::assertCount(0, $definitions); + } }