Skip to content

Commit 0326fec

Browse files
authored
Merge pull request #174 from keboola/zajca-ct-1820-numeric-integer
CT-1820 Snowflake TYPE_NUMBER with length 38,0 has basetype integer
2 parents cb3b828 + ef3d438 commit 0326fec

3 files changed

Lines changed: 155 additions & 57 deletions

File tree

src/Definition/Snowflake.php

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -384,47 +384,43 @@ private function validateLength(string $type, $length = null): void
384384

385385
public function getBasetype(): string
386386
{
387-
switch (strtoupper($this->type)) {
387+
$type = strtoupper($this->type);
388+
if ($type === self::TYPE_NUMBER && $this->length === '38,0') {
389+
return BaseType::INTEGER;
390+
}
391+
switch ($type) {
388392
case self::TYPE_INT:
389393
case self::TYPE_INTEGER:
390394
case self::TYPE_BIGINT:
391395
case self::TYPE_SMALLINT:
392396
case self::TYPE_TINYINT:
393397
case self::TYPE_BYTEINT:
394-
$basetype = BaseType::INTEGER;
395-
break;
398+
return BaseType::INTEGER;
396399
case self::TYPE_NUMBER:
397400
case self::TYPE_DECIMAL:
398401
case self::TYPE_DEC:
399402
case self::TYPE_NUMERIC:
400-
$basetype = BaseType::NUMERIC;
401-
break;
403+
return BaseType::NUMERIC;
402404
case self::TYPE_FLOAT:
403405
case self::TYPE_FLOAT4:
404406
case self::TYPE_FLOAT8:
405407
case self::TYPE_DOUBLE:
406408
case self::TYPE_DOUBLE_PRECISION:
407409
case self::TYPE_REAL:
408-
$basetype = BaseType::FLOAT;
409-
break;
410+
return BaseType::FLOAT;
410411
case self::TYPE_BOOLEAN:
411-
$basetype = BaseType::BOOLEAN;
412-
break;
412+
return BaseType::BOOLEAN;
413413
case self::TYPE_DATE:
414-
$basetype = BaseType::DATE;
415-
break;
414+
return BaseType::DATE;
416415
case self::TYPE_DATETIME:
417416
case self::TYPE_TIMESTAMP:
418417
case self::TYPE_TIMESTAMP_NTZ:
419418
case self::TYPE_TIMESTAMP_LTZ:
420419
case self::TYPE_TIMESTAMP_TZ:
421-
$basetype = BaseType::TIMESTAMP;
422-
break;
420+
return BaseType::TIMESTAMP;
423421
default:
424-
$basetype = BaseType::STRING;
425-
break;
422+
return BaseType::STRING;
426423
}
427-
return $basetype;
428424
}
429425

430426
public static function getTypeByBasetype(string $basetype): string

src/Definition/Teradata.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,7 @@ private function validateLOBLength($length, array $maxTab): bool
637637
// with unit
638638
return $out[1] <= $maxTab[$out[2]] && $out[1] >= 1;
639639
}
640+
//@phpstan-ignore-next-line
640641
return false;
641642
}
642643

tests/SnowflakeDatatypeTest.php

Lines changed: 142 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -265,51 +265,152 @@ public function testInvalidBinaryLengths($length): void
265265
}
266266
}
267267

