Skip to content

Commit 10cd4d4

Browse files
authored
Merge pull request #54 from keboola/jirka-fix-number-type-in-td
Fix TD number type length
2 parents 21c5fb6 + 2151ef9 commit 10cd4d4

2 files changed

Lines changed: 24 additions & 6 deletions

File tree

src/Definition/Teradata.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class Teradata extends Common
132132
public const DEFAULT_BLOB_LENGTH = '1G';
133133
public const DEFAULT_BYTE_LENGTH = 64000;
134134
public const DEFAULT_DATETIME_DIGIT_LENGTH = 4;
135-
public const DEFAULT_DECIMAL_LENGTH = '38,38';
135+
public const DEFAULT_DECIMAL_LENGTH = '38,19';
136136
public const DEFAULT_LATIN_CHAR_LENGTH = 64000;
137137
public const DEFAULT_LATIN_CLOB_LENGTH = '1999M';
138138
public const DEFAULT_NON_LATIN_CHAR_LENGTH = 32000;
@@ -201,7 +201,6 @@ class Teradata extends Common
201201
self::TYPE_INTERVAL_SECOND,
202202

203203
];
204-
205204
// types where CHARAET can be defined
206205
public const CHARACTER_SET_TYPES = [
207206
self::TYPE_CHAR,
@@ -310,6 +309,11 @@ class Teradata extends Common
310309
self::TYPE_REAL,
311310
];
312311

312+
// these types expect invalid default length given TD. e.g. NUMBER returns -128,-128. -> has to be redefined
313+
public const TYPES_WITH_INVALID_DEFAULT_LENGTH = [
314+
self::TYPE_NUMBER => '-128,-128',
315+
];
316+
313317
private bool $isLatin = false;
314318

315319
// depends on Char Type column in HELP TABLE column
@@ -328,6 +332,7 @@ public function __construct(string $type, array $options = [])
328332
}
329333

330334
$this->validateType($type);
335+
$options['length'] = $this->consolidateLength($type, $options['length'] ?? null);
331336
$this->validateLength($type, $options['length'] ?? null);
332337
$diff = array_diff(array_keys($options), ['length', 'nullable', 'default', 'isLatin']);
333338
if ($diff !== []) {
@@ -336,6 +341,17 @@ public function __construct(string $type, array $options = [])
336341
parent::__construct($type, $options);
337342
}
338343

344+
private function consolidateLength(string $type, ?string $length = null): ?string
345+
{
346+
if ($length !== null
347+
&& array_key_exists($type, self::TYPES_WITH_INVALID_DEFAULT_LENGTH)
348+
&& $length === self::TYPES_WITH_INVALID_DEFAULT_LENGTH[$type]
349+
) {
350+
return null;
351+
}
352+
return $length;
353+
}
354+
339355
/**
340356
* @throws \Exception
341357
*/

tests/TeradataDatatypeTest.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,13 @@ public function expectedSqlDefinitions(): array
141141
'INTEGER' => ['INTEGER', [], 'INTEGER'],
142142
'INT' => ['INT', [], 'INT'],
143143

144-
'DECIMAL' => ['DECIMAL', [], 'DECIMAL (38,38)'],
145-
'NUMERIC' => ['NUMERIC', [], 'NUMERIC (38,38)'],
146-
'DEC' => ['DEC', [], 'DEC (38,38)'],
144+
'DECIMAL' => ['DECIMAL', [], 'DECIMAL (38,19)'],
145+
'NUMERIC' => ['NUMERIC', [], 'NUMERIC (38,19)'],
146+
'DEC' => ['DEC', [], 'DEC (38,19)'],
147147
'FLOAT' => ['FLOAT', [], 'FLOAT'],
148148
'DOUBLE PRECISION' => ['DOUBLE PRECISION', [], 'DOUBLE PRECISION'],
149149
'REAL' => ['REAL', [], 'REAL'],
150-
'NUMBER' => ['NUMBER', [], 'NUMBER (38,38)'],
150+
'NUMBER' => ['NUMBER', [], 'NUMBER (38,19)'],
151151
'BYTE' => ['BYTE', [], 'BYTE (64000)'],
152152
'VARBYTE' => ['VARBYTE', [], 'VARBYTE (64000)'],
153153
'BLOB' => ['BLOB', [], 'BLOB (1G)'],
@@ -228,6 +228,8 @@ public function validLengths(): array
228228
['REAL', null],
229229
['NUMBER', null],
230230
['NUMBER', '24,24'],
231+
// comes from HELP TABLE
232+
['NUMBER', '-128,-128'],
231233
['BYTE', null],
232234
['BYTE', '5000'],
233235
['VARBYTE', null],

0 commit comments

Comments
 (0)