gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/strict1.test (about)

     1  # 2021-08-18
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # This file implements regression tests for SQLite library.  The
    13  # focus of this file is testing STRICT tables.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set testprefix strict1
    19  
    20  # STRICT tables have on a limited number of allowed datatypes.
    21  #
    22  do_catchsql_test strict1-1.1 {
    23    CREATE TABLE t1(a) STRICT;
    24  } {1 {missing datatype for t1.a}}
    25  do_catchsql_test strict1-1.2 {
    26    CREATE TABLE t1(a PRIMARY KEY) STRICT, WITHOUT ROWID;
    27  } {1 {missing datatype for t1.a}}
    28  do_catchsql_test strict1-1.3 {
    29    CREATE TABLE t1(a PRIMARY KEY) WITHOUT ROWID, STRICT;
    30  } {1 {missing datatype for t1.a}}
    31  do_catchsql_test strict1-1.4 {
    32    CREATE TABLE t1(a BANJO PRIMARY KEY) WITHOUT ROWID, STRICT;
    33  } {1 {unknown datatype for t1.a: "BANJO"}}
    34  do_catchsql_test strict1-1.5 {
    35    CREATE TABLE t1(a TEXT PRIMARY KEY, b INT, c INTEGER, d REAL, e BLOB, f DATE) strict;
    36  } {1 {unknown datatype for t1.f: "DATE"}}
    37  do_catchsql_test strict1-1.6 {
    38    CREATE TABLE t1(a TEXT PRIMARY KEY, b INT, c INTEGER, d REAL, e BLOB, f TEXT(50)) WITHOUT ROWID, STRICT;
    39  } {1 {unknown datatype for t1.f: "TEXT(50)"}}
    40  
    41  do_execsql_test strict1-2.0 {
    42    CREATE TABLE t1(
    43      a INT,
    44      b INTEGER,
    45      c BLOB,
    46      d TEXT,
    47      e REAL
    48    ) STRICT;
    49  } {}
    50  ifcapable vtab {
    51    do_execsql_test strict1-2.0a {
    52      SELECT strict FROM pragma_table_list('t1');
    53    } {1}
    54  }
    55  do_catchsql_test strict1-2.1 {
    56    INSERT INTO t1(a) VALUES('xyz');
    57  } {1 {cannot store TEXT value in INT column t1.a}}
    58  do_catchsql_test strict1-2.2 {
    59    INSERT INTO t1(b) VALUES('xyz');
    60  } {1 {cannot store TEXT value in INTEGER column t1.b}}
    61  do_catchsql_test strict1-2.3 {
    62    INSERT INTO t1(c) VALUES('xyz');
    63  } {1 {cannot store TEXT value in BLOB column t1.c}}
    64  do_catchsql_test strict1-2.4 {
    65    INSERT INTO t1(d) VALUES(x'3142536475');
    66  } {1 {cannot store BLOB value in TEXT column t1.d}}
    67  do_catchsql_test strict1-2.5 {
    68    INSERT INTO t1(e) VALUES('xyz');
    69  } {1 {cannot store TEXT value in REAL column t1.e}}
    70  
    71  
    72  do_execsql_test strict1-3.1 {
    73    INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null);
    74    SELECT a, b, '|' FROM t1;
    75  } {1 2 | 3 4 | 5 6 | {} {} |}
    76  do_catchsql_test strict1-3.2 {
    77    INSERT INTO t1(a) VALUES(1.2);
    78  } {1 {cannot store REAL value in INT column t1.a}}
    79  do_catchsql_test strict1-3.3 {
    80    INSERT INTO t1(a) VALUES(x'313233');
    81  } {1 {cannot store BLOB value in INT column t1.a}}
    82  do_catchsql_test strict1-3.4 {
    83    INSERT INTO t1(b) VALUES(1.2);
    84  } {1 {cannot store REAL value in INTEGER column t1.b}}
    85  do_catchsql_test strict1-3.5 {
    86    INSERT INTO t1(b) VALUES(x'313233');
    87  } {1 {cannot store BLOB value in INTEGER column t1.b}}
    88  
    89  do_execsql_test strict1-4.1 {
    90    DELETE FROM t1;
    91    INSERT INTO t1(c) VALUES(x'313233'), (NULL);
    92    SELECT typeof(c), c FROM t1;
    93  } {blob 123 null {}}
    94  do_catchsql_test strict1-4.2 {
    95    INSERT INTO t1(c) VALUES('456');
    96  } {1 {cannot store TEXT value in BLOB column t1.c}}
    97  
    98  do_execsql_test strict1-5.1 {
    99    DELETE FROM t1;
   100    INSERT INTO t1(d) VALUES('xyz'),(4),(5.5),(NULL);
   101    SELECT typeof(d), d FROM t1;
   102  } {text xyz text 4 text 5.5 null {}}
   103  do_catchsql_test strict1-5.2 {
   104    INSERT INTO t1(d) VALUES(x'4567');
   105  } {1 {cannot store BLOB value in TEXT column t1.d}}
   106  
   107  do_execsql_test strict1-6.1 {
   108    DELETE FROM t1;
   109    INSERT INTO t1(e) VALUES(1),(2.5),('3'),('4.5'),(6.0),(NULL);
   110    SELECT typeof(e), e FROM t1;
   111  } {real 1.0 real 2.5 real 3.0 real 4.5 real 6.0 null {}}
   112  do_catchsql_test strict1-6.2 {
   113    INSERT INTO t1(e) VALUES('xyz');
   114  } {1 {cannot store TEXT value in REAL column t1.e}}
   115  do_catchsql_test strict1-6.3 {
   116    INSERT INTO t1(e) VALUES(x'3456');
   117  } {1 {cannot store BLOB value in REAL column t1.e}}
   118  
   119  ifcapable altertable {
   120    do_execsql_test strict1-7.1 {
   121      DROP TABLE IF EXISTS t4;
   122      CREATE TABLE t4(
   123        a INT AS (b*2) VIRTUAL,
   124        b INT AS (c*2) STORED,
   125        c INT PRIMARY KEY
   126      ) STRICT;
   127      INSERT INTO t4(c) VALUES(1);
   128      SELECT * FROM t4;
   129    } {4 2 1}
   130    do_catchsql_test strict1-7.2 {
   131      ALTER TABLE t4 ADD COLUMN d VARCHAR;
   132    } {1 {error in table t4 after add column: unknown datatype for t4.d: "VARCHAR"}}
   133    do_catchsql_test strict1-7.3 {
   134      ALTER TABLE t4 ADD COLUMN d;
   135    } {1 {error in table t4 after add column: missing datatype for t4.d}}
   136  }
   137  
   138  # 2022-01-17 https://sqlite.org/forum/forumpost/fa012c77796d9399
   139  # 
   140  reset_db
   141  do_execsql_test strict1-8.1 {
   142    CREATE TABLE csv_import_table (
   143      "debit" TEXT,
   144      "credit" TEXT
   145    );
   146    INSERT INTO csv_import_table VALUES ('', '250.00');
   147    CREATE TABLE IF NOT EXISTS transactions (
   148        debit REAL,
   149        credit REAL,
   150        amount REAL GENERATED ALWAYS AS (ifnull(credit, 0.0) - ifnull(debit, 0.0))
   151    ) STRICT;
   152    INSERT INTO transactions
   153    SELECT
   154        nullif(debit, '') AS debit,
   155        nullif(credit, '') AS credit
   156    FROM csv_import_table;
   157    SELECT * FROM transactions;
   158  } {{} 250.0 250.0}
   159  do_execsql_test strict1-8.2 {
   160    CREATE TABLE t1(x REAL, y REAL AS (x)) STRICT;
   161    INSERT INTO t1 VALUES(5),(4611686018427387904);
   162    SELECT *, '|' FROM t1;
   163  } {/5.0 5.0 4.6116\d*e\+18 4.6116\d+e\+18 |/}
   164  
   165  finish_test