xref: /sqlite-3.40.0/test/vtab2.test (revision 4dd176ea)
1e7ff403aSdanielk1977# 2006 June 10
2e7ff403aSdanielk1977#
3e7ff403aSdanielk1977# The author disclaims copyright to this source code.  In place of
4e7ff403aSdanielk1977# a legal notice, here is a blessing:
5e7ff403aSdanielk1977#
6e7ff403aSdanielk1977#    May you do good and not evil.
7e7ff403aSdanielk1977#    May you find forgiveness for yourself and forgive others.
8e7ff403aSdanielk1977#    May you share freely, never taking more than you give.
9e7ff403aSdanielk1977#
10e7ff403aSdanielk1977#***********************************************************************
11e7ff403aSdanielk1977# This file implements regression tests for SQLite library.
12e7ff403aSdanielk1977#
13e7ff403aSdanielk1977
14e7ff403aSdanielk1977set testdir [file dirname $argv0]
15e7ff403aSdanielk1977source $testdir/tester.tcl
167377945aSdanset testprefix vtab2
17e7ff403aSdanielk1977
184b2688abSdanielk1977ifcapable !vtab||!schema_pragmas {
19e7ff403aSdanielk1977  finish_test
20e7ff403aSdanielk1977  return
21e7ff403aSdanielk1977}
22e7ff403aSdanielk1977
23e7ff403aSdanielk1977register_schema_module [sqlite3_connection_pointer db]
24e7ff403aSdanielk1977do_test vtab2-1.1 {
25e7ff403aSdanielk1977  execsql {
26e7ff403aSdanielk1977    CREATE VIRTUAL TABLE schema USING schema;
27e7ff403aSdanielk1977    SELECT * FROM schema;
28e7ff403aSdanielk1977  }
29e7ff403aSdanielk1977} [list \
30e7ff403aSdanielk1977  main schema 0 database   {} 0 {} 0 \
31e7ff403aSdanielk1977  main schema 1 tablename  {} 0 {} 0 \
32e7ff403aSdanielk1977  main schema 2 cid        {} 0 {} 0 \
33e7ff403aSdanielk1977  main schema 3 name       {} 0 {} 0 \
34e7ff403aSdanielk1977  main schema 4 type       {} 0 {} 0 \
35e7ff403aSdanielk1977  main schema 5 not_null   {} 0 {} 0 \
36e7ff403aSdanielk1977  main schema 6 dflt_value {} 0 {} 0 \
37e7ff403aSdanielk1977  main schema 7 pk         {} 0 {} 0 \
38e7ff403aSdanielk1977]
394b2688abSdanielk1977
400817d0dfSdanielk1977# See ticket #2230.
410817d0dfSdanielk1977#
420817d0dfSdanielk1977do_test vtab2-1.2 {
430817d0dfSdanielk1977  execsql {
440817d0dfSdanielk1977    SELECT length(tablename) FROM schema GROUP by tablename;
450817d0dfSdanielk1977  }
460817d0dfSdanielk1977} {6}
470817d0dfSdanielk1977do_test vtab2-1.3 {
480817d0dfSdanielk1977  execsql {
490817d0dfSdanielk1977    SELECT tablename FROM schema GROUP by length(tablename);
500817d0dfSdanielk1977  }
510817d0dfSdanielk1977} {schema}
520817d0dfSdanielk1977do_test vtab2-1.4 {
530817d0dfSdanielk1977  execsql {
540817d0dfSdanielk1977    SELECT length(tablename) FROM schema GROUP by length(tablename);
550817d0dfSdanielk1977  }
560817d0dfSdanielk1977} {6}
570817d0dfSdanielk1977
58169f8a0cSdanielk1977register_tclvar_module [sqlite3_connection_pointer db]
59169f8a0cSdanielk1977do_test vtab2-2.1 {
60169f8a0cSdanielk1977  set ::abc 123
61169f8a0cSdanielk1977  execsql {
62169f8a0cSdanielk1977    CREATE VIRTUAL TABLE vars USING tclvar;
63*4dd176eaSdrh    SELECT name, arrayname, value FROM vars WHERE name='abc';
64169f8a0cSdanielk1977  }
65169f8a0cSdanielk1977} [list abc "" 123]
66169f8a0cSdanielk1977do_test vtab2-2.2 {
67169f8a0cSdanielk1977  set A(1) 1
68169f8a0cSdanielk1977  set A(2) 4
69169f8a0cSdanielk1977  set A(3) 9
70169f8a0cSdanielk1977  execsql {
71*4dd176eaSdrh    SELECT name, arrayname, value FROM vars WHERE name='A';
72169f8a0cSdanielk1977  }
73169f8a0cSdanielk1977} [list A 1 1 A 2 4 A 3 9]
7429a0138cSdrhunset -nocomplain result
7529a0138cSdrhunset -nocomplain var
7609df9e28Sdrhset result {}
7709df9e28Sdrhforeach var [lsort [info vars tcl_*]] {
7809df9e28Sdrh  catch {lappend result $var [set $var]}
7909df9e28Sdrh}
80169f8a0cSdanielk1977do_test vtab2-2.3 {
81169f8a0cSdanielk1977  execsql {
82169f8a0cSdanielk1977    SELECT name, value FROM vars
83169f8a0cSdanielk1977      WHERE name MATCH 'tcl_*' AND arrayname = ''
84169f8a0cSdanielk1977      ORDER BY name;
85169f8a0cSdanielk1977  }
8609df9e28Sdrh} $result
8729a0138cSdrhunset result
8829a0138cSdrhunset var
89169f8a0cSdanielk1977
902945b4a1Sdrh# Ticket #2894.
912945b4a1Sdrh#
922945b4a1Sdrh# Make sure we do call Column(), and Rowid() methods of
932945b4a1Sdrh# a virtual table when that table is in a LEFT JOIN.
942945b4a1Sdrh#
952945b4a1Sdrhdo_test vtab2-3.1 {
962945b4a1Sdrh  execsql {
972945b4a1Sdrh    SELECT * FROM schema WHERE dflt_value IS NULL LIMIT 1
982945b4a1Sdrh  }
992945b4a1Sdrh} {main schema 0 database {} 0 {} 0}
1002945b4a1Sdrhdo_test vtab2-3.2 {
1012945b4a1Sdrh  execsql {
1022945b4a1Sdrh    SELECT *, b.rowid
1032945b4a1Sdrh      FROM schema a LEFT JOIN schema b ON a.dflt_value=b.dflt_value
1042945b4a1Sdrh     WHERE a.rowid=1
1052945b4a1Sdrh  }
1062945b4a1Sdrh} {main schema 0 database {} 0 {} 0 {} {} {} {} {} {} {} {} {}}
1075d8806e0Sdrhdo_test vtab2-3.3 {
1085d8806e0Sdrh  execsql {
1095d8806e0Sdrh    SELECT *, b.rowid
1105d8806e0Sdrh      FROM schema a LEFT JOIN schema b ON a.dflt_value IS b.dflt_value
1115d8806e0Sdrh                                      AND a.dflt_value IS NOT NULL
1125d8806e0Sdrh     WHERE a.rowid=1
1135d8806e0Sdrh  }
1145d8806e0Sdrh} {main schema 0 database {} 0 {} 0 {} {} {} {} {} {} {} {} {}}
1152945b4a1Sdrh
116d0ffa1e8Sdanielk1977do_test vtab2-4.1 {
117d0ffa1e8Sdanielk1977  execsql {
118d0ffa1e8Sdanielk1977    BEGIN TRANSACTION;
119d0ffa1e8Sdanielk1977    CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, UNIQUE(b, c));
120d0ffa1e8Sdanielk1977    CREATE TABLE fkey(
121d0ffa1e8Sdanielk1977      to_tbl,
122d0ffa1e8Sdanielk1977      to_col
123d0ffa1e8Sdanielk1977    );
124d0ffa1e8Sdanielk1977    INSERT INTO "fkey" VALUES('t1',NULL);
125d0ffa1e8Sdanielk1977    COMMIT;
126d0ffa1e8Sdanielk1977  }
127d0ffa1e8Sdanielk1977} {}
128d0ffa1e8Sdanielk1977do_test vtab2-4.2 {
129d0ffa1e8Sdanielk1977  execsql { CREATE VIRTUAL TABLE v_col USING schema }
130d0ffa1e8Sdanielk1977} {}
131d0ffa1e8Sdanielk1977do_test vtab2-4.3 {
132d0ffa1e8Sdanielk1977  execsql { SELECT name FROM v_col WHERE tablename = 't1' AND pk }
133d0ffa1e8Sdanielk1977} {a}
134d0ffa1e8Sdanielk1977do_test vtab2-4.4 {
135d0ffa1e8Sdanielk1977  execsql {
136d0ffa1e8Sdanielk1977    UPDATE fkey
137d0ffa1e8Sdanielk1977    SET to_col = (SELECT name FROM v_col WHERE tablename = 't1' AND pk);
138d0ffa1e8Sdanielk1977  }
139d0ffa1e8Sdanielk1977} {}
140d0ffa1e8Sdanielk1977do_test vtab2-4.5 {
141d0ffa1e8Sdanielk1977  execsql { SELECT * FROM fkey }
142d0ffa1e8Sdanielk1977} {t1 a}
143d0ffa1e8Sdanielk1977
1447377945aSdan#-------------------------------------------------------------------------
1457377945aSdan#
146e56f53efSdanifcapable fts3 {
1477377945aSdan  reset_db
1487377945aSdan  do_execsql_test 5.1 {
1497377945aSdan    PRAGMA encoding='UTF16';
1507377945aSdan  }
1517377945aSdan
1527377945aSdan  do_test 5.2 {
1537377945aSdan    sqlite3_exec_hex db { CREATE VIRTUAL TABLE %C8 USING fts3 }
1547377945aSdan  } {0 {}}
1557377945aSdan
1567377945aSdan  do_test 5.3 {
1577377945aSdan    sqlite3_exec_hex db { CREATE VIRTUAL TABLE %C9 USING s }
1587377945aSdan  } {/1 {malformed database schema.* already exists}/}
159e56f53efSdan}
1607377945aSdan
1617377945aSdan
1627377945aSdan
163e7ff403aSdanielk1977finish_test
164