Update contrib.
1 // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 // MSVC++ up to 5.0 has problems with expanding inline functions
17 // This disables the mad warnings for the whole project
18 #if defined(NDEBUG) && defined(__VC32__) && _MSC_VER<=1100
19 #pragma warning(disable : 4710) // function not expanded. MSVC 5.0 is stupid
31 #undef __UHEAP_MARKEND
32 #define __UHEAP_MARKEND
34 LOCAL_D TDBMS_CRCChecks TheCrcChecker;
36 #ifndef __linux__ //No CRC test on LINUX
38 const TPtrC KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_SQL.CRC");
40 const TPtrC KCrcRecord=_L("C:\\dbms-tst\\T_SQL.CRC");
44 // constructing literal TInt64 from compiler 64 bit integer rep
47 #if defined __GCC32__ || defined __EABI__
48 #define _LINT64(val) MAKE_TINT64(TUint(val##LL>>32),TUint(val##LL&0xffffffffu))
50 #define _LINT64(val) MAKE_TINT64(TUint(__int64(val)>>32),TUint(__int64(val)&0xffffffffu))
53 #define _LINT64 I64LIT
56 LOCAL_D RTest TheTest(_L("T_SQL: DBMS SQL parsing and execution tests"));
59 LOCAL_D CTrapCleanup* TheTrapCleanup;
61 LOCAL_D RDbNamedDatabase TheDatabase;
62 LOCAL_D RDbTable TheTable;
63 LOCAL_D RDbView TheView;
64 LOCAL_D TBuf<1024> TheSql;
66 const TInt KTestCleanupStack=0x20;
69 const TPtrC KTestDatabase=_L(".\\dbms-tst\\T_SQL.DB");
71 const TPtrC KTestDatabase=_L("C:\\dbms-tst\\T_SQL.DB");
74 #define elementsof(array) (sizeof(array)/sizeof(array[0]))
76 LOCAL_C void TestCleanup()
85 TRAPD(errCode, TheCrcChecker.GenerateCrcL(KTestDatabase));
90 TInt err = fsSession.Connect();
94 if(fsSession.Entry(KTestDatabase, entry) == KErrNone)
96 RDebug::Print(_L("Deleting \"%S\" file.\n"), &KTestDatabase);
97 err = fsSession.SetAtt(KTestDatabase, 0, KEntryAttReadOnly);
100 RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &KTestDatabase);
102 err = fsSession.Delete(KTestDatabase);
105 RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &KTestDatabase);
112 RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &KTestDatabase);
116 LOCAL_C void CloseDatabase()
119 TRAPD(errCode, TheCrcChecker.GenerateCrcL(KTestDatabase));
123 LOCAL_C void Disconnect()
126 TheDbs.ResourceCheck();
131 ///////////////////////////////////////////////////////////////////////////////////////
132 ///////////////////////////////////////////////////////////////////////////////////////
133 //Tests macros and functions.
134 //If (!aValue) then the test will be panicked, the test data files will be deleted.
135 static void Check(TInt aValue, TInt aLine)
140 TheTest(EFalse, aLine);
143 //If (aValue != aExpected) then the test will be panicked, the test data files will be deleted.
144 static void Check(TInt aValue, TInt aExpected, TInt aLine)
146 if(aValue != aExpected)
148 RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
150 TheTest(EFalse, aLine);
153 //Use these to test conditions.
154 #define TEST(arg) ::Check((arg), __LINE__)
155 #define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__)
157 ///////////////////////////////////////////////////////////////////////////////////////
158 ///////////////////////////////////////////////////////////////////////////////////////
160 // Create the database
161 LOCAL_C void CreateDatabase()
163 TInt r=TheDatabase.Replace(TheFs,KTestDatabase);
167 LOCAL_C void Connect()
170 TInt r=TheDbs.Connect();
172 TheDbs.ResourceMark();
176 // Open the database through the server
177 LOCAL_C void ShareDatabase()
179 TInt r=TheDatabase.Open(TheDbs,KTestDatabase);
185 const TText* iSearchCondition;
188 #define ROWS(n,m) (((~0u)<<(n))&((2u<<(m))-1))
189 #define ROW(n) ROWS(n,n)
191 #define ALL_ROWS (~1u) // all rows which are not NULL
193 class TestPredicateBase
196 static void Create(const TText* aType);
197 static void Test(const TSelectTest* aTest,TInt aCount,TInt aRows);
198 static void TestViewL(const TSelectTest* aTest,TInt aCount,TInt aRows);
201 // Create the table for the predicate tests
202 void TestPredicateBase::Create(const TText* aType)
204 TheTest.Next(TPtrC(aType));
206 TheSql.Format(_L("CREATE TABLE Compare (Id COUNTER,Test %s)"),aType);
207 TInt r=TheDatabase.Execute(TheSql);
209 r=TheTable.Open(TheDatabase,_L("Compare"),TheTable.EInsertOnly);
213 // Test the predicate on the table, then on the indexed table
214 void TestPredicateBase::Test(const TSelectTest* aTest,TInt aCount,TInt aRows)
217 TInt r=TheDatabase.Commit();
219 TRAPD(errCode, TestViewL(aTest,aCount,aRows));
220 TEST2(errCode, KErrNone);
221 r=TheDatabase.Execute(_L("CREATE INDEX Key ON Compare (Test)"));
223 TRAP(errCode,TestViewL(aTest,aCount,aRows));
224 TEST2(errCode, KErrNone);
225 r=TheDatabase.Execute(_L("DROP TABLE Compare"));
229 // Test the predicate on the table
230 void TestPredicateBase::TestViewL(const TSelectTest* aTest,TInt aCount,TInt aRows)
232 TUint rowMask=(2u<<aRows)-1;
233 for (;--aCount>=0;++aTest)
235 TheSql.Format(_L("SELECT Id FROM Compare WHERE Test %s"),aTest->iSearchCondition);
236 TInt r=TheView.Prepare(TheDatabase,TheSql,TheView.EReadOnly);
237 TBool ignoreRow0=TheView.Unevaluated();
239 r=TheView.EvaluateAll();
242 while (TheView.NextL())
245 rows|=1u<<TheView.ColUint(1);
248 TEST((rows&~ROW(0))==(aTest->iResultSet&rowMask&~ROW(0)));
250 TEST(rows==(aTest->iResultSet&rowMask));
255 typedef void (*FSetColL)(TDbColNo aCol,const TAny* aVal);
257 void WriteRows(const TAny* aValues,TInt aRows,TInt aSize,FSetColL aSetColL)
259 for (TInt row=0;row<=aRows;++row)
262 TEST(TheTable.ColUint(1)==TUint(row));
264 { // first row is always null
266 aValues=PtrAdd(aValues,aSize);
275 static void SetColL(TDbColNo aCol,const TAny* aVal)
277 TheTable.SetColL(aCol,*(const T*)aVal);
282 inline void WriteRows(const T* aValues,TUint aRows)
284 WriteRows(aValues,aRows,sizeof(T),&SetCol<T>::SetColL);
288 class TestPredicate : public TestPredicateBase
294 // Test the Predicate operators for all types
296 void TestPredicate<T>::Run()
299 WriteRows(T::KValues,elementsof(T::KValues));
300 Test(T::KTests,elementsof(T::KTests),elementsof(T::KValues));
306 static const TText* const KType;
307 static const TUint KValues[];
308 static const TSelectTest KTests[];
310 const TText* const TypeBit::KType=_S("BIT");
311 const TUint TypeBit::KValues[]={0,1};
312 const TSelectTest TypeBit::KTests[]=
314 {_S("IS NULL"),ROW(0)},
315 {_S("IS NOT NULL"),ALL_ROWS},
321 {_S(">=0"),ALL_ROWS},
326 {_S("<=1"),ALL_ROWS},
333 static const TText* const KType;
334 static const TUint KValues[];
335 static const TSelectTest KTests[];
337 const TText* const TypeUint8::KType=_S("UNSIGNED TINYINT");
338 const TUint TypeUint8::KValues[]={0,1,127,128,254,255};
339 const TSelectTest TypeUint8::KTests[]=
341 {_S("IS NULL"),ROW(0)},
342 {_S("IS NOT NULL"),ALL_ROWS},
345 {_S("<2"),ROWS(1,2)},
346 {_S(">=0"),ALL_ROWS},
347 {_S("<128"),ROWS(1,3)},
348 {_S("<>1"),ALL_ROWS-ROW(2)},
355 static const TText* const KType;
356 static const TUint KValues[];
357 static const TSelectTest KTests[];
359 const TText* const TypeUint16::KType=_S("UNSIGNED SMALLINT");
360 const TUint TypeUint16::KValues[]={0,1,5000,32767,32768,65534,65535};
361 const TSelectTest TypeUint16::KTests[]=
363 {_S("IS NULL"),ROW(0)},
364 {_S("IS NOT NULL"),ALL_ROWS},
367 {_S("<2"),ROWS(1,2)},
368 {_S(">=32768"),ROWS(5,7)},
369 {_S("<32767"),ROWS(1,3)},
370 {_S("<>1"),ALL_ROWS-ROW(2)},
371 {_S(">65535"),NO_ROWS}
377 static const TText* const KType;
378 static const TUint KValues[];
379 static const TSelectTest KTests[];
381 const TText* const TypeUint32::KType=_S("UNSIGNED INTEGER");
382 const TUint TypeUint32::KValues[]={0,1,2147483647u,2147483648u,3000000000u,4294967294u,4294967295u};
383 const TSelectTest TypeUint32::KTests[]=
385 {_S("IS NULL"),ROW(0)},
386 {_S("IS NOT NULL"),ALL_ROWS},
389 {_S("<2"),ROWS(1,2)},
390 {_S(">=2147483648"),ROWS(4,7)},
391 {_S("<2147483647"),ROWS(1,2)},
392 {_S("<>3000000000"),ALL_ROWS-ROW(5)},
393 {_S(">4294967295"),NO_ROWS}
399 static const TText* const KType;
400 static const TInt KValues[];
401 static const TSelectTest KTests[];
403 const TText* const TypeInt8::KType=_S("TINYINT");
404 const TInt TypeInt8::KValues[]={-128,-1,0,1,127};
405 const TSelectTest TypeInt8::KTests[]=
407 {_S("IS NULL"),ROW(0)},
408 {_S("IS NOT NULL"),ALL_ROWS},
411 {_S("<2"),ROWS(1,4)},
412 {_S(">=-128"),ALL_ROWS},
413 {_S("<128"),ALL_ROWS},
414 {_S("<>1"),ALL_ROWS-ROW(4)}
420 static const TText* const KType;
421 static const TInt KValues[];
422 static const TSelectTest KTests[];
424 const TText* const TypeInt16::KType=_S("SMALLINT");
425 const TInt TypeInt16::KValues[]={-32768,-32767,-1,0,1,32766,32767};
426 const TSelectTest TypeInt16::KTests[]=
428 {_S("IS NULL"),ROW(0)},
429 {_S("IS NOT NULL"),ALL_ROWS},
431 {_S("<>0"),ALL_ROWS-ROW(4)},
433 {_S("<2"),ROWS(1,5)},
434 {_S(">=-40000"),ALL_ROWS},
435 {_S("<32766"),ROWS(1,5)},
442 static const TText* const KType;
443 static const TInt KValues[];
444 static const TSelectTest KTests[];
446 const TText* const TypeInt32::KType=_S("INTEGER");
447 const TInt TypeInt32::KValues[]={0x80000000/*-2147483648*/,-2147483647,-1,0,1,2147483646,2147483647};
448 const TSelectTest TypeInt32::KTests[]=
450 {_S("IS NULL"),ROW(0)},
451 {_S("IS NOT NULL"),ALL_ROWS},
453 {_S("<>0"),ALL_ROWS-ROW(4)},
455 {_S("<2"),ROWS(1,5)},
456 {_S(">=-2147483648"),ALL_ROWS},
457 {_S("<2147483646"),ROWS(1,5)},
458 {_S(">2147483647"),NO_ROWS},
465 static const TText* const KType;
466 static const TInt64 KValues[];
467 static const TSelectTest KTests[];
469 const TText* const TypeInt64::KType=_S("BIGINT");
470 const TInt64 TypeInt64::KValues[]=
472 MAKE_TINT64(0x80000000, 0x00000000), // min int64
473 _LINT64(-4294967296),
474 TInt(0x80000000), // -2147483648!
482 _LINT64(9223372036854775807) // max int64
484 const TSelectTest TypeInt64::KTests[]=
486 {_S("IS NULL"),ROW(0)},
487 {_S("IS NOT NULL"),ALL_ROWS},
489 {_S("<>0"),ALL_ROWS-ROW(5)},
491 {_S("<2"),ROWS(1,6)},
492 {_S(">=-9223372036854775808"),ALL_ROWS},
493 {_S("<4294967296"),ROWS(1,9)},
494 {_S(">9223372036854775806"),ROW(11)},
501 static const TText* const KType;
502 static const TReal32 KValues[];
503 static const TSelectTest KTests[];
505 const TText* const TypeReal32::KType=_S("REAL");
506 const TReal32 TypeReal32::KValues[]=
516 const TSelectTest TypeReal32::KTests[]=
518 {_S("IS NULL"),ROW(0)},
519 {_S("IS NOT NULL"),ALL_ROWS},
521 {_S("<>0.0"),ALL_ROWS-ROW(4)},
523 {_S("<2e1"),ROWS(1,6)},
524 {_S(">=-100000000000000"),ROWS(2,7)},
525 {_S("<1e-36"),ROWS(1,5)},
526 {_S(">1e15"),ROW(7)},
528 {_S("<=-.0"),ROWS(1,4)},
529 {_S("<1e40"),ALL_ROWS}
535 static const TText* const KType;
536 static const TReal64 KValues[];
537 static const TSelectTest KTests[];
539 const TText* const TypeReal64::KType=_S("DOUBLE");
540 const TReal64 TypeReal64::KValues[]=
550 const TSelectTest TypeReal64::KTests[]=
552 {_S("IS NULL"),ROW(0)},
553 {_S("IS NOT NULL"),ALL_ROWS},
555 {_S("<>0"),ALL_ROWS-ROW(4)},
557 {_S("<2"),ROWS(1,6)},
558 {_S(">=-100000000000000"),ROWS(2,7)},
559 {_S("<1e-300"),ROWS(1,5)},
560 {_S(">1e15"),ROW(7)},
562 {_S("<=0"),ROWS(1,4)},
563 {_S("<1e40"),ROWS(1,6)}
569 static const TText* const KType;
570 static const TTime KValues[];
571 static const TSelectTest KTests[];
573 const TText* const TypeTime::KType=_S("TIME");
574 const TTime TypeTime::KValues[]=
576 TInt64(0u), // zero date/time
577 _L(":085815"), // 8:58:15am
578 _L("19181010:110000"), // 11am, 11 Nov 1918
579 _L("19750226:"), // midnight, 27 Mar 1975
580 _L("19961130:235959"), // 11:59:59pm, 31 Dec 1996
581 _L("19970000:"), // midnight, 1 Jan 1997
582 _L("19970611:210000"), // 9pm, 12 July 1997
583 _L("19980309:214500"), // 9:45pm, 10 April 1998
584 _L("20700608:") // midnight, 9 July 2070
586 const TSelectTest TypeTime::KTests[]=
588 {_S("IS NULL"),ROW(0)},
589 {_S("IS NOT NULL"),ALL_ROWS},
590 {_S("=#12am#"),ROW(1)},
591 {_S("<#Jan 1 2100#"),ALL_ROWS},
592 {_S("<>#31/12/1996 23:59:59#"),ALL_ROWS-ROW(5)},
593 {_S("<#9a#"),ROWS(1,2)},
594 {_S(">=#11:59:59pm, 31 Dec 1996#"),ROWS(5,9)},
595 {_S("=#9:45pm 10 April, 1998#"),ROW(8)},
596 {_S("=#8:58:15#"),ROW(2)}
602 static const TText* const KType;
603 static const TText* const KValues[];
604 static TSelectTest KTests[];
606 const TText* const TypeText::KType=_S("VARCHAR(100)");
607 const TText* const TypeText::KValues[]=
609 _S(""), // this should be equivalent to NULL
614 _S("abcdefghijklmnopqrstuvwxyzlike"),
615 _S("likeabcdefghijklmnopqrstuvwxyz"),
616 _S("abcdefghijklmnopqrstuvwxyzlikeabcdefghijklmnopqrstuvwxyz"),
617 _S("abcdefghijklmnopqrstuvwxyzliveabcdefghijklmnopqrstuvwxyz"),
621 TSelectTest TypeText::KTests[]=
623 {_S("IS NULL"),ROWS(0,1)},
624 {_S("IS NOT NULL"),ALL_ROWS-ROW(1)},
626 {_S("=''"),ROWS(0,1)}, // equivalent to IS NULL
627 {_S("<>''"),ALL_ROWS-ROW(1)}, // equivalent to IS NOT NULL
628 {_S(">''"),ALL_ROWS-ROW(1)}, // equivalent to IS NOT NULL
629 {_S("<''"),NO_ROWS}, // expression is trivially false
630 {_S("<=''"),ROWS(0,1)},
631 {_S(">=''"),ALL_ROWS+ROW(0)}, // expression is trivially true
633 {_S("LIKE ''"),ROWS(0,1)}, // synonomous with IS NULL
634 {_S("NOT LIKE ''"),ALL_ROWS-ROW(1)},
635 {_S("LIKE '?*'"),ALL_ROWS-ROW(1)}, // synonomous with IS NOT NULL
636 {_S("NOT LIKE '?*'"),ROWS(0,1)},
637 {_S("LIKE '*'"),ALL_ROWS+ROW(0)}, // trivially true
638 {_S("NOT LIKE '*'"),NO_ROWS},
641 {_S("<'ab'"),ROWS(0,3)+ROW(11)},
642 {_S("<'abc'"),ROWS(0,4)+ROW(11)},
643 {_S("<'b'"),ROWS(0,4)+ROW(6)+ROWS(8,9)+ROW(11)},
644 {_S(">'abc'"),ROWS(5,10)},
645 {_S("='like'"),ROW(5)},
646 {_S("='l''ke'"),ROW(10)},
647 {_S("='''Tis'"),ROW(11)},
649 {_S("LIKE 'a'"),ROW(2)},
650 {_S("LIKE 'a*'"),ROWS(2,4)+ROW(6)+ROWS(8,9)},
651 {_S("LIKE '*a'"),ROWS(2,4)},
652 {_S("LIKE 'a*a'"),ROWS(3,4)},
653 {_S("LIKE '*a*'"),ROWS(2,4)+ROWS(6,9)},
655 {_S("LIKE 'like'"),ROW(5)},
656 {_S("LIKE 'l?ke'"),ROW(5)+ROW(10)},
657 {_S("LIKE 'like*'"),ROW(5)+ROW(7)},
658 {_S("LIKE '*like'"),ROWS(5,6)},
659 {_S("LIKE '*like*'"),ROWS(5,8)},
660 {_S("LIKE '*likeit*'"),NO_ROWS},
661 {_S("LIKE '*li?e*'"),ROWS(5,9)},
662 {_S("LIKE '?*li?e*'"),ROW(6)+ROWS(8,9)},
663 {_S("LIKE '*li?e*?'"),ROWS(7,9)},
664 {_S("LIKE '?*li?e*?'"),ROWS(8,9)},
665 {_S("LIKE '*?k?*'"),ROWS(5,10)},
666 {_S("LIKE '*?i?e*'"),ROWS(5,9)},
668 {_S("LIKE '*e*'"),ROWS(5,10)},
669 {_S("LIKE '*z*k*e*'"),ROW(6)+ROW(8)},
670 {_S("LIKE '\?\?k?'"),ROW(5)+ROW(10)},
671 {_S("LIKE '\?\?k*'"),ROW(5)+ROW(7)+ROW(10)},
672 {_S("LIKE '*''*'"),ROWS(10,11)},
673 {_S("LIKE '?''\?\?'"),ROW(10)},
674 {_S("LIKE '?'"),ROW(2)},
675 {_S("LIKE '\?\?\?\?'"),ROW(5)+ROWS(10,11)},
676 {_S("LIKE '\?\?*\?\?'"),ROWS(5,11)},
677 {_S("LIKE '''*'"),ROW(11)}
680 TEMPLATE_SPECIALIZATION struct SetCol<const TText* const>
682 static void SetColL(TDbColNo aCol,const TAny* aVal)
684 TheTable.SetColL(aCol,TPtrC(*(const TText* const*)aVal));
687 TEMPLATE_SPECIALIZATION struct SetCol<const TText*>
689 static void SetColL(TDbColNo aCol,const TAny* aVal)
691 TheTable.SetColL(aCol,TPtrC(*(const TText* const*)aVal));
698 static const TText* const KType;
700 const TText* const TypeLongText::KType=_S("LONG VARCHAR");
702 class TestPredicate2 : public TestPredicateBase
708 // write rows equivalent to TypeText and use its tests
709 void TestPredicate2::RunL()
711 Create(TypeLongText::KType);
712 TBuf<1022> fill=_S("abcdefghijklmnopqrstuvqxyz");
713 fill.AppendFill('.',fill.MaxLength()-fill.Length());
715 for (TInt row=0;row<=TInt(elementsof(TypeText::KValues));++row)
718 TheTable.SetColL(1,row);
721 RDbColWriteStream blob;
722 blob.OpenLC(TheTable,2);
727 case 1: case 2: case 3: case 4: case 5: case 10: case 11:
728 blob.WriteL(TPtrC(TypeText::KValues[row-1]));
732 blob.WriteL(_L("like"));
735 blob.WriteL(_L("like"));
740 blob.WriteL(_L("like"));
745 blob.WriteL(_L("live"));
750 CleanupStack::PopAndDestroy();
755 TInt r=TheDatabase.Commit();
757 TestViewL(TypeText::KTests,elementsof(TypeText::KTests),elementsof(TypeText::KValues));
758 CDbKey& key=*CDbKey::NewLC();
759 key.AddL(TDbKeyCol(_L("Test"),120));
760 r=TheDatabase.CreateIndex(_L("Key"),_L("Compare"),key);
762 CleanupStack::PopAndDestroy();
763 TestViewL(TypeText::KTests,elementsof(TypeText::KTests),elementsof(TypeText::KValues));
764 r=TheDatabase.Execute(_L("DROP TABLE Compare"));
769 * Utility for DEF063276 fix.
773 _LIT(KTypeTextKTests44, "Z:\\test\\data\\typetextktests44.dat");
774 _LIT(KTypeTextKTests46, "Z:\\test\\data\\typetextktests46.dat");
775 _LIT(KTypeTextKTests47, "Z:\\test\\data\\typetextktests47.dat");
777 _LIT(KTypeTextKTests44, ".\\dbms-tst\\typetextktests44.dat");
778 _LIT(KTypeTextKTests46, ".\\dbms-tst\\typetextktests46.dat");
779 _LIT(KTypeTextKTests47, ".\\dbms-tst\\typetextktests47.dat");
782 static void ReadDesc(TDes& aDes, const TDesC& aFilename, RFs& aFs)
785 TInt err = file.Open(aFs, aFilename, EFileRead);
786 TheTest(err == KErrNone);
787 CleanupClosePushL(file);
789 TPtr8 ptr(reinterpret_cast<TUint8*>(const_cast<TUint16*>(aDes.Ptr())), aDes.MaxSize());
790 err = file.Read(ptr);
791 TheTest(err == KErrNone);
792 aDes.SetLength(ptr.Length() / sizeof(TText));
793 CleanupStack::PopAndDestroy(&file);
797 @SYMTestCaseID SYSLIB-DBMS-CT-0633
798 @SYMTestCaseDesc Tests the Predicate operators for all types
799 @SYMTestPriority Medium
800 @SYMTestActions Attempt to check with different types
801 @SYMTestExpectedResults Test must not fail
804 LOCAL_C void TestPredicatesL()
806 TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0633 init "));
808 TestPredicate<TypeBit>::Run();
809 TestPredicate<TypeUint8>::Run();
810 TestPredicate<TypeUint16>::Run();
811 TestPredicate<TypeUint32>::Run();
812 TestPredicate<TypeInt8>::Run();
813 TestPredicate<TypeInt16>::Run();
814 TestPredicate<TypeInt32>::Run();
815 TestPredicate<TypeInt64>::Run();
816 TestPredicate<TypeReal32>::Run();
817 TestPredicate<TypeReal64>::Run();
818 TestPredicate<TypeTime>::Run();
821 * Work around for DEF063276.
822 * These literals are now loaded from Z:\test\data\TypeTextKTests44.dat,
823 * Z:\test\data\TypeTextKTests44.dat and Z:\test\data\TypeTextKTests44.dat respectively.
824 * Bullseye Coverage corrupts these literals to avoid this they are stored in files as to not be touched by Bullseye Coverage.
828 ReadDesc(buf44, KTypeTextKTests44, TheFs);
829 TypeText::KTests[44].iSearchCondition = const_cast<TText*>(buf44.PtrZ());
831 TBuf<32> buf46(TypeText::KTests[46].iSearchCondition);
832 ReadDesc(buf46, KTypeTextKTests46, TheFs);
833 TypeText::KTests[46].iSearchCondition = const_cast<TText*>(buf46.PtrZ());
835 TBuf<32> buf47(TypeText::KTests[47].iSearchCondition);
836 ReadDesc(buf47, KTypeTextKTests47, TheFs);
837 TypeText::KTests[47].iSearchCondition = const_cast<TText*>(buf47.PtrZ());
841 TestPredicate<TypeText>::Run();
842 TestPredicate2::RunL();
848 @SYMTestCaseID SYSLIB-DBMS-CT-0634
849 @SYMTestCaseDesc DML Query test
850 Test for RDbNamedDatabase::Execute() function
851 @SYMTestPriority Medium
852 @SYMTestActions Tests for CREATE TABLE,CREATE UNIQUE INDEX,INSET INTO,UPDATE,DELETE,DROP queries
853 @SYMTestExpectedResults Test must not fail
856 LOCAL_C void TestDML()
858 TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0634 init "));
861 TInt r=TheDatabase.Execute(_L("CREATE TABLE test (ID INTEGER NOT NULL,SALARY DOUBLE)"));
863 r=TheDatabase.Execute(_L("CREATE UNIQUE INDEX key ON test (ID)"));
866 TheTest.Next(_L("insert-statements"));
867 r=TheDatabase.Execute(_L("INSERT INTO test VALUES (0,0)"));
869 r=TheDatabase.Execute(_L("INSERT INTO test (ID) VALUES (1)"));
871 r=TheDatabase.Execute(_L("INSERT INTO test (SALARY,ID) VALUES (20.4,2)"));
874 TheTest.Next(_L("update-statements"));
875 r=TheDatabase.Execute(_L("UPDATE test SET SALARY=30000 WHERE ID=1"));
878 TheTest.Next(_L("delete-statements"));
879 r=TheDatabase.Execute(_L("DELETE FROM test WHERE SALARY<40"));
881 r=TheDatabase.Execute(_L("DELETE FROM test"));
883 r=TheDatabase.Execute(_L("DROP TABLE test"));
886 TheTest.Next(_L("larger table"));
887 r=TheDatabase.Execute(_L("CREATE TABLE test (ID COUNTER,DATA INTEGER)"));
890 TheTest.Next(_L("insert"));
893 for (TInt ii=0;ii<100;++ii)
895 sql.Format(_L("INSERT INTO test (DATA) VALUES (%D)"),100-ii);
896 r=TheDatabase.Execute(sql);
899 r=TheDatabase.Commit();
902 TheTest.Next(_L("update"));
903 r=TheDatabase.Execute(_L("UPDATE test SET DATA=200 WHERE ID>=40 AND ID<60"));
906 TheTest.Next(_L("delete"));
907 r=TheDatabase.Execute(_L("DELETE FROM test WHERE DATA>90"));
910 TheTest.Next(_L("update"));
911 r=TheDatabase.Execute(_L("UPDATE test SET DATA=-1"));
914 TheTest.Next(_L("delete"));
915 r=TheDatabase.Execute(_L("DELETE FROM test"));
917 r=TheDatabase.Execute(_L("DROP TABLE test"));
925 @SYMTestCaseID SYSLIB-DBMS-CT-0635
926 @SYMTestCaseDesc DBMS SQL parsing and execution tests.Tests for database index order
927 Test for RDbNamedDatabase::Execute() function
928 @SYMTestPriority Medium
929 @SYMTestActions Tests for order by index
930 @SYMTestExpectedResults Test must not fail
933 LOCAL_C void TestOrderByL()
935 static const TReal TestDataSalary[]={10,34000,15000,53200,17800,240000};
936 static const TText* const TestDataNames[]={_S("gopher"),_S("james '007' bond"),_S("moneypenny"),_S("Q"),_S("james '007' bond"),_S("M")};
938 TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0635 init "));
942 TInt r=TheDatabase.Execute(_L("CREATE TABLE test (ID INTEGER NOT NULL,SALARY DOUBLE,NAME VARCHAR)"));
944 r=TheDatabase.Execute(_L("CREATE UNIQUE INDEX key ON test (ID)"));
947 TheTest.Next(_L("insert data"));
948 r=TheView.Prepare(TheDatabase,_L("SELECT ID,SALARY,NAME FROM test"),TheView.EInsertOnly);
954 TheView.SetColL(1,6-ii);
955 TheView.SetColL(2,TestDataSalary[ii]);
956 TheView.SetColL(3,TPtrC(TestDataNames[ii]));
959 r=TheDatabase.Commit();
963 TheTest.Next(_L("Order by <index>"));
964 // test the index is used here
965 r=TheView.Prepare(TheDatabase,_L("SELECT ID FROM test ORDER BY ID"));
967 TEST(!TheView.Unevaluated());
969 if (TheView.FirstL())
973 TInt last=TheView.ColInt(1);
974 while (TheView.NextL())
978 TInt v=TheView.ColInt(1);
984 TEST(c==TheView.CountL());
987 TheTest.Next(_L("Order by <no-index> 1"));
988 // test that no index is used here
989 r=TheView.Prepare(TheDatabase,_L("SELECT SALARY FROM test ORDER BY SALARY"));
991 TEST(TheView.Unevaluated());
992 r=TheView.EvaluateAll();
995 if (TheView.FirstL())
999 TReal last=TheView.ColReal(1);
1000 while (TheView.NextL())
1004 TReal v=TheView.ColReal(1);
1010 TEST(c==TheView.CountL());
1013 TheTest.Next(_L("Order by <no-index> 2"));
1014 // test that no index is used here
1015 r=TheView.Prepare(TheDatabase,_L("SELECT SALARY FROM test ORDER BY SALARY,NAME"));
1017 TEST(TheView.Unevaluated());
1018 r=TheView.EvaluateAll();
1021 if (TheView.FirstL())
1025 TReal last=TheView.ColReal(1);
1026 while (TheView.NextL())
1030 TReal v=TheView.ColReal(1);
1036 TEST(c==TheView.CountL());
1039 TheTest.Next(_L("Order by <no-index> 3"));
1040 // test that no index is used here
1041 r=TheView.Prepare(TheDatabase,_L("SELECT NAME FROM test ORDER BY NAME"));
1043 TEST(TheView.Unevaluated());
1044 r=TheView.EvaluateAll();
1047 if (TheView.FirstL())
1051 TBuf<50> last=TheView.ColDes(1);
1052 while (TheView.NextL())
1056 TPtrC v=TheView.ColDes(1);
1062 TEST(c==TheView.CountL());
1065 TheTest.Next(_L("Order by <no-index> 4"));
1066 // test that no index is used here
1067 r=TheView.Prepare(TheDatabase,_L("SELECT NAME FROM test ORDER BY NAME,SALARY"));
1069 TEST(TheView.Unevaluated());
1070 r=TheView.EvaluateAll();
1073 if (TheView.FirstL())
1077 TBuf<50> last=TheView.ColDes(1);
1078 while (TheView.NextL())
1082 TPtrC v=TheView.ColDes(1);
1088 TEST(c==TheView.CountL());
1091 TheTest.Next(_L("Order by + search <no-index>"));
1092 // test that no index is used here
1093 r=TheView.Prepare(TheDatabase,_L("SELECT ID,SALARY FROM test WHERE SALARY>30000 ORDER BY SALARY DESC"));
1095 TEST(TheView.Unevaluated());
1096 r=TheView.EvaluateAll();
1099 if (TheView.FirstL())
1103 TReal last=TheView.ColReal(2);
1104 while (TheView.NextL())
1108 TReal v=TheView.ColReal(2);
1114 TEST(c==TheView.CountL());
1120 TheTest.Next(_L("Order by <index> Finished"));
1124 LOCAL_C void doMain()
1126 TheTest.Start(_L("Predicate tests"));
1127 TRAPD(errCode, TestPredicatesL());
1128 TEST2(errCode, KErrNone);
1130 TheTest.Next(_L("DML execution"));
1133 TheTest.Next(_L("ORDER BY clause"));
1134 TRAP(errCode, TestOrderByL());
1135 TEST2(errCode, KErrNone);
1139 // Prepare the test directory.
1140 LOCAL_C void setupTestDirectory()
1142 TInt r=TheFs.Connect();
1145 r=TheFs.MkDir(KTestDatabase);
1146 TEST(r==KErrNone || r==KErrAlreadyExists);
1149 // Initialise the cleanup stack.
1150 LOCAL_C void setupCleanup()
1152 TheTrapCleanup=CTrapCleanup::New();
1153 TEST(TheTrapCleanup!=NULL);
1156 for (TInt i=KTestCleanupStack;i>0;i--)\
1157 CleanupStack::PushL((TAny*)0);\
1158 CleanupStack::Pop(KTestCleanupStack);\
1163 // Test streaming conversions.
1164 GLDEF_C TInt E32Main()
1167 setupTestDirectory();
1171 TheTest.Start(_L("Standard database"));
1174 TheTest.Printf(_L("Waiting for server exit\n"));
1175 const TUint KExitDelay=6*0x100000; // ~6 seconds
1176 User::After(KExitDelay);
1178 // clean up data file used by this test - must be done before call to End() - DEF047652
1184 TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
1185 TheTest(err==KErrNone);
1186 TheTest(lc==KErrNone);
1188 TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
1190 TheCrcChecker.ErrorReportL(err, errmsg);
1191 RDebug::Print(errmsg);
1192 TheTest(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
1201 delete TheTrapCleanup;