xref: /sqlite-3.40.0/test/alter3.test (revision 0f91a535)
119a8e7e8Sdanielk1977# 2005 February 19
219a8e7e8Sdanielk1977#
319a8e7e8Sdanielk1977# The author disclaims copyright to this source code.  In place of
419a8e7e8Sdanielk1977# a legal notice, here is a blessing:
519a8e7e8Sdanielk1977#
619a8e7e8Sdanielk1977#    May you do good and not evil.
719a8e7e8Sdanielk1977#    May you find forgiveness for yourself and forgive others.
819a8e7e8Sdanielk1977#    May you share freely, never taking more than you give.
919a8e7e8Sdanielk1977#
1019a8e7e8Sdanielk1977#*************************************************************************
1119a8e7e8Sdanielk1977# This file implements regression tests for SQLite library.  The
1219a8e7e8Sdanielk1977# focus of this script is testing that SQLite can handle a subtle
1319a8e7e8Sdanielk1977# file format change that may be used in the future to implement
1419a8e7e8Sdanielk1977# "ALTER TABLE ... ADD COLUMN".
1519a8e7e8Sdanielk1977#
1619a8e7e8Sdanielk1977
1719a8e7e8Sdanielk1977set testdir [file dirname $argv0]
1837b69a01Sdanielk1977
19b3a2ccedSdanielk1977source $testdir/tester.tcl
20b3a2ccedSdanielk1977
2137b69a01Sdanielk1977# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
2237b69a01Sdanielk1977ifcapable !altertable {
2337b69a01Sdanielk1977  finish_test
2437b69a01Sdanielk1977  return
2537b69a01Sdanielk1977}
2637b69a01Sdanielk1977
2792fd9d28Sdrh# Determine if there is a codec available on this test.
2892fd9d28Sdrh#
2986ae38b5Sdrhif {[catch {sqlite3 -has-codec} r] || $r} {
3092fd9d28Sdrh  set has_codec 1
3192fd9d28Sdrh} else {
3292fd9d28Sdrh  set has_codec 0
3392fd9d28Sdrh}
3492fd9d28Sdrh
3592fd9d28Sdrh
3619a8e7e8Sdanielk1977# Test Organisation:
3719a8e7e8Sdanielk1977# ------------------
3819a8e7e8Sdanielk1977#
3919a8e7e8Sdanielk1977# alter3-1.*: Test that ALTER TABLE correctly modifies the CREATE TABLE sql.
4019a8e7e8Sdanielk1977# alter3-2.*: Test error messages.
4119a8e7e8Sdanielk1977# alter3-3.*: Test adding columns with default value NULL.
4219a8e7e8Sdanielk1977# alter3-4.*: Test adding columns with default values other than NULL.
4319a8e7e8Sdanielk1977# alter3-5.*: Test adding columns to tables in ATTACHed databases.
4419a8e7e8Sdanielk1977# alter3-6.*: Test that temp triggers are not accidentally dropped.
4519a8e7e8Sdanielk1977# alter3-7.*: Test that VACUUM resets the file-format.
4619a8e7e8Sdanielk1977#
4719a8e7e8Sdanielk1977
4819a8e7e8Sdanielk1977# This procedure returns the value of the file-format in file 'test.db'.
4919a8e7e8Sdanielk1977#
5019a8e7e8Sdanielk1977proc get_file_format {{fname test.db}} {
51bb8a279eSdrh  return [hexio_get_int [hexio_read $fname 44 4]]
5219a8e7e8Sdanielk1977}
5319a8e7e8Sdanielk1977
5419a8e7e8Sdanielk1977do_test alter3-1.1 {
5566c48907Sdrh  sqlite3_db_config db LEGACY_FILE_FORMAT 1
5619a8e7e8Sdanielk1977  execsql {
5719a8e7e8Sdanielk1977    CREATE TABLE abc(a, b, c);
5819a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master;
5919a8e7e8Sdanielk1977  }
6019a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c)}}
6119a8e7e8Sdanielk1977do_test alter3-1.2 {
6219a8e7e8Sdanielk1977  execsql {ALTER TABLE abc ADD d INTEGER;}
6319a8e7e8Sdanielk1977  execsql {
6419a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master;
6519a8e7e8Sdanielk1977  }
6619a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c, d INTEGER)}}
6719a8e7e8Sdanielk1977do_test alter3-1.3 {
6819a8e7e8Sdanielk1977  execsql {ALTER TABLE abc ADD e}
6919a8e7e8Sdanielk1977  execsql {
7019a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master;
7119a8e7e8Sdanielk1977  }
7219a8e7e8Sdanielk1977} {{CREATE TABLE abc(a, b, c, d INTEGER, e)}}
7319a8e7e8Sdanielk1977do_test alter3-1.4 {
7419a8e7e8Sdanielk1977  execsql {
7519a8e7e8Sdanielk1977    CREATE TABLE main.t1(a, b);
7619a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c;
7719a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
7819a8e7e8Sdanielk1977  }
7919a8e7e8Sdanielk1977} {{CREATE TABLE t1(a, b, c)}}
8019a8e7e8Sdanielk1977do_test alter3-1.5 {
8119a8e7e8Sdanielk1977  execsql {
8219a8e7e8Sdanielk1977    ALTER TABLE t1 ADD d CHECK (a>d);
8319a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master WHERE tbl_name = 't1';
8419a8e7e8Sdanielk1977  }
8519a8e7e8Sdanielk1977} {{CREATE TABLE t1(a, b, c, d CHECK (a>d))}}
86ff890793Sdanielk1977ifcapable foreignkey {
8719a8e7e8Sdanielk1977  do_test alter3-1.6 {
8819a8e7e8Sdanielk1977    execsql {
8919a8e7e8Sdanielk1977      CREATE TABLE t2(a, b, UNIQUE(a, b));
9019a8e7e8Sdanielk1977      ALTER TABLE t2 ADD c REFERENCES t1(c)  ;
9119a8e7e8Sdanielk1977      SELECT sql FROM sqlite_master WHERE tbl_name = 't2' AND type = 'table';
9219a8e7e8Sdanielk1977    }
9319a8e7e8Sdanielk1977  } {{CREATE TABLE t2(a, b, c REFERENCES t1(c), UNIQUE(a, b))}}
94ff890793Sdanielk1977}
9519a8e7e8Sdanielk1977do_test alter3-1.7 {
9619a8e7e8Sdanielk1977  execsql {
9719a8e7e8Sdanielk1977    CREATE TABLE t3(a, b, UNIQUE(a, b));
9819a8e7e8Sdanielk1977    ALTER TABLE t3 ADD COLUMN c VARCHAR(10, 20);
9919a8e7e8Sdanielk1977    SELECT sql FROM sqlite_master WHERE tbl_name = 't3' AND type = 'table';
10019a8e7e8Sdanielk1977  }
10119a8e7e8Sdanielk1977} {{CREATE TABLE t3(a, b, c VARCHAR(10, 20), UNIQUE(a, b))}}
10219a8e7e8Sdanielk1977do_test alter3-1.99 {
103ff890793Sdanielk1977  catchsql {
104ff890793Sdanielk1977    # May not exist if foriegn-keys are omitted at compile time.
105ff890793Sdanielk1977    DROP TABLE t2;
106ff890793Sdanielk1977  }
10719a8e7e8Sdanielk1977  execsql {
10819a8e7e8Sdanielk1977    DROP TABLE abc;
10919a8e7e8Sdanielk1977    DROP TABLE t1;
11019a8e7e8Sdanielk1977    DROP TABLE t3;
11119a8e7e8Sdanielk1977  }
11219a8e7e8Sdanielk1977} {}
11319a8e7e8Sdanielk1977
11419a8e7e8Sdanielk1977do_test alter3-2.1 {
11519a8e7e8Sdanielk1977  execsql {
11619a8e7e8Sdanielk1977    CREATE TABLE t1(a, b);
1179e5fdc41Sdrh    INSERT INTO t1 VALUES(1,2);
11819a8e7e8Sdanielk1977  }
11919a8e7e8Sdanielk1977  catchsql {
12019a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c PRIMARY KEY;
12119a8e7e8Sdanielk1977  }
12219a8e7e8Sdanielk1977} {1 {Cannot add a PRIMARY KEY column}}
12319a8e7e8Sdanielk1977do_test alter3-2.2 {
12419a8e7e8Sdanielk1977  catchsql {
12519a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c UNIQUE
12619a8e7e8Sdanielk1977  }
12719a8e7e8Sdanielk1977} {1 {Cannot add a UNIQUE column}}
12819a8e7e8Sdanielk1977do_test alter3-2.3 {
12919a8e7e8Sdanielk1977  catchsql {
13019a8e7e8Sdanielk1977    ALTER TABLE t1 ADD b VARCHAR(10)
13119a8e7e8Sdanielk1977  }
13219a8e7e8Sdanielk1977} {1 {duplicate column name: b}}
13319a8e7e8Sdanielk1977do_test alter3-2.3 {
13419a8e7e8Sdanielk1977  catchsql {
13519a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c NOT NULL;
13619a8e7e8Sdanielk1977  }
13719a8e7e8Sdanielk1977} {1 {Cannot add a NOT NULL column with default value NULL}}
13819a8e7e8Sdanielk1977do_test alter3-2.4 {
13919a8e7e8Sdanielk1977  catchsql {
14019a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c NOT NULL DEFAULT 10;
14119a8e7e8Sdanielk1977  }
14219a8e7e8Sdanielk1977} {0 {}}
1433bdca9c9Sdanielk1977ifcapable view {
14419a8e7e8Sdanielk1977  do_test alter3-2.5 {
14519a8e7e8Sdanielk1977    execsql {
14619a8e7e8Sdanielk1977      CREATE VIEW v1 AS SELECT * FROM t1;
14719a8e7e8Sdanielk1977    }
14819a8e7e8Sdanielk1977    catchsql {
14919a8e7e8Sdanielk1977      alter table v1 add column d;
15019a8e7e8Sdanielk1977    }
15119a8e7e8Sdanielk1977  } {1 {Cannot add a column to a view}}
1523bdca9c9Sdanielk1977}
15319a8e7e8Sdanielk1977do_test alter3-2.6 {
15419a8e7e8Sdanielk1977  catchsql {
15519a8e7e8Sdanielk1977    alter table t1 add column d DEFAULT CURRENT_TIME;
15619a8e7e8Sdanielk1977  }
15719a8e7e8Sdanielk1977} {1 {Cannot add a column with non-constant default}}
15819a8e7e8Sdanielk1977do_test alter3-2.99 {
15919a8e7e8Sdanielk1977  execsql {
16019a8e7e8Sdanielk1977    DROP TABLE t1;
16119a8e7e8Sdanielk1977  }
16219a8e7e8Sdanielk1977} {}
16319a8e7e8Sdanielk1977
16419a8e7e8Sdanielk1977do_test alter3-3.1 {
16519a8e7e8Sdanielk1977  execsql {
16619a8e7e8Sdanielk1977    CREATE TABLE t1(a, b);
16719a8e7e8Sdanielk1977    INSERT INTO t1 VALUES(1, 100);
16819a8e7e8Sdanielk1977    INSERT INTO t1 VALUES(2, 300);
16919a8e7e8Sdanielk1977    SELECT * FROM t1;
17019a8e7e8Sdanielk1977  }
17119a8e7e8Sdanielk1977} {1 100 2 300}
17219a8e7e8Sdanielk1977do_test alter3-3.1 {
17319a8e7e8Sdanielk1977  execsql {
17419a8e7e8Sdanielk1977    PRAGMA schema_version = 10;
17519a8e7e8Sdanielk1977  }
17619a8e7e8Sdanielk1977} {}
17719a8e7e8Sdanielk1977do_test alter3-3.2 {
17819a8e7e8Sdanielk1977  execsql {
17919a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c;
18019a8e7e8Sdanielk1977    SELECT * FROM t1;
18119a8e7e8Sdanielk1977  }
18219a8e7e8Sdanielk1977} {1 100 {} 2 300 {}}
18392fd9d28Sdrhif {!$has_codec} {
18419a8e7e8Sdanielk1977  do_test alter3-3.3 {
18519a8e7e8Sdanielk1977    get_file_format
18686396219Sdrh  } {3}
18792fd9d28Sdrh}
1883bdca9c9Sdanielk1977ifcapable schema_version {
18919a8e7e8Sdanielk1977  do_test alter3-3.4 {
19019a8e7e8Sdanielk1977    execsql {
19119a8e7e8Sdanielk1977      PRAGMA schema_version;
19219a8e7e8Sdanielk1977    }
19319a8e7e8Sdanielk1977  } {11}
1943bdca9c9Sdanielk1977}
19519a8e7e8Sdanielk1977
19619a8e7e8Sdanielk1977do_test alter3-4.1 {
19719a8e7e8Sdanielk1977  db close
198fda06befSmistachkin  forcedelete test.db
19919a8e7e8Sdanielk1977  set ::DB [sqlite3 db test.db]
20066c48907Sdrh  sqlite3_db_config db LEGACY_FILE_FORMAT 1
20119a8e7e8Sdanielk1977  execsql {
20219a8e7e8Sdanielk1977    CREATE TABLE t1(a, b);
20319a8e7e8Sdanielk1977    INSERT INTO t1 VALUES(1, 100);
20419a8e7e8Sdanielk1977    INSERT INTO t1 VALUES(2, 300);
20519a8e7e8Sdanielk1977    SELECT * FROM t1;
20619a8e7e8Sdanielk1977  }
20719a8e7e8Sdanielk1977} {1 100 2 300}
20819a8e7e8Sdanielk1977do_test alter3-4.1 {
20919a8e7e8Sdanielk1977  execsql {
21019a8e7e8Sdanielk1977    PRAGMA schema_version = 20;
21119a8e7e8Sdanielk1977  }
21219a8e7e8Sdanielk1977} {}
21319a8e7e8Sdanielk1977do_test alter3-4.2 {
21419a8e7e8Sdanielk1977  execsql {
21519a8e7e8Sdanielk1977    ALTER TABLE t1 ADD c DEFAULT 'hello world';
21619a8e7e8Sdanielk1977    SELECT * FROM t1;
21719a8e7e8Sdanielk1977  }
21819a8e7e8Sdanielk1977} {1 100 {hello world} 2 300 {hello world}}
21992fd9d28Sdrhif {!$has_codec} {
22019a8e7e8Sdanielk1977  do_test alter3-4.3 {
22119a8e7e8Sdanielk1977    get_file_format
22286396219Sdrh  } {3}
22392fd9d28Sdrh}
2243bdca9c9Sdanielk1977ifcapable schema_version {
22519a8e7e8Sdanielk1977  do_test alter3-4.4 {
22619a8e7e8Sdanielk1977    execsql {
22719a8e7e8Sdanielk1977      PRAGMA schema_version;
22819a8e7e8Sdanielk1977    }
22919a8e7e8Sdanielk1977  } {21}
2303bdca9c9Sdanielk1977}
23119a8e7e8Sdanielk1977do_test alter3-4.99 {
23219a8e7e8Sdanielk1977  execsql {
23319a8e7e8Sdanielk1977    DROP TABLE t1;
23419a8e7e8Sdanielk1977  }
23519a8e7e8Sdanielk1977} {}
23619a8e7e8Sdanielk1977
2375a8f9374Sdanielk1977ifcapable attach {
23819a8e7e8Sdanielk1977  do_test alter3-5.1 {
239fda06befSmistachkin    forcedelete test2.db
240fda06befSmistachkin    forcedelete test2.db-journal
24119a8e7e8Sdanielk1977    execsql {
24219a8e7e8Sdanielk1977      CREATE TABLE t1(a, b);
24319a8e7e8Sdanielk1977      INSERT INTO t1 VALUES(1, 'one');
24419a8e7e8Sdanielk1977      INSERT INTO t1 VALUES(2, 'two');
24519a8e7e8Sdanielk1977      ATTACH 'test2.db' AS aux;
24619a8e7e8Sdanielk1977      CREATE TABLE aux.t1 AS SELECT * FROM t1;
24719a8e7e8Sdanielk1977      PRAGMA aux.schema_version = 30;
24819a8e7e8Sdanielk1977      SELECT sql FROM aux.sqlite_master;
24919a8e7e8Sdanielk1977    }
25019a8e7e8Sdanielk1977  } {{CREATE TABLE t1(a,b)}}
25119a8e7e8Sdanielk1977  do_test alter3-5.2 {
25219a8e7e8Sdanielk1977    execsql {
25319a8e7e8Sdanielk1977      ALTER TABLE aux.t1 ADD COLUMN c VARCHAR(128);
25419a8e7e8Sdanielk1977      SELECT sql FROM aux.sqlite_master;
25519a8e7e8Sdanielk1977    }
25619a8e7e8Sdanielk1977  } {{CREATE TABLE t1(a,b, c VARCHAR(128))}}
25719a8e7e8Sdanielk1977  do_test alter3-5.3 {
25819a8e7e8Sdanielk1977    execsql {
25919a8e7e8Sdanielk1977      SELECT * FROM aux.t1;
26019a8e7e8Sdanielk1977    }
26119a8e7e8Sdanielk1977  } {1 one {} 2 two {}}
2623bdca9c9Sdanielk1977  ifcapable schema_version {
26319a8e7e8Sdanielk1977    do_test alter3-5.4 {
26419a8e7e8Sdanielk1977      execsql {
26519a8e7e8Sdanielk1977        PRAGMA aux.schema_version;
26619a8e7e8Sdanielk1977      }
26719a8e7e8Sdanielk1977    } {31}
2683bdca9c9Sdanielk1977  }
26992fd9d28Sdrh  if {!$has_codec} {
27019a8e7e8Sdanielk1977    do_test alter3-5.5 {
27119a8e7e8Sdanielk1977      list [get_file_format test2.db] [get_file_format]
27286396219Sdrh    } {3 3}
27392fd9d28Sdrh  }
27419a8e7e8Sdanielk1977  do_test alter3-5.6 {
27519a8e7e8Sdanielk1977    execsql {
27619a8e7e8Sdanielk1977      ALTER TABLE aux.t1 ADD COLUMN d DEFAULT 1000;
27719a8e7e8Sdanielk1977      SELECT sql FROM aux.sqlite_master;
27819a8e7e8Sdanielk1977    }
27919a8e7e8Sdanielk1977  } {{CREATE TABLE t1(a,b, c VARCHAR(128), d DEFAULT 1000)}}
28019a8e7e8Sdanielk1977  do_test alter3-5.7 {
28119a8e7e8Sdanielk1977    execsql {
28219a8e7e8Sdanielk1977      SELECT * FROM aux.t1;
28319a8e7e8Sdanielk1977    }
28419a8e7e8Sdanielk1977  } {1 one {} 1000 2 two {} 1000}
2853bdca9c9Sdanielk1977  ifcapable schema_version {
28619a8e7e8Sdanielk1977    do_test alter3-5.8 {
28719a8e7e8Sdanielk1977      execsql {
28819a8e7e8Sdanielk1977        PRAGMA aux.schema_version;
28919a8e7e8Sdanielk1977      }
29019a8e7e8Sdanielk1977    } {32}
2913bdca9c9Sdanielk1977  }
29219a8e7e8Sdanielk1977  do_test alter3-5.9 {
29319a8e7e8Sdanielk1977    execsql {
29419a8e7e8Sdanielk1977      SELECT * FROM t1;
29519a8e7e8Sdanielk1977    }
29619a8e7e8Sdanielk1977  } {1 one 2 two}
29719a8e7e8Sdanielk1977  do_test alter3-5.99 {
29819a8e7e8Sdanielk1977    execsql {
29919a8e7e8Sdanielk1977      DROP TABLE aux.t1;
30019a8e7e8Sdanielk1977      DROP TABLE t1;
30119a8e7e8Sdanielk1977    }
30219a8e7e8Sdanielk1977  } {}
3035a8f9374Sdanielk1977}
30419a8e7e8Sdanielk1977
30519a8e7e8Sdanielk1977#----------------------------------------------------------------
30619a8e7e8Sdanielk1977# Test that the table schema is correctly reloaded when a column
30719a8e7e8Sdanielk1977# is added to a table.
30819a8e7e8Sdanielk1977#
30953c0f748Sdanielk1977ifcapable trigger&&tempdb {
31019a8e7e8Sdanielk1977  do_test alter3-6.1 {
31119a8e7e8Sdanielk1977    execsql {
31219a8e7e8Sdanielk1977      CREATE TABLE t1(a, b);
31319a8e7e8Sdanielk1977      CREATE TABLE log(trig, a, b);
31419a8e7e8Sdanielk1977
31519a8e7e8Sdanielk1977      CREATE TRIGGER t1_a AFTER INSERT ON t1 BEGIN
31619a8e7e8Sdanielk1977        INSERT INTO log VALUES('a', new.a, new.b);
31719a8e7e8Sdanielk1977      END;
31819a8e7e8Sdanielk1977      CREATE TEMP TRIGGER t1_b AFTER INSERT ON t1 BEGIN
31919a8e7e8Sdanielk1977        INSERT INTO log VALUES('b', new.a, new.b);
32019a8e7e8Sdanielk1977      END;
32119a8e7e8Sdanielk1977
32219a8e7e8Sdanielk1977      INSERT INTO t1 VALUES(1, 2);
32319a8e7e8Sdanielk1977      SELECT * FROM log;
32419a8e7e8Sdanielk1977    }
32519a8e7e8Sdanielk1977  } {b 1 2 a 1 2}
32619a8e7e8Sdanielk1977  do_test alter3-6.2 {
32719a8e7e8Sdanielk1977    execsql {
32819a8e7e8Sdanielk1977      ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
32919a8e7e8Sdanielk1977      INSERT INTO t1(a, b) VALUES(3, 4);
33019a8e7e8Sdanielk1977      SELECT * FROM log;
33119a8e7e8Sdanielk1977    }
33219a8e7e8Sdanielk1977  } {b 1 2 a 1 2 b 3 4 a 3 4}
33319a8e7e8Sdanielk1977}
33419a8e7e8Sdanielk1977
33592fd9d28Sdrhif {!$has_codec} {
33619a8e7e8Sdanielk1977  ifcapable vacuum {
33719a8e7e8Sdanielk1977    do_test alter3-7.1 {
33819a8e7e8Sdanielk1977      execsql {
33919a8e7e8Sdanielk1977        VACUUM;
34019a8e7e8Sdanielk1977      }
34119a8e7e8Sdanielk1977      get_file_format
34219a8e7e8Sdanielk1977    } {1}
34319a8e7e8Sdanielk1977    do_test alter3-7.2 {
34419a8e7e8Sdanielk1977      execsql {
34519a8e7e8Sdanielk1977        CREATE TABLE abc(a, b, c);
34619a8e7e8Sdanielk1977        ALTER TABLE abc ADD d DEFAULT NULL;
34719a8e7e8Sdanielk1977      }
34819a8e7e8Sdanielk1977      get_file_format
34986396219Sdrh    } {3}
35019a8e7e8Sdanielk1977    do_test alter3-7.3 {
35119a8e7e8Sdanielk1977      execsql {
35219a8e7e8Sdanielk1977        ALTER TABLE abc ADD e DEFAULT 10;
35319a8e7e8Sdanielk1977      }
35419a8e7e8Sdanielk1977      get_file_format
35586396219Sdrh    } {3}
35619a8e7e8Sdanielk1977    do_test alter3-7.4 {
35719a8e7e8Sdanielk1977      execsql {
35819a8e7e8Sdanielk1977        ALTER TABLE abc ADD f DEFAULT NULL;
35919a8e7e8Sdanielk1977      }
36019a8e7e8Sdanielk1977      get_file_format
36186396219Sdrh    } {3}
36219a8e7e8Sdanielk1977    do_test alter3-7.5 {
36319a8e7e8Sdanielk1977      execsql {
36419a8e7e8Sdanielk1977        VACUUM;
36519a8e7e8Sdanielk1977      }
36619a8e7e8Sdanielk1977      get_file_format
36719a8e7e8Sdanielk1977    } {1}
36819a8e7e8Sdanielk1977  }
36992fd9d28Sdrh}
37019a8e7e8Sdanielk1977
371b3a2ccedSdanielk1977# Ticket #1183 - Make sure adding columns to large tables does not cause
372b3a2ccedSdanielk1977# memory corruption (as was the case before this bug was fixed).
373b3a2ccedSdanielk1977do_test alter3-8.1 {
374b3a2ccedSdanielk1977  execsql {
375b3a2ccedSdanielk1977    CREATE TABLE t4(c1);
376b3a2ccedSdanielk1977  }
377b3a2ccedSdanielk1977} {}
378aef0bf64Sdanielk1977set ::sql ""
379b3a2ccedSdanielk1977do_test alter3-8.2 {
380b3a2ccedSdanielk1977  set cols c1
381b3a2ccedSdanielk1977  for {set i 2} {$i < 100} {incr i} {
382b3a2ccedSdanielk1977    execsql "
383b3a2ccedSdanielk1977      ALTER TABLE t4 ADD c$i
384b3a2ccedSdanielk1977    "
385b3a2ccedSdanielk1977    lappend cols c$i
386b3a2ccedSdanielk1977  }
387b3a2ccedSdanielk1977  set ::sql "CREATE TABLE t4([join $cols {, }])"
388b3a2ccedSdanielk1977  list
389b3a2ccedSdanielk1977} {}
390b3a2ccedSdanielk1977do_test alter3-8.2 {
391b3a2ccedSdanielk1977  execsql {
392b3a2ccedSdanielk1977    SELECT sql FROM sqlite_master WHERE name = 't4';
393b3a2ccedSdanielk1977  }
394b3a2ccedSdanielk1977} [list $::sql]
395b3a2ccedSdanielk1977
396*0f91a535Sdrh# 2021-07-20:  Add support for detecting CHECK and NOT NULL constraint
397*0f91a535Sdrh# violations in ALTER TABLE ADD COLUMN
398*0f91a535Sdrh#
399*0f91a535Sdrhreset_db
400*0f91a535Sdrhdo_execsql_test alter3-9.1 {
401*0f91a535Sdrh  CREATE TABLE t1(a,b);
402*0f91a535Sdrh  INSERT INTO t1 VALUES(1, 2), ('null!',NULL), (3,4);
403*0f91a535Sdrh} {}
404*0f91a535Sdrhdo_catchsql_test alter3-9.2 {
405*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN c CHECK(a!=1);
406*0f91a535Sdrh} {1 {CHECK constraint failed}}
407*0f91a535Sdrhdo_catchsql_test alter3-9.3 {
408*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN c CHECK(a!=3);
409*0f91a535Sdrh} {1 {CHECK constraint failed}}
410*0f91a535Sdrhdo_catchsql_test alter3-9.4 {
411*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN c CHECK(a!=2);
412*0f91a535Sdrh} {0 {}}
413*0f91a535Sdrhdo_catchsql_test alter3-9.5 {
414*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL;
415*0f91a535Sdrh} {1 {NOT NULL constraint failed}}
416*0f91a535Sdrhdo_catchsql_test alter3-9.6 {
417*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=1);
418*0f91a535Sdrh} {1 {CHECK constraint failed}}
419*0f91a535Sdrhdo_catchsql_test alter3-9.7 {
420*0f91a535Sdrh  ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=3);
421*0f91a535Sdrh} {1 {NOT NULL constraint failed}}
422*0f91a535Sdrh
423*0f91a535Sdrhdo_execsql_test alter3-9.10 {
424*0f91a535Sdrh  CREATE TEMP TABLE t0(m,n);
425*0f91a535Sdrh  INSERT INTO t0 VALUES(1, 2), ('null!',NULL), (3,4);
426*0f91a535Sdrh  ATTACH ':memory:' AS aux1;
427*0f91a535Sdrh  CREATE TABLE aux1.t2(x,y);
428*0f91a535Sdrh  INSERT INTO t2 VALUES(1, 2), ('null!',NULL), (3,4);
429*0f91a535Sdrh} {}
430*0f91a535Sdrhdo_catchsql_test alter3-9.11 {
431*0f91a535Sdrh  ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=1);
432*0f91a535Sdrh} {1 {CHECK constraint failed}}
433*0f91a535Sdrhdo_catchsql_test alter3-9.12 {
434*0f91a535Sdrh  ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=3);
435*0f91a535Sdrh} {1 {NOT NULL constraint failed}}
436*0f91a535Sdrhdo_catchsql_test alter3-9.13 {
437*0f91a535Sdrh  ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=1);
438*0f91a535Sdrh} {1 {CHECK constraint failed}}
439*0f91a535Sdrhdo_catchsql_test alter3-9.14 {
440*0f91a535Sdrh  ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=3);
441*0f91a535Sdrh} {1 {NOT NULL constraint failed}}
442*0f91a535Sdrh
44319a8e7e8Sdanielk1977finish_test
444