From 34ea2397f2e21adf1143f31efef0a4ed19019dfc Mon Sep 17 00:00:00 2001 From: zajca Date: Fri, 25 Oct 2024 10:42:45 +0200 Subject: [PATCH 1/2] Snowflake TYPE_NUMBER with length 38,0 has basetype integer --- .../src/Definition/Snowflake.php | 28 ++- .../tests/SnowflakeDatatypeTest.php | 183 ++++++++++++++---- 2 files changed, 154 insertions(+), 57 deletions(-) diff --git a/packages/php-datatypes/src/Definition/Snowflake.php b/packages/php-datatypes/src/Definition/Snowflake.php index ba933a03e..55cd3e564 100644 --- a/packages/php-datatypes/src/Definition/Snowflake.php +++ b/packages/php-datatypes/src/Definition/Snowflake.php @@ -384,47 +384,43 @@ private function validateLength(string $type, $length = null): void public function getBasetype(): string { - switch (strtoupper($this->type)) { + $type = strtoupper($this->type); + if ($type === self::TYPE_NUMBER && $this->length === '38,0') { + return BaseType::INTEGER; + } + switch ($type) { case self::TYPE_INT: case self::TYPE_INTEGER: case self::TYPE_BIGINT: case self::TYPE_SMALLINT: case self::TYPE_TINYINT: case self::TYPE_BYTEINT: - $basetype = BaseType::INTEGER; - break; + return BaseType::INTEGER; case self::TYPE_NUMBER: case self::TYPE_DECIMAL: case self::TYPE_DEC: case self::TYPE_NUMERIC: - $basetype = BaseType::NUMERIC; - break; + return BaseType::NUMERIC; case self::TYPE_FLOAT: case self::TYPE_FLOAT4: case self::TYPE_FLOAT8: case self::TYPE_DOUBLE: case self::TYPE_DOUBLE_PRECISION: case self::TYPE_REAL: - $basetype = BaseType::FLOAT; - break; + return BaseType::FLOAT; case self::TYPE_BOOLEAN: - $basetype = BaseType::BOOLEAN; - break; + return BaseType::BOOLEAN; case self::TYPE_DATE: - $basetype = BaseType::DATE; - break; + return BaseType::DATE; case self::TYPE_DATETIME: case self::TYPE_TIMESTAMP: case self::TYPE_TIMESTAMP_NTZ: case self::TYPE_TIMESTAMP_LTZ: case self::TYPE_TIMESTAMP_TZ: - $basetype = BaseType::TIMESTAMP; - break; + return BaseType::TIMESTAMP; default: - $basetype = BaseType::STRING; - break; + return BaseType::STRING; } - return $basetype; } public static function getTypeByBasetype(string $basetype): string diff --git a/packages/php-datatypes/tests/SnowflakeDatatypeTest.php b/packages/php-datatypes/tests/SnowflakeDatatypeTest.php index 375962ae0..153857284 100644 --- a/packages/php-datatypes/tests/SnowflakeDatatypeTest.php +++ b/packages/php-datatypes/tests/SnowflakeDatatypeTest.php @@ -265,51 +265,152 @@ public function testInvalidBinaryLengths($length): void } } - public function testBasetypes(): void + public function basetypeProvider(): Generator { + yield Snowflake::TYPE_INT => [ + new Snowflake(Snowflake::TYPE_INT, $this->getTypeDefaultOptions(Snowflake::TYPE_INT)), + 'INTEGER', + ]; + yield Snowflake::TYPE_INTEGER => [ + new Snowflake(Snowflake::TYPE_INTEGER, $this->getTypeDefaultOptions(Snowflake::TYPE_INTEGER)), + 'INTEGER', + ]; + yield Snowflake::TYPE_BIGINT => [ + new Snowflake(Snowflake::TYPE_BIGINT, $this->getTypeDefaultOptions(Snowflake::TYPE_BIGINT)), + 'INTEGER', + ]; + yield Snowflake::TYPE_SMALLINT => [ + new Snowflake(Snowflake::TYPE_SMALLINT, $this->getTypeDefaultOptions(Snowflake::TYPE_SMALLINT)), + 'INTEGER', + ]; + yield Snowflake::TYPE_TINYINT => [ + new Snowflake(Snowflake::TYPE_TINYINT, $this->getTypeDefaultOptions(Snowflake::TYPE_TINYINT)), + 'INTEGER', + ]; + yield Snowflake::TYPE_BYTEINT => [ + new Snowflake(Snowflake::TYPE_BYTEINT, $this->getTypeDefaultOptions(Snowflake::TYPE_BYTEINT)), + 'INTEGER', + ]; + yield Snowflake::TYPE_NUMBER => [ + new Snowflake(Snowflake::TYPE_NUMBER, $this->getTypeDefaultOptions(Snowflake::TYPE_NUMBER)), + 'NUMERIC', + ]; + yield Snowflake::TYPE_DECIMAL => [ + new Snowflake(Snowflake::TYPE_DECIMAL, $this->getTypeDefaultOptions(Snowflake::TYPE_DECIMAL)), + 'NUMERIC', + ]; + yield Snowflake::TYPE_DEC => [ + new Snowflake(Snowflake::TYPE_DEC, $this->getTypeDefaultOptions(Snowflake::TYPE_DEC)), + 'NUMERIC', + ]; + yield Snowflake::TYPE_NUMERIC => [ + new Snowflake(Snowflake::TYPE_NUMERIC, $this->getTypeDefaultOptions(Snowflake::TYPE_NUMERIC)), + 'NUMERIC', + ]; + yield Snowflake::TYPE_FLOAT => [ + new Snowflake(Snowflake::TYPE_FLOAT, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT)), + 'FLOAT', + ]; + yield Snowflake::TYPE_FLOAT4 => [ + new Snowflake(Snowflake::TYPE_FLOAT4, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT4)), + 'FLOAT', + ]; + yield Snowflake::TYPE_FLOAT8 => [ + new Snowflake(Snowflake::TYPE_FLOAT8, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT8)), + 'FLOAT', + ]; + yield Snowflake::TYPE_DOUBLE => [ + new Snowflake(Snowflake::TYPE_DOUBLE, $this->getTypeDefaultOptions(Snowflake::TYPE_DOUBLE)), + 'FLOAT', + ]; + yield Snowflake::TYPE_DOUBLE_PRECISION => [ + new Snowflake( + Snowflake::TYPE_DOUBLE_PRECISION, + $this->getTypeDefaultOptions(Snowflake::TYPE_DOUBLE_PRECISION), + ), + 'FLOAT', + ]; + yield Snowflake::TYPE_REAL => [ + new Snowflake(Snowflake::TYPE_REAL, $this->getTypeDefaultOptions(Snowflake::TYPE_REAL)), + 'FLOAT', + ]; + yield Snowflake::TYPE_BOOLEAN => [ + new Snowflake(Snowflake::TYPE_BOOLEAN, $this->getTypeDefaultOptions(Snowflake::TYPE_BOOLEAN)), + 'BOOLEAN', + ]; + yield Snowflake::TYPE_DATE => [ + new Snowflake(Snowflake::TYPE_DATE, $this->getTypeDefaultOptions(Snowflake::TYPE_DATE)), + 'DATE', + ]; + yield Snowflake::TYPE_DATETIME => [ + new Snowflake(Snowflake::TYPE_DATETIME, $this->getTypeDefaultOptions(Snowflake::TYPE_DATETIME)), + 'TIMESTAMP', + ]; + yield Snowflake::TYPE_TIMESTAMP => [ + new Snowflake(Snowflake::TYPE_TIMESTAMP, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP)), + 'TIMESTAMP', + ]; + yield Snowflake::TYPE_TIMESTAMP_NTZ => [ + new Snowflake(Snowflake::TYPE_TIMESTAMP_NTZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_NTZ)), + 'TIMESTAMP', + ]; + yield Snowflake::TYPE_TIMESTAMP_LTZ => [ + new Snowflake(Snowflake::TYPE_TIMESTAMP_LTZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_LTZ)), + 'TIMESTAMP', + ]; + yield Snowflake::TYPE_TIMESTAMP_TZ => [ + new Snowflake(Snowflake::TYPE_TIMESTAMP_TZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_TZ)), + 'TIMESTAMP', + ]; + + $testedTypes = [ + Snowflake::TYPE_INT, + Snowflake::TYPE_INTEGER, + Snowflake::TYPE_BIGINT, + Snowflake::TYPE_SMALLINT, + Snowflake::TYPE_TINYINT, + Snowflake::TYPE_BYTEINT, + Snowflake::TYPE_NUMBER, + Snowflake::TYPE_DECIMAL, + Snowflake::TYPE_DEC, + Snowflake::TYPE_NUMERIC, + Snowflake::TYPE_FLOAT, + Snowflake::TYPE_FLOAT4, + Snowflake::TYPE_FLOAT8, + Snowflake::TYPE_DOUBLE, + Snowflake::TYPE_DOUBLE_PRECISION, + Snowflake::TYPE_REAL, + Snowflake::TYPE_BOOLEAN, + Snowflake::TYPE_DATE, + Snowflake::TYPE_DATETIME, + Snowflake::TYPE_TIMESTAMP, + Snowflake::TYPE_TIMESTAMP_NTZ, + Snowflake::TYPE_TIMESTAMP_LTZ, + Snowflake::TYPE_TIMESTAMP_TZ, + ]; foreach (Snowflake::TYPES as $type) { - $basetype = (new Snowflake($type, $this->getTypeDefaultOptions($type)))->getBasetype(); - switch ($type) { - case 'INT': - case 'INTEGER': - case 'BIGINT': - case 'SMALLINT': - case 'TINYINT': - case 'BYTEINT': - $this->assertEquals('INTEGER', $basetype); - break; - case 'NUMBER': - case 'DECIMAL': - case 'DEC': - case 'NUMERIC': - $this->assertEquals('NUMERIC', $basetype); - break; - case 'FLOAT': - case 'FLOAT4': - case 'FLOAT8': - case 'DOUBLE': - case 'DOUBLE PRECISION': - case 'REAL': - $this->assertEquals('FLOAT', $basetype); - break; - case 'BOOLEAN': - $this->assertEquals('BOOLEAN', $basetype); - break; - case 'DATE': - $this->assertEquals('DATE', $basetype); - break; - case 'DATETIME': - case 'TIMESTAMP': - case 'TIMESTAMP_NTZ': - case 'TIMESTAMP_LTZ': - case 'TIMESTAMP_TZ': - $this->assertEquals('TIMESTAMP', $basetype); - break; - default: - $this->assertEquals('STRING', $basetype); - break; + if (!in_array($type, $testedTypes, true)) { + yield $type => [ + new Snowflake($type, $this->getTypeDefaultOptions($type)), + 'STRING', + ]; } } + + yield Snowflake::TYPE_NUMBER.' with 38,0 length' => [ + new Snowflake(Snowflake::TYPE_NUMBER, ['length' => '38,0']), + 'INTEGER', + ]; + } + + /** + * @dataProvider basetypeProvider + */ + public function testBasetypes( + Snowflake $type, + string $expectedBasetype, + ): void { + $this->assertEquals($expectedBasetype, $type->getBasetype()); } public function testVariant(): void From bbd80950a1238510c36670efded355b77a2dca9d Mon Sep 17 00:00:00 2001 From: zajca Date: Fri, 25 Oct 2024 11:24:31 +0200 Subject: [PATCH 2/2] ignore phpstan error in Teradata --- packages/php-datatypes/src/Definition/Teradata.php | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/php-datatypes/src/Definition/Teradata.php b/packages/php-datatypes/src/Definition/Teradata.php index 46db7a3e0..c91855470 100644 --- a/packages/php-datatypes/src/Definition/Teradata.php +++ b/packages/php-datatypes/src/Definition/Teradata.php @@ -637,6 +637,7 @@ private function validateLOBLength($length, array $maxTab): bool // with unit return $out[1] <= $maxTab[$out[2]] && $out[1] >= 1; } + //@phpstan-ignore-next-line return false; }