Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a crash in unionvtab caused by a misconfiguration. Add other test cases for the same. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
255d6b99de2bb210c09ebee9f9481ba3 |
User & Date: | dan 2017-07-18 21:19:17.472 |
Context
2017-07-19
| ||
11:52 | Add further tests to unionvtab.test. (check-in: c93284cd65 user: dan tags: trunk) | |
11:20 | Add VFS interfaces needed to make use of batch atomic write capabilities in the underlying filesystem. (check-in: 929bc46b8b user: drh tags: batch-atomic-write) | |
2017-07-18
| ||
21:19 | Fix a crash in unionvtab caused by a misconfiguration. Add other test cases for the same. (check-in: 255d6b99de user: dan tags: trunk) | |
20:59 | Fix shell.c.in so that it aligns with shell.c. (check-in: 505fdc8ff5 user: drh tags: trunk) | |
Changes
Changes to ext/misc/unionvtab.c.
︙ | ︙ | |||
473 474 475 476 477 478 479 | unionFinalize(&rc, pStmt); pStmt = 0; /* Verify that all source tables exist and have compatible schemas. */ if( rc==SQLITE_OK ){ pTab->db = db; rc = unionSourceCheck(pTab, pzErr); | | > | > | 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 | unionFinalize(&rc, pStmt); pStmt = 0; /* Verify that all source tables exist and have compatible schemas. */ if( rc==SQLITE_OK ){ pTab->db = db; rc = unionSourceCheck(pTab, pzErr); } /* Compose a CREATE TABLE statement and pass it to declare_vtab() */ if( rc==SQLITE_OK ){ pStmt = unionPreparePrintf(&rc, pzErr, db, "SELECT " "'CREATE TABLE xyz('" " || group_concat(quote(name) || ' ' || type, ', ')" " || ')'," "max((cid+1) * (type='INTEGER' COLLATE nocase AND pk=1))-1 " "FROM pragma_table_info(%Q, ?)", pTab->aSrc[0].zTab, pTab->aSrc[0].zDb |
︙ | ︙ |
Changes to test/unionvtab.test.
︙ | ︙ | |||
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | do_execsql_test 1.7 { SELECT * FROM uuu WHERE rowid BETWEEN -46 AND 1500; } { 1 one 2 two 3 three 10 ten 11 eleven 12 twelve 20 twenty 21 twenty-one 22 twenty-two } #------------------------------------------------------------------------- # Error conditions. # # 2.1.*: Attempt to create a unionvtab table outside of the TEMP schema. # 2.2.*: Tables that do not exist. # 2.3.*: Non rowid tables. # 2.4.*: Tables with mismatched schemas. # do_catchsql_test 2.1.1 { CREATE VIRTUAL TABLE u1 USING unionvtab("VALUES(NULL, 't1', 1, 100)"); } {1 {unionvtab tables must be created in TEMP schema}} do_catchsql_test 2.1.2 { CREATE VIRTUAL TABLE main.u1 USING unionvtab("VALUES('', 't1', 1, 100)"); } {1 {unionvtab tables must be created in TEMP schema}} | > > > > > > > > > > > > > > | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | do_execsql_test 1.7 { SELECT * FROM uuu WHERE rowid BETWEEN -46 AND 1500; } { 1 one 2 two 3 three 10 ten 11 eleven 12 twelve 20 twenty 21 twenty-one 22 twenty-two } do_execsql_test 1.8 { CREATE TABLE src(db, tbl, min, max); INSERT INTO src VALUES(NULL, 't1', 1, 9); INSERT INTO src VALUES('main', 't2', 10, 19); INSERT INTO src VALUES('aux', 't3', 20, 29); CREATE VIRTUAL TABLE temp.opp USING unionvtab(src); SELECT * FROM opp; } { 1 one 2 two 3 three 10 ten 11 eleven 12 twelve 20 twenty 21 twenty-one 22 twenty-two } #------------------------------------------------------------------------- # Error conditions. # # 2.1.*: Attempt to create a unionvtab table outside of the TEMP schema. # 2.2.*: Tables that do not exist. # 2.3.*: Non rowid tables. # 2.4.*: Tables with mismatched schemas. # 2.5.*: A unionvtab table with zero source tables. # do_catchsql_test 2.1.1 { CREATE VIRTUAL TABLE u1 USING unionvtab("VALUES(NULL, 't1', 1, 100)"); } {1 {unionvtab tables must be created in TEMP schema}} do_catchsql_test 2.1.2 { CREATE VIRTUAL TABLE main.u1 USING unionvtab("VALUES('', 't1', 1, 100)"); } {1 {unionvtab tables must be created in TEMP schema}} |
︙ | ︙ | |||
153 154 155 156 157 158 159 160 161 162 163 164 165 166 | set sql "CREATE VIRTUAL TABLE temp.a1 USING unionvtab(\"VALUES [join $L ,]\")" do_catchsql_test 2.4.$tn " DROP TABLE IF EXISTS temp.a1; CREATE VIRTUAL TABLE temp.a1 USING unionvtab(\"VALUES [join $L ,]\"); " $res } #------------------------------------------------------------------------- # reset_db load_static_extension db unionvtab do_execsql_test 3.0 { CREATE TABLE tbl1(a INTEGER PRIMARY KEY, b); CREATE TABLE tbl2(a INTEGER PRIMARY KEY, b); | > > > > > > > > > > > > > > > > > > > | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | set sql "CREATE VIRTUAL TABLE temp.a1 USING unionvtab(\"VALUES [join $L ,]\")" do_catchsql_test 2.4.$tn " DROP TABLE IF EXISTS temp.a1; CREATE VIRTUAL TABLE temp.a1 USING unionvtab(\"VALUES [join $L ,]\"); " $res } do_catchsql_test 2.5 { CREATE VIRTUAL TABLE temp.b1 USING unionvtab( [SELECT 'main', 'b1', 0, 100 WHERE 0] ) } {1 {no source tables configured}} foreach {tn sql} { 1 { VALUES('main', 't1', 10, 20), ('main', 't2', 30, 29) } 2 { VALUES('main', 't1', 10, 20), ('main', 't2', 15, 30) } } { do_catchsql_test 2.6.$tn " CREATE VIRTUAL TABLE temp.a1 USING unionvtab(`$sql`) " {1 {rowid range mismatch error}} } do_catchsql_test 2.7.1 { CREATE VIRTUAL TABLE temp.b1 USING unionvtab(1, 2, 3, 4) } {1 {wrong number of arguments for unionvtab}} #------------------------------------------------------------------------- # reset_db load_static_extension db unionvtab do_execsql_test 3.0 { CREATE TABLE tbl1(a INTEGER PRIMARY KEY, b); CREATE TABLE tbl2(a INTEGER PRIMARY KEY, b); |
︙ | ︙ |