Skip to content

Commit

Permalink
Merge pull request #174 from keboola/zajca-ct-1820-numeric-integer
Browse files Browse the repository at this point in the history
CT-1820 Snowflake TYPE_NUMBER with length 38,0 has basetype integer
  • Loading branch information
zajca authored Oct 25, 2024
2 parents 40a99d1 + bbd8095 commit 09db40a
Show file tree
Hide file tree
Showing 3 changed files with 155 additions and 57 deletions.
28 changes: 12 additions & 16 deletions packages/php-datatypes/src/Definition/Snowflake.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions packages/php-datatypes/src/Definition/Teradata.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
183 changes: 142 additions & 41 deletions packages/php-datatypes/tests/SnowflakeDatatypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 09db40a

Please sign in to comment.