4545 * nullable: string,
4646 * data_default: string|null,
4747 * constraint_type: string|null,
48+ * check: string|null,
4849 * column_comment: string|null,
4950 * schema: string,
5051 * table: string
@@ -331,6 +332,22 @@ protected function findColumns(TableSchemaInterface $table): bool
331332 $ tableName = $ table ->getName ();
332333
333334 $ sql = <<<SQL
335+ WITH C AS (
336+ SELECT AC.CONSTRAINT_TYPE, AC.SEARCH_CONDITION, ACC.COLUMN_NAME
337+ FROM ALL_CONSTRAINTS AC
338+ INNER JOIN ALL_CONS_COLUMNS ACC
339+ ON ACC.OWNER = AC.OWNER
340+ AND ACC.TABLE_NAME = AC.TABLE_NAME
341+ AND ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
342+ LEFT JOIN ALL_CONS_COLUMNS ACC2
343+ ON ACC2.OWNER = AC.OWNER
344+ AND ACC2.TABLE_NAME = AC.TABLE_NAME
345+ AND ACC2.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
346+ AND ACC2.COLUMN_NAME != ACC.COLUMN_NAME
347+ WHERE AC.OWNER = :schemaName2
348+ AND AC.TABLE_NAME = :tableName2
349+ AND (AC.CONSTRAINT_TYPE = 'P' OR AC.CONSTRAINT_TYPE IN ('U', 'C') AND ACC2.COLUMN_NAME IS NULL)
350+ )
334351 SELECT
335352 A.COLUMN_NAME,
336353 A.DATA_TYPE,
@@ -339,7 +356,8 @@ protected function findColumns(TableSchemaInterface $table): bool
339356 (CASE WHEN A.CHAR_LENGTH > 0 THEN A.CHAR_LENGTH ELSE A.DATA_PRECISION END) AS "size",
340357 A.NULLABLE,
341358 A.DATA_DEFAULT,
342- AC.CONSTRAINT_TYPE,
359+ C.CONSTRAINT_TYPE,
360+ C2.SEARCH_CONDITION AS "check",
343361 COM.COMMENTS AS COLUMN_COMMENT
344362 FROM ALL_TAB_COLUMNS A
345363 INNER JOIN ALL_OBJECTS B
@@ -349,26 +367,12 @@ protected function findColumns(TableSchemaInterface $table): bool
349367 ON COM.OWNER = A.OWNER
350368 AND COM.TABLE_NAME = A.TABLE_NAME
351369 AND COM.COLUMN_NAME = A.COLUMN_NAME
352- LEFT JOIN ALL_CONSTRAINTS AC
353- ON AC.OWNER = A.OWNER
354- AND AC.TABLE_NAME = A.TABLE_NAME
355- AND (AC.CONSTRAINT_TYPE = 'P'
356- OR AC.CONSTRAINT_TYPE = 'U'
357- AND (
358- SELECT COUNT(*)
359- FROM ALL_CONS_COLUMNS UCC
360- WHERE UCC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
361- AND UCC.TABLE_NAME = AC.TABLE_NAME
362- AND UCC.OWNER = AC.OWNER
363- ) = 1
364- )
365- AND AC.CONSTRAINT_NAME IN (
366- SELECT ACC.CONSTRAINT_NAME
367- FROM ALL_CONS_COLUMNS ACC
368- WHERE ACC.OWNER = A.OWNER
369- AND ACC.TABLE_NAME = A.TABLE_NAME
370- AND ACC.COLUMN_NAME = A.COLUMN_NAME
371- )
370+ LEFT JOIN C
371+ ON C.COLUMN_NAME = A.COLUMN_NAME
372+ AND C.CONSTRAINT_TYPE IN ('P', 'U')
373+ LEFT JOIN C C2
374+ ON C2.COLUMN_NAME = A.COLUMN_NAME
375+ AND C2.CONSTRAINT_TYPE = 'C'
372376 WHERE A.OWNER = :schemaName
373377 AND A.TABLE_NAME = :tableName
374378 AND B.OBJECT_TYPE IN ('TABLE', 'VIEW', 'MATERIALIZED VIEW')
@@ -377,7 +381,9 @@ protected function findColumns(TableSchemaInterface $table): bool
377381
378382 $ columns = $ this ->db ->createCommand ($ sql , [
379383 ':schemaName ' => $ schemaName ,
384+ ':schemaName2 ' => $ schemaName ,
380385 ':tableName ' => $ tableName ,
386+ ':tableName2 ' => $ tableName ,
381387 ])->queryAll ();
382388
383389 if ($ columns === []) {
@@ -453,6 +459,7 @@ private function loadColumn(array $info): ColumnInterface
453459
454460 return $ this ->getColumnFactory ()->fromDbType ($ dbType , [
455461 'autoIncrement ' => $ info ['identity_column ' ] === 'YES ' ,
462+ 'check ' => $ info ['check ' ],
456463 'comment ' => $ info ['column_comment ' ],
457464 'defaultValueRaw ' => $ info ['data_default ' ],
458465 'name ' => $ info ['column_name ' ],
0 commit comments