xref: /sqlite-3.40.0/test/default.test (revision 088489e8)
1fc23314aSdrh# 2005 August 18
2fc23314aSdrh#
3fc23314aSdrh# The author disclaims copyright to this source code.  In place of
4fc23314aSdrh# a legal notice, here is a blessing:
5fc23314aSdrh#
6fc23314aSdrh#    May you do good and not evil.
7fc23314aSdrh#    May you find forgiveness for yourself and forgive others.
8fc23314aSdrh#    May you share freely, never taking more than you give.
9fc23314aSdrh#
10fc23314aSdrh#*************************************************************************
11fc23314aSdrh# This file implements regression tests for SQLite library.  The
12fc23314aSdrh# focus of this file is testing corner cases of the DEFAULT syntax
13fc23314aSdrh# on table definitions.
14fc23314aSdrh#
156ab3a2ecSdanielk1977# $Id: default.test,v 1.3 2009/02/19 14:39:25 danielk1977 Exp $
16fc23314aSdrh#
17fc23314aSdrh
18fc23314aSdrhset testdir [file dirname $argv0]
19fc23314aSdrhsource $testdir/tester.tcl
20fc23314aSdrh
21fc23314aSdrhifcapable bloblit {
22fc23314aSdrh  do_test default-1.1 {
23fc23314aSdrh    execsql {
24fc23314aSdrh      CREATE TABLE t1(
25fc23314aSdrh        a INTEGER,
26fc23314aSdrh        b BLOB DEFAULT x'6869'
27fc23314aSdrh      );
28fc23314aSdrh      INSERT INTO t1(a) VALUES(1);
29fc23314aSdrh      SELECT * from t1;
30fc23314aSdrh    }
31fc23314aSdrh  } {1 hi}
32fc23314aSdrh}
33fc23314aSdrhdo_test default-1.2 {
34fc23314aSdrh  execsql {
35fc23314aSdrh    CREATE TABLE t2(
36fc23314aSdrh      x INTEGER,
37fc23314aSdrh      y INTEGER DEFAULT NULL
38fc23314aSdrh    );
39fc23314aSdrh    INSERT INTO t2(x) VALUES(1);
40fc23314aSdrh    SELECT * FROM t2;
41fc23314aSdrh  }
42fc23314aSdrh} {1 {}}
4385c23c61Sdrhdo_test default-1.3 {
4485c23c61Sdrh  catchsql {
4585c23c61Sdrh    CREATE TABLE t3(
4685c23c61Sdrh      x INTEGER,
4785c23c61Sdrh      y INTEGER DEFAULT (max(x,5))
4885c23c61Sdrh    )
4985c23c61Sdrh  }
5085c23c61Sdrh} {1 {default value of column [y] is not constant}}
51fc23314aSdrh
526ab3a2ecSdanielk1977ifcapable pragma {
536ab3a2ecSdanielk1977  do_test default-2.1 {
546ab3a2ecSdanielk1977    execsql {
556ab3a2ecSdanielk1977      CREATE TABLE t4(c DEFAULT 'abc');
566ab3a2ecSdanielk1977      PRAGMA table_info(t4);
576ab3a2ecSdanielk1977    }
586ab3a2ecSdanielk1977  } {0 c {} 0 'abc' 0}
596ab3a2ecSdanielk1977  do_test default-2.2 {
606ab3a2ecSdanielk1977    execsql {
616ab3a2ecSdanielk1977      INSERT INTO t4 DEFAULT VALUES;
626ab3a2ecSdanielk1977      PRAGMA table_info(t4);
636ab3a2ecSdanielk1977    }
646ab3a2ecSdanielk1977  } {0 c {} 0 'abc' 0}
656ab3a2ecSdanielk1977}
666ab3a2ecSdanielk1977
67a0d6e3a5Sdrhdo_execsql_test default-3.1 {
68a0d6e3a5Sdrh  CREATE TABLE t3(
69a0d6e3a5Sdrh    a INTEGER PRIMARY KEY AUTOINCREMENT,
70a0d6e3a5Sdrh    b INT DEFAULT 12345 UNIQUE NOT NULL CHECK( b>=0 AND b<99999 ),
71a0d6e3a5Sdrh    c VARCHAR(123,456) DEFAULT 'hello' NOT NULL ON CONFLICT REPLACE,
72a0d6e3a5Sdrh    d REAL,
73a0d6e3a5Sdrh    e FLOATING POINT(5,10) DEFAULT 4.36,
74a0d6e3a5Sdrh    f NATIONAL CHARACTER(15) COLLATE RTRIM,
75a0d6e3a5Sdrh    g LONG INTEGER DEFAULT( 3600*12 )
76a0d6e3a5Sdrh  );
77a0d6e3a5Sdrh  INSERT INTO t3 VALUES(null, 5, 'row1', '5.25', 'xyz', 321, '432');
78a0d6e3a5Sdrh  SELECT a, typeof(a), b, typeof(b), c, typeof(c),
79a0d6e3a5Sdrh         d, typeof(d), e, typeof(e), f, typeof(f),
80a0d6e3a5Sdrh         g, typeof(g) FROM t3;
81a0d6e3a5Sdrh} {1 integer 5 integer row1 text 5.25 real xyz text 321 text 432 integer}
82a0d6e3a5Sdrhdo_execsql_test default-3.2 {
83a0d6e3a5Sdrh  DELETE FROM t3;
84a0d6e3a5Sdrh  INSERT INTO t3 DEFAULT VALUES;
85a0d6e3a5Sdrh  SELECT * FROM t3;
86a0d6e3a5Sdrh} {2 12345 hello {} 4.36 {} 43200}
87a0d6e3a5Sdrhdo_execsql_test default-3.3 {
88a0d6e3a5Sdrh  CREATE TABLE t300(
89a0d6e3a5Sdrh    a INT DEFAULT 2147483647,
90a0d6e3a5Sdrh    b INT DEFAULT 2147483648,
91a0d6e3a5Sdrh    c INT DEFAULT +9223372036854775807,
92a0d6e3a5Sdrh    d INT DEFAULT -2147483647,
93a0d6e3a5Sdrh    e INT DEFAULT -2147483648,
94a0d6e3a5Sdrh    f INT DEFAULT -9223372036854775808,
95a0d6e3a5Sdrh    g INT DEFAULT (-(-9223372036854775808)),
96a0d6e3a5Sdrh    h INT DEFAULT (-(-9223372036854775807))
97a0d6e3a5Sdrh  );
98a0d6e3a5Sdrh  INSERT INTO t300 DEFAULT VALUES;
99a0d6e3a5Sdrh  SELECT * FROM t300;
100a0d6e3a5Sdrh} {2147483647 2147483648 9223372036854775807 -2147483647 -2147483648 -9223372036854775808 9.22337203685478e+18 9223372036854775807}
101a0d6e3a5Sdrh
102feada2dfSdrh# Do now allow bound parameters in new DEFAULT values.
103feada2dfSdrh# Silently convert bound parameters to NULL in DEFAULT causes
104feada2dfSdrh# in the sqlite_master table, for backwards compatibility.
105feada2dfSdrh#
106feada2dfSdrhdb close
107feada2dfSdrhforcedelete test.db
108feada2dfSdrhsqlite3 db test.db
109b7c2cf0aSdrhsqlite3_db_config db DEFENSIVE 0
110feada2dfSdrhdo_execsql_test default-4.0 {
111feada2dfSdrh  CREATE TABLE t1(a TEXT, b TEXT DEFAULT(99));
112feada2dfSdrh  PRAGMA writable_schema=ON;
113feada2dfSdrh  UPDATE sqlite_master SET sql='CREATE TABLE t1(a TEXT, b TEXT DEFAULT(:xyz))';
114feada2dfSdrh} {}
115feada2dfSdrhdb close
116feada2dfSdrhsqlite3 db test.db
117feada2dfSdrhdo_execsql_test default-4.1 {
118feada2dfSdrh  INSERT INTO t1(a) VALUES('xyzzy');
119feada2dfSdrh  SELECT a, quote(b) FROM t1;
120feada2dfSdrh} {xyzzy NULL}
121feada2dfSdrhdo_catchsql_test default-4.2 {
122feada2dfSdrh  CREATE TABLE t2(a TEXT, b TEXT DEFAULT(:xyz));
123feada2dfSdrh} {1 {default value of column [b] is not constant}}
124feada2dfSdrhdo_catchsql_test default-4.3 {
125feada2dfSdrh  CREATE TABLE t2(a TEXT, b TEXT DEFAULT(abs(:xyz)));
126feada2dfSdrh} {1 {default value of column [b] is not constant}}
127feada2dfSdrhdo_catchsql_test default-4.4 {
128feada2dfSdrh  CREATE TABLE t2(a TEXT, b TEXT DEFAULT(98+coalesce(5,:xyz)));
129feada2dfSdrh} {1 {default value of column [b] is not constant}}
130feada2dfSdrh
131*088489e8Sdrh# 2020-03-09 out-of-bounds memory access discovered by "Eternal Sakura"
132*088489e8Sdrh# and reported to chromium.
133*088489e8Sdrh#
134*088489e8Sdrhreset_db
135*088489e8Sdrhdo_catchsql_test default-5.1 {
136*088489e8Sdrh  CREATE TABLE t1 (a,b DEFAULT(random() NOTNULL IN (RAISE(IGNORE),2,3)));
137*088489e8Sdrh  INSERT INTO t1(a) VALUES(1);
138*088489e8Sdrh} {1 {RAISE() may only be used within a trigger-program}}
139*088489e8Sdrh
140fc23314aSdrhfinish_test
141