From 1e31e0b25b5f21401f6953e6e96c4d91e370f9cf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Aug 2006 19:08:27 +0000 Subject: [PATCH] Make sure sufficient memory is allocated to hold the collating sequence pointers for all columns of an ORDER BY clause even if the ORDER BY clause contains more columns than where originally in the table. Ticket #1911. (CVS 3344) FossilOrigin-Name: 924ea730f4dd384d7ef3deca357befd064dac70a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 11 ++++++----- test/misc5.test | 21 ++++++++++++++++++++- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index dabb45dab8..e415f112c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sreference\sto\san\sundefined\svariable\sintroduced\sby\sthe\sprevious\ncheckin.\s(CVS\s3343) -D 2006-08-08T15:42:59 +C Make\ssure\ssufficient\smemory\sis\sallocated\sto\shold\sthe\scollating\ssequence\npointers\sfor\sall\scolumns\sof\san\sORDER\sBY\sclause\seven\sif\sthe\sORDER\sBY\nclause\scontains\smore\scolumns\sthan\swhere\soriginally\sin\sthe\stable.\nTicket\s#1911.\s(CVS\s3344) +D 2006-08-11T19:08:27 F Makefile.in 9c2a76055c305868cc5f5b73e29a252ff3632c0a F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -69,7 +69,7 @@ F src/pragma.c cc12939bb74a6e28eb2e867e75175eecffe089a1 F src/prepare.c 06fdfea0920f2fe67df29ce6b2eebc83a9e6aedf F src/printf.c b179b6ed12f793e028dd169e2e2e2b2a37eedc63 F src/random.c d40f8d356cecbd351ccfab6eaedd7ec1b54f5261 -F src/select.c aeec8efbe83bc1e50e9b49ada19b34eda5de05bd +F src/select.c 0d4724930a1f34c747105ed1802fa4af0d8eb519 F src/server.c 087b92a39d883e3fa113cae259d64e4c7438bc96 F src/shell.c 9e95f12ef57c3dc9fa0774c27f8743e2d39a9f1f F src/sqlite.h.in 432848ac7f8d7e6fea727668acccec62bdd86cc4 @@ -216,7 +216,7 @@ F test/misc1.test 27a6ad11ba6e4b73aeee650ab68053ad7dfd0433 F test/misc2.test 09388e5a2c5c1017ad3ff1c4bf469375def2a0c2 F test/misc3.test 7bd937e2c62bcc6be71939faf068d506467b1e03 F test/misc4.test b043a05dea037cca5989f3ae09552fa16119bc80 -F test/misc5.test a20303ea455f5e209ea3ba9f7fc8d48dace43d67 +F test/misc5.test 4035863b8dd5e6b501c80ff23cc99aa98b49894c F test/misuse.test 30b3a458e5a70c31e74c291937b6c82204c59f33 F test/notnull.test 44d600f916b770def8b095a9962dbe3be5a70d82 F test/null.test 9503e1f63e959544c006d9f01709c5b5eab67d54 @@ -377,7 +377,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 76e4d4187779097954038e444111f837737e789c -R b7c13d6e7706855171446520e8d69fa0 +P 73ff3452a0e38f046b7b41bcf653cf5e6848471f +R 7f0367aaaf9bc4489d050fda3a47981a U drh -Z 94f1a89da8a7fc7f73f13919d2161127 +Z 087aba4f2b01e3013f35d0a9a6b8b5b7 diff --git a/manifest.uuid b/manifest.uuid index 5c5385bb56..9490445280 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73ff3452a0e38f046b7b41bcf653cf5e6848471f \ No newline at end of file +924ea730f4dd384d7ef3deca357befd064dac70a \ No newline at end of file diff --git a/src/select.c b/src/select.c index b6bb1f9083..25fe010b22 100644 --- a/src/select.c +++ b/src/select.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.319 2006/07/11 13:15:08 drh Exp $ +** $Id: select.c,v 1.320 2006/08/11 19:08:27 drh Exp $ */ #include "sqliteInt.h" @@ -1905,11 +1905,13 @@ static int multiSelect( int i; /* Loop counter */ KeyInfo *pKeyInfo; /* Collating sequence for the result set */ Select *pLoop; /* For looping through SELECT statements */ + int nKeyCol; /* Number of entries in pKeyInfo->aCol[] */ CollSeq **apColl; CollSeq **aCopy; assert( p->pRightmost==p ); - pKeyInfo = sqliteMalloc(sizeof(*pKeyInfo)+nCol*2*sizeof(CollSeq*) + nCol); + nKeyCol = nCol + (pOrderBy ? pOrderBy->nExpr : 0); + pKeyInfo = sqliteMalloc(sizeof(*pKeyInfo)+nKeyCol*(sizeof(CollSeq*) + 1)); if( !pKeyInfo ){ rc = SQLITE_NOMEM; goto multi_select_end; @@ -1945,7 +1947,7 @@ static int multiSelect( int addr; u8 *pSortOrder; - aCopy = &pKeyInfo->aColl[nCol]; + aCopy = &pKeyInfo->aColl[nOrderByExpr]; pSortOrder = pKeyInfo->aSortOrder = (u8*)&aCopy[nCol]; memcpy(aCopy, pKeyInfo->aColl, nCol*sizeof(CollSeq*)); apColl = pKeyInfo->aColl; @@ -2930,8 +2932,7 @@ int sqlite3Select( pKeyInfo = keyInfoFromExprList(pParse, pOrderBy); pOrderBy->iECursor = pParse->nTab++; p->addrOpenEphm[2] = addrSortIndex = - sqlite3VdbeOp3(v, OP_OpenEphemeral, pOrderBy->iECursor, pOrderBy->nExpr+2, - (char*)pKeyInfo, P3_KEYINFO_HANDOFF); + sqlite3VdbeOp3(v, OP_OpenEphemeral, pOrderBy->iECursor, pOrderBy->nExpr+2, (char*)pKeyInfo, P3_KEYINFO_HANDOFF); }else{ addrSortIndex = -1; } diff --git a/test/misc5.test b/test/misc5.test index f966dacb5a..e656e2ca9a 100644 --- a/test/misc5.test +++ b/test/misc5.test @@ -13,7 +13,7 @@ # This file implements tests for miscellanous features that were # left out of other test files. # -# $Id: misc5.test,v 1.13 2006/07/06 10:59:58 drh Exp $ +# $Id: misc5.test,v 1.14 2006/08/11 19:08:28 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -580,4 +580,23 @@ do_test misc5-8.1 { } SQLITE_MISUSE sqlite3 db test.db +# Ticket #1911 +# +do_test misc5-9.1 { + execsql { + SELECT name, type FROM sqlite_master WHERE name IS NULL + UNION + SELECT type, name FROM sqlite_master WHERE type IS NULL + ORDER BY 1, 2, 1, 2, 1, 2 + } +} {} +do_test misc5-9.2 { + execsql { + SELECT name, type FROM sqlite_master WHERE name IS NULL + UNION + SELECT type, name FROM sqlite_master WHERE type IS NULL + ORDER BY 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 + } +} {} + finish_test -- 2.47.2