mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Merge recent trunk changes, and especially the fix for the CREATE UNIQUE INDEX
problem of ticket [9a6daf340df99ba9]. FossilOrigin-Name: 5b50a8380b2b678c1646ff303e3696efc1d7d92c
This commit is contained in:
23
manifest
23
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Disable\san\sassert\sthat\sis\ssometimes\sgenerated\sspuriously.
|
C Merge\srecent\strunk\schanges,\sand\sespecially\sthe\sfix\sfor\sthe\sCREATE\sUNIQUE\sINDEX\nproblem\sof\sticket\s[9a6daf340df99ba9].
|
||||||
D 2014-07-29T21:44:13.328
|
D 2014-07-30T14:44:24.940
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
|
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -170,7 +170,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
|
|||||||
F src/btree.c dff8e7789730e835b66d81f9eb68de2352845012
|
F src/btree.c dff8e7789730e835b66d81f9eb68de2352845012
|
||||||
F src/btree.h 4245a349bfe09611d7ff887dbc3a80cee8b7955a
|
F src/btree.h 4245a349bfe09611d7ff887dbc3a80cee8b7955a
|
||||||
F src/btreeInt.h cf180d86b2e9e418f638d65baa425c4c69c0e0e3
|
F src/btreeInt.h cf180d86b2e9e418f638d65baa425c4c69c0e0e3
|
||||||
F src/build.c af833cdcba64a465eeba5f2d0c9fc012a9f6c31d
|
F src/build.c f6e49e1b32fe1aed6971da5712131d9272d7d81c
|
||||||
F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
|
F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98
|
||||||
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
|
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
|
||||||
F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a
|
F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a
|
||||||
@@ -189,7 +189,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
|
|||||||
F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
|
F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
|
||||||
F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
|
F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
|
||||||
F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
|
F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
|
||||||
F src/main.c e2fded3600437acd3faae4182648e846ccdc3c7c
|
F src/main.c 42ba5977d1c4324620b2ef2bc05b7bb28a2331e4
|
||||||
F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
|
F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
|
||||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||||
F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
|
F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
|
||||||
@@ -208,7 +208,7 @@ F src/os.h 60d419395e32a8029fa380a80a3da2e9030f635e
|
|||||||
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
|
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
|
||||||
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
||||||
F src/os_unix.c a7baf1b30f3c58ba20b813e01aab23b18ae44f85
|
F src/os_unix.c a7baf1b30f3c58ba20b813e01aab23b18ae44f85
|
||||||
F src/os_win.c 5f8c5568cc749d6ab44006124e7701f463559223
|
F src/os_win.c c4d89c7e38a2ac1c6c90bf084131a44ed682790b
|
||||||
F src/os_win.h 057344a6720b4c8405d9bd98f58cb37a6ee46c25
|
F src/os_win.h 057344a6720b4c8405d9bd98f58cb37a6ee46c25
|
||||||
F src/pager.c f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8
|
F src/pager.c f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8
|
||||||
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
||||||
@@ -284,14 +284,14 @@ F src/update.c 01564b3c430f6c7b0a35afaf7aba7987206fa3a5
|
|||||||
F src/utf.c a0314e637768a030e6e84a957d0c4f6ba910cc05
|
F src/utf.c a0314e637768a030e6e84a957d0c4f6ba910cc05
|
||||||
F src/util.c 3076bdd51cdbf60a6e2e57fada745be37133c73e
|
F src/util.c 3076bdd51cdbf60a6e2e57fada745be37133c73e
|
||||||
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
|
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
|
||||||
F src/vdbe.c c28f377d29cfa4db713581fc3a134642e38d9fcf
|
F src/vdbe.c e27749e6a5f65b3ff3388eab1472c0eaf6823b43
|
||||||
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
|
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
|
||||||
F src/vdbeInt.h 8870adf012235708f125f8cd1c988f487dc3eb6f
|
F src/vdbeInt.h 8870adf012235708f125f8cd1c988f487dc3eb6f
|
||||||
F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
|
F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
|
||||||
F src/vdbeaux.c 3f1d2baa4a8cbdad33cb255a5f4fd1af7a414683
|
F src/vdbeaux.c 3f1d2baa4a8cbdad33cb255a5f4fd1af7a414683
|
||||||
F src/vdbeblob.c 9205ce9d3b064d9600f8418a897fc88b5687d9ac
|
F src/vdbeblob.c 9205ce9d3b064d9600f8418a897fc88b5687d9ac
|
||||||
F src/vdbemem.c d90a1e8acf8b63dc9d14cbbea12bfec6cec31394
|
F src/vdbemem.c d90a1e8acf8b63dc9d14cbbea12bfec6cec31394
|
||||||
F src/vdbesort.c 2198e33de4c2c32bdb3fb4f06dbe2ae90a0fce33
|
F src/vdbesort.c cab84b480d5c616e830d9b20c8903e42de3b60b3
|
||||||
F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
|
F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
|
||||||
F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
|
F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
|
||||||
F src/wal.c 264df50a1b33124130b23180ded2e2c5663c652a
|
F src/wal.c 264df50a1b33124130b23180ded2e2c5663c652a
|
||||||
@@ -1046,6 +1046,7 @@ F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff
|
|||||||
F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84
|
F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84
|
||||||
F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a
|
F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a
|
||||||
F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264
|
F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264
|
||||||
|
F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339
|
||||||
F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825
|
F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825
|
||||||
F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8
|
F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8
|
||||||
F test/update.test 1b6c488a8f993d090b7ee9ad0e234faa161b3aeb
|
F test/update.test 1b6c488a8f993d090b7ee9ad0e234faa161b3aeb
|
||||||
@@ -1189,7 +1190,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 3144a16f91364b455e54e6030714e1c12ab0bdb7
|
P bd9ee0ea69181526cfc3cadac33a5ec5190112b0 6b785e92f279cb65746834d5cd25594fd3333342
|
||||||
R 9e96844dee61c8b0e69a9d02798bc497
|
R 5abc11219614f612d7ef9f82b784bc0c
|
||||||
U mistachkin
|
U drh
|
||||||
Z d96e323c9f24218fc7129fc10b94c004
|
Z f20a2d1678a8f4c3f64fec3d49fad416
|
||||||
|
@@ -1 +1 @@
|
|||||||
bd9ee0ea69181526cfc3cadac33a5ec5190112b0
|
5b50a8380b2b678c1646ff303e3696efc1d7d92c
|
@@ -2712,7 +2712,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
|
|||||||
sqlite3VdbeAddOp2(v, OP_Goto, 0, j2);
|
sqlite3VdbeAddOp2(v, OP_Goto, 0, j2);
|
||||||
addr2 = sqlite3VdbeCurrentAddr(v);
|
addr2 = sqlite3VdbeCurrentAddr(v);
|
||||||
sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord,
|
sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord,
|
||||||
pKey->nField - pIndex->nKeyCol); VdbeCoverage(v);
|
pIndex->nKeyCol); VdbeCoverage(v);
|
||||||
sqlite3UniqueConstraint(pParse, OE_Abort, pIndex);
|
sqlite3UniqueConstraint(pParse, OE_Abort, pIndex);
|
||||||
}else{
|
}else{
|
||||||
addr2 = sqlite3VdbeCurrentAddr(v);
|
addr2 = sqlite3VdbeCurrentAddr(v);
|
||||||
|
@@ -1065,7 +1065,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){
|
|||||||
** Return a static string containing the name corresponding to the error code
|
** Return a static string containing the name corresponding to the error code
|
||||||
** specified in the argument.
|
** specified in the argument.
|
||||||
*/
|
*/
|
||||||
#if defined(SQLITE_TEST)
|
#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST)
|
||||||
const char *sqlite3ErrName(int rc){
|
const char *sqlite3ErrName(int rc){
|
||||||
const char *zName = 0;
|
const char *zName = 0;
|
||||||
int i, origRc = rc;
|
int i, origRc = rc;
|
||||||
|
16
src/os_win.c
16
src/os_win.c
@@ -1301,7 +1301,14 @@ DWORD sqlite3Win32Wait(HANDLE hObject){
|
|||||||
#elif !defined(SQLITE_WIN32_HAS_WIDE)
|
#elif !defined(SQLITE_WIN32_HAS_WIDE)
|
||||||
# define osIsNT() (0)
|
# define osIsNT() (0)
|
||||||
#else
|
#else
|
||||||
static int osIsNT(void){
|
# define osIsNT() (sqlite3_win32_is_nt())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This function determines if the machine is running a version of Windows
|
||||||
|
** based on the NT kernel.
|
||||||
|
*/
|
||||||
|
int sqlite3_win32_is_nt(void){
|
||||||
if( sqlite3_os_type==0 ){
|
if( sqlite3_os_type==0 ){
|
||||||
#if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WIN8
|
#if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WIN8
|
||||||
OSVERSIONINFOW sInfo;
|
OSVERSIONINFOW sInfo;
|
||||||
@@ -1312,11 +1319,10 @@ DWORD sqlite3Win32Wait(HANDLE hObject){
|
|||||||
sInfo.dwOSVersionInfoSize = sizeof(sInfo);
|
sInfo.dwOSVersionInfoSize = sizeof(sInfo);
|
||||||
osGetVersionExA(&sInfo);
|
osGetVersionExA(&sInfo);
|
||||||
#endif
|
#endif
|
||||||
sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1;
|
sqlite3_os_type = (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1;
|
||||||
}
|
}
|
||||||
return sqlite3_os_type==2;
|
return (sqlite3_os_type == 2);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SQLITE_WIN32_MALLOC
|
#ifdef SQLITE_WIN32_MALLOC
|
||||||
/*
|
/*
|
||||||
|
12
src/vdbe.c
12
src/vdbe.c
@@ -4293,12 +4293,12 @@ case OP_ResetCount: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Opcode: SorterCompare P1 P2 P3 P4
|
/* Opcode: SorterCompare P1 P2 P3 P4
|
||||||
** Synopsis: if key(P1)!=rtrim(r[P3],P4) goto P2
|
** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2
|
||||||
**
|
**
|
||||||
** P1 is a sorter cursor. This instruction compares a prefix of the
|
** P1 is a sorter cursor. This instruction compares a prefix of the
|
||||||
** the record blob in register P3 against a prefix of the entry that
|
** the record blob in register P3 against a prefix of the entry that
|
||||||
** the sorter cursor currently points to. The final P4 fields of both
|
** the sorter cursor currently points to. Only the first P4 fields
|
||||||
** the P3 and sorter record are ignored.
|
** of r[P3] and the sorter record are compared.
|
||||||
**
|
**
|
||||||
** If either P3 or the sorter contains a NULL in one of their significant
|
** If either P3 or the sorter contains a NULL in one of their significant
|
||||||
** fields (not counting the P4 fields at the end which are ignored) then
|
** fields (not counting the P4 fields at the end which are ignored) then
|
||||||
@@ -4310,15 +4310,15 @@ case OP_ResetCount: {
|
|||||||
case OP_SorterCompare: {
|
case OP_SorterCompare: {
|
||||||
VdbeCursor *pC;
|
VdbeCursor *pC;
|
||||||
int res;
|
int res;
|
||||||
int nIgnore;
|
int nKeyCol;
|
||||||
|
|
||||||
pC = p->apCsr[pOp->p1];
|
pC = p->apCsr[pOp->p1];
|
||||||
assert( isSorter(pC) );
|
assert( isSorter(pC) );
|
||||||
assert( pOp->p4type==P4_INT32 );
|
assert( pOp->p4type==P4_INT32 );
|
||||||
pIn3 = &aMem[pOp->p3];
|
pIn3 = &aMem[pOp->p3];
|
||||||
nIgnore = pOp->p4.i;
|
nKeyCol = pOp->p4.i;
|
||||||
res = 0;
|
res = 0;
|
||||||
rc = sqlite3VdbeSorterCompare(pC, pIn3, nIgnore, &res);
|
rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res);
|
||||||
VdbeBranchTaken(res!=0,2);
|
VdbeBranchTaken(res!=0,2);
|
||||||
if( res ){
|
if( res ){
|
||||||
pc = pOp->p2-1;
|
pc = pOp->p2-1;
|
||||||
|
@@ -2455,7 +2455,7 @@ int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){
|
|||||||
int sqlite3VdbeSorterCompare(
|
int sqlite3VdbeSorterCompare(
|
||||||
const VdbeCursor *pCsr, /* Sorter cursor */
|
const VdbeCursor *pCsr, /* Sorter cursor */
|
||||||
Mem *pVal, /* Value to compare to current sorter key */
|
Mem *pVal, /* Value to compare to current sorter key */
|
||||||
int nIgnore, /* Ignore this many fields at the end */
|
int nKeyCol, /* Compare this many columns */
|
||||||
int *pRes /* OUT: Result of comparison */
|
int *pRes /* OUT: Result of comparison */
|
||||||
){
|
){
|
||||||
VdbeSorter *pSorter = pCsr->pSorter;
|
VdbeSorter *pSorter = pCsr->pSorter;
|
||||||
@@ -2469,13 +2469,13 @@ int sqlite3VdbeSorterCompare(
|
|||||||
r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo,0,0,&p);
|
r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo,0,0,&p);
|
||||||
assert( pSorter->pUnpacked==(UnpackedRecord*)p );
|
assert( pSorter->pUnpacked==(UnpackedRecord*)p );
|
||||||
if( r2==0 ) return SQLITE_NOMEM;
|
if( r2==0 ) return SQLITE_NOMEM;
|
||||||
r2->nField = pKeyInfo->nField-nIgnore;
|
r2->nField = nKeyCol;
|
||||||
}
|
}
|
||||||
assert( r2->nField>=pKeyInfo->nField-nIgnore );
|
assert( r2->nField==nKeyCol );
|
||||||
|
|
||||||
pKey = vdbeSorterRowkey(pSorter, &nKey);
|
pKey = vdbeSorterRowkey(pSorter, &nKey);
|
||||||
sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2);
|
sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, r2);
|
||||||
for(i=0; i<r2->nField; i++){
|
for(i=0; i<nKeyCol; i++){
|
||||||
if( r2->aMem[i].flags & MEM_Null ){
|
if( r2->aMem[i].flags & MEM_Null ){
|
||||||
*pRes = -1;
|
*pRes = -1;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
|
78
test/unique2.test
Normal file
78
test/unique2.test
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# 2014-07-30
|
||||||
|
#
|
||||||
|
# The author disclaims copyright to this source code. In place of
|
||||||
|
# a legal notice, here is a blessing:
|
||||||
|
#
|
||||||
|
# May you do good and not evil.
|
||||||
|
# May you find forgiveness for yourself and forgive others.
|
||||||
|
# May you share freely, never taking more than you give.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
# This file implements regression tests for SQLite library. The
|
||||||
|
# focus of this file is testing the CREATE UNIQUE INDEX statement
|
||||||
|
# to verify that ticket 9a6daf340df99ba93c53bcf8fa83d9f28040d2a8
|
||||||
|
# has been fixed:
|
||||||
|
#
|
||||||
|
# drh added on 2014-07-30 12:33:04:
|
||||||
|
#
|
||||||
|
# The CREATE UNIQUE INDEX on the third line below does not fail even
|
||||||
|
# though the x column values are not all unique.
|
||||||
|
#
|
||||||
|
# CREATE TABLE t1(x NOT NULL);
|
||||||
|
# INSERT INTO t1 VALUES(1),(2),(2),(3);
|
||||||
|
# CREATE UNIQUE INDEX t1x ON t1(x);
|
||||||
|
#
|
||||||
|
# If the index is created before the INSERT, then uniqueness is enforced
|
||||||
|
# at the point of the INSERT. Note that the NOT NULL on the indexed column
|
||||||
|
# seems to be required in order to exhibit this bug.
|
||||||
|
#
|
||||||
|
# "PRAGMA integrity_check" does not detect the resulting malformed database.
|
||||||
|
# That might be considered a separate issue.
|
||||||
|
#
|
||||||
|
# Bisecting shows that this problem was introduced by the addition of
|
||||||
|
# WITHOUT ROWID support in version 3.8.2, specifically in check-in
|
||||||
|
# [c80e229dd9c1230] on 2013-11-07. This problem was reported on the mailing
|
||||||
|
# list by Pavel Pimenov. and primary keys, and the UNIQUE constraint
|
||||||
|
# on table columns
|
||||||
|
#
|
||||||
|
|
||||||
|
set testdir [file dirname $argv0]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
|
||||||
|
foreach {id sql} {
|
||||||
|
1 {CREATE TABLE t1(x TEXT PRIMARY KEY, y NOT NULL) WITHOUT ROWID}
|
||||||
|
2 {CREATE TABLE t1(x TEXT PRIMARY KEY, y NOT NULL)}
|
||||||
|
3 {CREATE TABLE t1(x TEXT PRIMARY KEY, y) WITHOUT ROWID}
|
||||||
|
4 {CREATE TABLE t1(x TEXT PRIMARY KEY, y)}
|
||||||
|
} {
|
||||||
|
do_test $id.1 {
|
||||||
|
db eval {DROP TABLE IF EXISTS t1}
|
||||||
|
db eval $sql
|
||||||
|
db eval {INSERT INTO t1(x,y) VALUES(1,1),(2,2),(3,2),(4,3)}
|
||||||
|
} {}
|
||||||
|
do_test $id.2 {
|
||||||
|
catchsql {CREATE UNIQUE INDEX t1y ON t1(y)}
|
||||||
|
} {1 {UNIQUE constraint failed: t1.y}}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach {id sql} {
|
||||||
|
5 {CREATE TABLE t1(w,x,y NOT NULL,z NOT NULL,PRIMARY KEY(w,x)) WITHOUT ROWID}
|
||||||
|
6 {CREATE TABLE t1(w,x,y NOT NULL,z NOT NULL,PRIMARY KEY(w,x))}
|
||||||
|
7 {CREATE TABLE t1(w,x,y NOT NULL,z,PRIMARY KEY(w,x)) WITHOUT ROWID}
|
||||||
|
8 {CREATE TABLE t1(w,x,y NOT NULL,z,PRIMARY KEY(w,x))}
|
||||||
|
9 {CREATE TABLE t1(w,x,y,z NOT NULL,PRIMARY KEY(w,x)) WITHOUT ROWID}
|
||||||
|
10 {CREATE TABLE t1(w,x,y,z NOT NULL,PRIMARY KEY(w,x))}
|
||||||
|
11 {CREATE TABLE t1(w,x,y,z,PRIMARY KEY(w,x)) WITHOUT ROWID}
|
||||||
|
12 {CREATE TABLE t1(w,x,y,z,PRIMARY KEY(w,x))}
|
||||||
|
} {
|
||||||
|
do_test $id.1 {
|
||||||
|
db eval {DROP TABLE IF EXISTS t1}
|
||||||
|
db eval $sql
|
||||||
|
db eval {INSERT INTO t1(w,x,y,z) VALUES(1,2,3,4),(2,3,3,4)}
|
||||||
|
} {}
|
||||||
|
do_test $id.2 {
|
||||||
|
catchsql {CREATE UNIQUE INDEX t1yz ON t1(y,z)}
|
||||||
|
} {1 {UNIQUE constraint failed: t1.y, t1.z}}
|
||||||
|
}
|
||||||
|
|
||||||
|
finish_test
|
Reference in New Issue
Block a user