268-
public function testBasetypes(): void
268+
public function basetypeProvider(): Generator
269269
{
270+
yield Snowflake::TYPE_INT => [
271+
new Snowflake(Snowflake::TYPE_INT, $this->getTypeDefaultOptions(Snowflake::TYPE_INT)),
272+
'INTEGER',
273+
];
274+
yield Snowflake::TYPE_INTEGER => [
275+
new Snowflake(Snowflake::TYPE_INTEGER, $this->getTypeDefaultOptions(Snowflake::TYPE_INTEGER)),
276+
'INTEGER',
277+
];
278+
yield Snowflake::TYPE_BIGINT => [
279+
new Snowflake(Snowflake::TYPE_BIGINT, $this->getTypeDefaultOptions(Snowflake::TYPE_BIGINT)),
280+
'INTEGER',
281+
];
282+
yield Snowflake::TYPE_SMALLINT => [
283+
new Snowflake(Snowflake::TYPE_SMALLINT, $this->getTypeDefaultOptions(Snowflake::TYPE_SMALLINT)),
284+
'INTEGER',
285+
];
286+
yield Snowflake::TYPE_TINYINT => [
287+
new Snowflake(Snowflake::TYPE_TINYINT, $this->getTypeDefaultOptions(Snowflake::TYPE_TINYINT)),
288+
'INTEGER',
289+
];
290+
yield Snowflake::TYPE_BYTEINT => [
291+
new Snowflake(Snowflake::TYPE_BYTEINT, $this->getTypeDefaultOptions(Snowflake::TYPE_BYTEINT)),
292+
'INTEGER',
293+
];
294+
yield Snowflake::TYPE_NUMBER => [
295+
new Snowflake(Snowflake::TYPE_NUMBER, $this->getTypeDefaultOptions(Snowflake::TYPE_NUMBER)),
296+
'NUMERIC',
297+
];
298+
yield Snowflake::TYPE_DECIMAL => [
299+
new Snowflake(Snowflake::TYPE_DECIMAL, $this->getTypeDefaultOptions(Snowflake::TYPE_DECIMAL)),
300+
'NUMERIC',
301+
];
302+
yield Snowflake::TYPE_DEC => [
303+
new Snowflake(Snowflake::TYPE_DEC, $this->getTypeDefaultOptions(Snowflake::TYPE_DEC)),
304+
'NUMERIC',
305+
];
306+
yield Snowflake::TYPE_NUMERIC => [
307+
new Snowflake(Snowflake::TYPE_NUMERIC, $this->getTypeDefaultOptions(Snowflake::TYPE_NUMERIC)),
308+
'NUMERIC',
309+
];
310+
yield Snowflake::TYPE_FLOAT => [
311+
new Snowflake(Snowflake::TYPE_FLOAT, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT)),
312+
'FLOAT',
313+
];
314+
yield Snowflake::TYPE_FLOAT4 => [
315+
new Snowflake(Snowflake::TYPE_FLOAT4, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT4)),
316+
'FLOAT',
317+
];
318+
yield Snowflake::TYPE_FLOAT8 => [
319+
new Snowflake(Snowflake::TYPE_FLOAT8, $this->getTypeDefaultOptions(Snowflake::TYPE_FLOAT8)),
320+
'FLOAT',
321+
];
322+
yield Snowflake::TYPE_DOUBLE => [
323+
new Snowflake(Snowflake::TYPE_DOUBLE, $this->getTypeDefaultOptions(Snowflake::TYPE_DOUBLE)),
324+
'FLOAT',
325+
];
326+
yield Snowflake::TYPE_DOUBLE_PRECISION => [
327+
new Snowflake(
328+
Snowflake::TYPE_DOUBLE_PRECISION,
329+
$this->getTypeDefaultOptions(Snowflake::TYPE_DOUBLE_PRECISION),
330+
),
331+
'FLOAT',
332+
];
333+
yield Snowflake::TYPE_REAL => [
334+
new Snowflake(Snowflake::TYPE_REAL, $this->getTypeDefaultOptions(Snowflake::TYPE_REAL)),
335+
'FLOAT',
336+
];
337+
yield Snowflake::TYPE_BOOLEAN => [
338+
new Snowflake(Snowflake::TYPE_BOOLEAN, $this->getTypeDefaultOptions(Snowflake::TYPE_BOOLEAN)),
339+
'BOOLEAN',
340+
];
341+
yield Snowflake::TYPE_DATE => [
342+
new Snowflake(Snowflake::TYPE_DATE, $this->getTypeDefaultOptions(Snowflake::TYPE_DATE)),
343+
'DATE',
344+
];
345+
yield Snowflake::TYPE_DATETIME => [
346+
new Snowflake(Snowflake::TYPE_DATETIME, $this->getTypeDefaultOptions(Snowflake::TYPE_DATETIME)),
347+
'TIMESTAMP',
348+
];
349+
yield Snowflake::TYPE_TIMESTAMP => [
350+
new Snowflake(Snowflake::TYPE_TIMESTAMP, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP)),
351+
'TIMESTAMP',
352+
];
353+
yield Snowflake::TYPE_TIMESTAMP_NTZ => [
354+
new Snowflake(Snowflake::TYPE_TIMESTAMP_NTZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_NTZ)),
355+
'TIMESTAMP',
356+
];
357+
yield Snowflake::TYPE_TIMESTAMP_LTZ => [
358+
new Snowflake(Snowflake::TYPE_TIMESTAMP_LTZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_LTZ)),
359+
'TIMESTAMP',
360+
];
361+
yield Snowflake::TYPE_TIMESTAMP_TZ => [
362+
new Snowflake(Snowflake::TYPE_TIMESTAMP_TZ, $this->getTypeDefaultOptions(Snowflake::TYPE_TIMESTAMP_TZ)),
363+
'TIMESTAMP',
364+
];
365+
366+
$testedTypes = [
367+
Snowflake::TYPE_INT,
368+
Snowflake::TYPE_INTEGER,
369+
Snowflake::TYPE_BIGINT,
370+
Snowflake::TYPE_SMALLINT,
371+
Snowflake::TYPE_TINYINT,
372+
Snowflake::TYPE_BYTEINT,
373+
Snowflake::TYPE_NUMBER,
374+
Snowflake::TYPE_DECIMAL,
375+
Snowflake::TYPE_DEC,
376+
Snowflake::TYPE_NUMERIC,
377+
Snowflake::TYPE_FLOAT,
378+
Snowflake::TYPE_FLOAT4,
379+
Snowflake::TYPE_FLOAT8,
380+
Snowflake::TYPE_DOUBLE,
381+
Snowflake::TYPE_DOUBLE_PRECISION,
382+
Snowflake::TYPE_REAL,
383+
Snowflake::TYPE_BOOLEAN,
384+
Snowflake::TYPE_DATE,
385+
Snowflake::TYPE_DATETIME,
386+
Snowflake::TYPE_TIMESTAMP,
387+
Snowflake::TYPE_TIMESTAMP_NTZ,
388+
Snowflake::TYPE_TIMESTAMP_LTZ,
389+
Snowflake::TYPE_TIMESTAMP_TZ,
390+
];
270391
foreach (Snowflake::TYPES as $type) {
271-
$basetype = (new Snowflake($type, $this->getTypeDefaultOptions($type)))->getBasetype();
272-
switch ($type) {
273-
case 'INT':
274-
case 'INTEGER':
275-
case 'BIGINT':
276-
case 'SMALLINT':
277-
case 'TINYINT':
278-
case 'BYTEINT':
279-
$this->assertEquals('INTEGER', $basetype);
280-
break;
281-
case 'NUMBER':
282-
case 'DECIMAL':
283-
case 'DEC':
284-
case 'NUMERIC':
285-
$this->assertEquals('NUMERIC', $basetype);
286-
break;
287-
case 'FLOAT':
288-
case 'FLOAT4':
289-
case 'FLOAT8':
290-
case 'DOUBLE':
291-
case 'DOUBLE PRECISION':
292-
case 'REAL':
293-
$this->assertEquals('FLOAT', $basetype);
294-
break;
295-
case 'BOOLEAN':
296-
$this->assertEquals('BOOLEAN', $basetype);
297-
break;
298-
case 'DATE':
299-
$this->assertEquals('DATE', $basetype);
300-
break;
301-
case 'DATETIME':
302-
case 'TIMESTAMP':
303-
case 'TIMESTAMP_NTZ':
304-
case 'TIMESTAMP_LTZ':
305-
case 'TIMESTAMP_TZ':
306-
$this->assertEquals('TIMESTAMP', $basetype);
307-
break;
308-
default:
309-
$this->assertEquals('STRING', $basetype);
310-
break;
392+
if (!in_array($type, $testedTypes, true)) {
393+
yield $type => [
394+
new Snowflake($type, $this->getTypeDefaultOptions($type)),
395+
'STRING',
396+
];
311397
}
312398
}
399+
400+
yield Snowflake::TYPE_NUMBER.' with 38,0 length' => [
401+
new Snowflake(Snowflake::TYPE_NUMBER, ['length' => '38,0']),
402+
'INTEGER',
403+
];
404+
}
405+
406+
/**
407+
* @dataProvider basetypeProvider
408+
*/
409+
public function testBasetypes(
410+
Snowflake $type,
411+
string $expectedBasetype,
412+
): void {
413+
$this->assertEquals($expectedBasetype, $type->getBasetype());
313414
}
314415

315416
public function testVariant(): void

0 commit comments

Comments
 (0)