Annotation of embedaddon/sqlite3/test/insert5.test, revision 1.1
1.1 ! misho 1: # 2007 November 23
! 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: # The tests in this file ensure that a temporary table is used
! 13: # when required by an "INSERT INTO ... SELECT ..." statement.
! 14: #
! 15: # $Id: insert5.test,v 1.5 2008/08/04 03:51:24 danielk1977 Exp $
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: ifcapable !subquery {
! 21: finish_test
! 22: return
! 23: }
! 24:
! 25: # Return true if the compilation of the sql passed as an argument
! 26: # includes the opcode OpenEphemeral. An "INSERT INTO ... SELECT"
! 27: # statement includes such an opcode if a temp-table is used
! 28: # to store intermediate results.
! 29: #
! 30: proc uses_temp_table {sql} {
! 31: return [expr {[lsearch [execsql "EXPLAIN $sql"] OpenEphemeral]>=0}]
! 32: }
! 33:
! 34: # Construct the sample database.
! 35: #
! 36: do_test insert5-1.0 {
! 37: forcedelete test2.db test2.db-journal
! 38: execsql {
! 39: CREATE TABLE MAIN(Id INTEGER, Id1 INTEGER);
! 40: CREATE TABLE B(Id INTEGER, Id1 INTEGER);
! 41: CREATE VIEW v1 AS SELECT * FROM B;
! 42: CREATE VIEW v2 AS SELECT * FROM MAIN;
! 43: INSERT INTO MAIN(Id,Id1) VALUES(2,3);
! 44: INSERT INTO B(Id,Id1) VALUES(2,3);
! 45: }
! 46: } {}
! 47:
! 48: # Run the query.
! 49: #
! 50: ifcapable compound {
! 51: do_test insert5-1.1 {
! 52: execsql {
! 53: INSERT INTO B
! 54: SELECT * FROM B UNION ALL
! 55: SELECT * FROM MAIN WHERE exists (select * FROM B WHERE B.Id = MAIN.Id);
! 56: SELECT * FROM B;
! 57: }
! 58: } {2 3 2 3 2 3}
! 59: } else {
! 60: do_test insert5-1.1 {
! 61: execsql {
! 62: INSERT INTO B SELECT * FROM B;
! 63: INSERT INTO B
! 64: SELECT * FROM MAIN WHERE exists (select * FROM B WHERE B.Id = MAIN.Id);
! 65: SELECT * FROM B;
! 66: }
! 67: } {2 3 2 3 2 3}
! 68: }
! 69: do_test insert5-2.1 {
! 70: uses_temp_table { INSERT INTO b SELECT * FROM main }
! 71: } {0}
! 72: do_test insert5-2.2 {
! 73: uses_temp_table { INSERT INTO b SELECT * FROM b }
! 74: } {1}
! 75: do_test insert5-2.3 {
! 76: uses_temp_table { INSERT INTO b SELECT (SELECT id FROM b), id1 FROM main }
! 77: } {1}
! 78: do_test insert5-2.4 {
! 79: uses_temp_table { INSERT INTO b SELECT id1, (SELECT id FROM b) FROM main }
! 80: } {1}
! 81: do_test insert5-2.5 {
! 82: uses_temp_table {
! 83: INSERT INTO b
! 84: SELECT * FROM main WHERE id = (SELECT id1 FROM b WHERE main.id = b.id) }
! 85: } {1}
! 86: do_test insert5-2.6 {
! 87: uses_temp_table { INSERT INTO b SELECT * FROM v1 }
! 88: } {1}
! 89: do_test insert5-2.7 {
! 90: uses_temp_table { INSERT INTO b SELECT * FROM v2 }
! 91: } {0}
! 92: do_test insert5-2.8 {
! 93: uses_temp_table {
! 94: INSERT INTO b
! 95: SELECT * FROM main WHERE id > 10 AND max(id1, (SELECT id FROM b)) > 10;
! 96: }
! 97: } {1}
! 98:
! 99: # UPDATE: Using a column from the outer query (main.id) in the GROUP BY
! 100: # or ORDER BY of a sub-query is no longer supported.
! 101: #
! 102: # do_test insert5-2.9 {
! 103: # uses_temp_table {
! 104: # INSERT INTO b
! 105: # SELECT * FROM main
! 106: # WHERE id > 10 AND (SELECT count(*) FROM v2 GROUP BY main.id)
! 107: # }
! 108: # } {}
! 109: do_test insert5-2.9 {
! 110: catchsql {
! 111: INSERT INTO b
! 112: SELECT * FROM main
! 113: WHERE id > 10 AND (SELECT count(*) FROM v2 GROUP BY main.id)
! 114: }
! 115: } {1 {no such column: main.id}}
! 116:
! 117: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>