os/persistentdata/persistentstorage/dbms/pcdbms/tdbms/src/t_sql.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
// MSVC++ up to 5.0 has problems with expanding inline functions
sl@0
    17
// This disables the mad warnings for the whole project
sl@0
    18
#if defined(NDEBUG) && defined(__VC32__) && _MSC_VER<=1100
sl@0
    19
#pragma warning(disable : 4710)			// function not expanded. MSVC 5.0 is stupid
sl@0
    20
#endif
sl@0
    21
sl@0
    22
#include <d32dbms.h>
sl@0
    23
#include <f32file.h>
sl@0
    24
#include <e32test.h>
sl@0
    25
#include <e32math.h>
sl@0
    26
sl@0
    27
#include "crccheck.h"
sl@0
    28
sl@0
    29
#undef __UHEAP_MARK
sl@0
    30
#define __UHEAP_MARK
sl@0
    31
#undef __UHEAP_MARKEND
sl@0
    32
#define __UHEAP_MARKEND
sl@0
    33
sl@0
    34
LOCAL_D TDBMS_CRCChecks TheCrcChecker;
sl@0
    35
sl@0
    36
#ifndef __linux__ //No CRC test on LINUX
sl@0
    37
#ifdef __TOOLS2__
sl@0
    38
const TPtrC	KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_SQL.CRC");
sl@0
    39
#else
sl@0
    40
const TPtrC	KCrcRecord=_L("C:\\dbms-tst\\T_SQL.CRC");
sl@0
    41
#endif
sl@0
    42
#endif
sl@0
    43
sl@0
    44
// constructing literal TInt64 from compiler 64 bit integer rep
sl@0
    45
sl@0
    46
#ifndef I64LIT
sl@0
    47
#if defined __GCC32__ || defined __EABI__
sl@0
    48
#define _LINT64(val) MAKE_TINT64(TUint(val##LL>>32),TUint(val##LL&0xffffffffu))
sl@0
    49
#else
sl@0
    50
#define _LINT64(val) MAKE_TINT64(TUint(__int64(val)>>32),TUint(__int64(val)&0xffffffffu))
sl@0
    51
#endif
sl@0
    52
#else // I64LIT
sl@0
    53
#define _LINT64 I64LIT
sl@0
    54
#endif // I64LIT
sl@0
    55
sl@0
    56
LOCAL_D RTest TheTest(_L("T_SQL: DBMS SQL parsing and execution tests"));
sl@0
    57
sl@0
    58
LOCAL_D RFs TheFs;
sl@0
    59
LOCAL_D CTrapCleanup* TheTrapCleanup;
sl@0
    60
LOCAL_D RDbs TheDbs;
sl@0
    61
LOCAL_D RDbNamedDatabase TheDatabase;
sl@0
    62
LOCAL_D RDbTable TheTable;
sl@0
    63
LOCAL_D RDbView TheView;
sl@0
    64
LOCAL_D TBuf<1024> TheSql;
sl@0
    65
sl@0
    66
const TInt KTestCleanupStack=0x20;
sl@0
    67
sl@0
    68
#ifdef __TOOLS2__
sl@0
    69
const TPtrC KTestDatabase=_L(".\\dbms-tst\\T_SQL.DB");
sl@0
    70
#else
sl@0
    71
const TPtrC KTestDatabase=_L("C:\\dbms-tst\\T_SQL.DB");
sl@0
    72
#endif
sl@0
    73
sl@0
    74
#define elementsof(array) (sizeof(array)/sizeof(array[0]))
sl@0
    75
sl@0
    76
LOCAL_C void TestCleanup()
sl@0
    77
	{
sl@0
    78
	TheTable.Close();
sl@0
    79
	TheView.Close();
sl@0
    80
	TheDatabase.Close();
sl@0
    81
#ifndef __TOOLS2__
sl@0
    82
	TheDbs.Close();
sl@0
    83
#endif
sl@0
    84
sl@0
    85
	TRAPD(errCode, TheCrcChecker.GenerateCrcL(KTestDatabase));
sl@0
    86
sl@0
    87
	TheFs.Close();
sl@0
    88
	/////////////
sl@0
    89
	RFs fsSession;
sl@0
    90
	TInt err = fsSession.Connect();
sl@0
    91
	if(err == KErrNone)
sl@0
    92
		{
sl@0
    93
		TEntry entry;
sl@0
    94
		if(fsSession.Entry(KTestDatabase, entry) == KErrNone)
sl@0
    95
			{
sl@0
    96
			RDebug::Print(_L("Deleting \"%S\" file.\n"), &KTestDatabase);
sl@0
    97
			err = fsSession.SetAtt(KTestDatabase, 0, KEntryAttReadOnly);
sl@0
    98
			if(err != KErrNone) 
sl@0
    99
				{
sl@0
   100
				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &KTestDatabase);
sl@0
   101
				}
sl@0
   102
			err = fsSession.Delete(KTestDatabase);
sl@0
   103
			if(err != KErrNone) 
sl@0
   104
				{
sl@0
   105
				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &KTestDatabase);
sl@0
   106
				}
sl@0
   107
			}
sl@0
   108
		fsSession.Close();
sl@0
   109
		}
sl@0
   110
	else
sl@0
   111
		{
sl@0
   112
		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &KTestDatabase);
sl@0
   113
		}
sl@0
   114
	}
sl@0
   115
sl@0
   116
LOCAL_C void CloseDatabase()
sl@0
   117
	{
sl@0
   118
	TheDatabase.Close();
sl@0
   119
	TRAPD(errCode, TheCrcChecker.GenerateCrcL(KTestDatabase));
sl@0
   120
sl@0
   121
	}
sl@0
   122
sl@0
   123
LOCAL_C void Disconnect()
sl@0
   124
	{
sl@0
   125
#ifndef __TOOLS2__
sl@0
   126
	TheDbs.ResourceCheck();
sl@0
   127
	TheDbs.Close();
sl@0
   128
#endif
sl@0
   129
	}
sl@0
   130
sl@0
   131
///////////////////////////////////////////////////////////////////////////////////////
sl@0
   132
///////////////////////////////////////////////////////////////////////////////////////
sl@0
   133
//Tests macros and functions.
sl@0
   134
//If (!aValue) then the test will be panicked, the test data files will be deleted.
sl@0
   135
static void Check(TInt aValue, TInt aLine)
sl@0
   136
	{
sl@0
   137
	if(!aValue)
sl@0
   138
		{
sl@0
   139
		::TestCleanup();
sl@0
   140
		TheTest(EFalse, aLine);
sl@0
   141
		}
sl@0
   142
	}
sl@0
   143
//If (aValue != aExpected) then the test will be panicked, the test data files will be deleted.
sl@0
   144
static void Check(TInt aValue, TInt aExpected, TInt aLine)
sl@0
   145
	{
sl@0
   146
	if(aValue != aExpected)
sl@0
   147
		{
sl@0
   148
		RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
sl@0
   149
		::TestCleanup();
sl@0
   150
		TheTest(EFalse, aLine);
sl@0
   151
		}
sl@0
   152
	}
sl@0
   153
//Use these to test conditions.
sl@0
   154
#define TEST(arg) ::Check((arg), __LINE__)
sl@0
   155
#define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__)
sl@0
   156
sl@0
   157
///////////////////////////////////////////////////////////////////////////////////////
sl@0
   158
///////////////////////////////////////////////////////////////////////////////////////
sl@0
   159
sl@0
   160
// Create the database
sl@0
   161
LOCAL_C void CreateDatabase()
sl@0
   162
	{
sl@0
   163
	TInt r=TheDatabase.Replace(TheFs,KTestDatabase);
sl@0
   164
	TEST2(r, KErrNone);
sl@0
   165
	}
sl@0
   166
sl@0
   167
LOCAL_C void Connect()
sl@0
   168
	{
sl@0
   169
#ifndef __TOOLS2__
sl@0
   170
	TInt r=TheDbs.Connect();
sl@0
   171
	TEST2(r, KErrNone);
sl@0
   172
	TheDbs.ResourceMark();
sl@0
   173
#endif
sl@0
   174
	}
sl@0
   175
sl@0
   176
// Open the database through the server
sl@0
   177
LOCAL_C void ShareDatabase()
sl@0
   178
	{
sl@0
   179
	TInt r=TheDatabase.Open(TheDbs,KTestDatabase);
sl@0
   180
	TEST2(r, KErrNone);
sl@0
   181
	}
sl@0
   182
sl@0
   183
struct TSelectTest
sl@0
   184
	{
sl@0
   185
	const TText* iSearchCondition;
sl@0
   186
	TUint iResultSet;
sl@0
   187
	};
sl@0
   188
#define ROWS(n,m) (((~0u)<<(n))&((2u<<(m))-1))
sl@0
   189
#define ROW(n) ROWS(n,n)
sl@0
   190
#define NO_ROWS 0
sl@0
   191
#define ALL_ROWS (~1u)		// all rows which are not NULL
sl@0
   192
sl@0
   193
class TestPredicateBase
sl@0
   194
	{
sl@0
   195
protected:
sl@0
   196
	static void Create(const TText* aType);
sl@0
   197
	static void Test(const TSelectTest* aTest,TInt aCount,TInt aRows);
sl@0
   198
	static void TestViewL(const TSelectTest* aTest,TInt aCount,TInt aRows);
sl@0
   199
	};
sl@0
   200
sl@0
   201
// Create the table for the predicate tests
sl@0
   202
void TestPredicateBase::Create(const TText* aType)
sl@0
   203
	{
sl@0
   204
	TheTest.Next(TPtrC(aType));
sl@0
   205
	TheDatabase.Begin();
sl@0
   206
	TheSql.Format(_L("CREATE TABLE Compare (Id COUNTER,Test %s)"),aType);
sl@0
   207
	TInt r=TheDatabase.Execute(TheSql);
sl@0
   208
	TEST2(r, KErrNone);
sl@0
   209
	r=TheTable.Open(TheDatabase,_L("Compare"),TheTable.EInsertOnly);
sl@0
   210
	TEST2(r, KErrNone);
sl@0
   211
	}
sl@0
   212
sl@0
   213
// Test the predicate on the table, then on the indexed table
sl@0
   214
void TestPredicateBase::Test(const TSelectTest* aTest,TInt aCount,TInt aRows)
sl@0
   215
	{
sl@0
   216
	TheTable.Close();
sl@0
   217
	TInt r=TheDatabase.Commit();
sl@0
   218
	TEST2(r, KErrNone);
sl@0
   219
	TRAPD(errCode, TestViewL(aTest,aCount,aRows));
sl@0
   220
	TEST2(errCode, KErrNone);
sl@0
   221
	r=TheDatabase.Execute(_L("CREATE INDEX Key ON Compare (Test)"));
sl@0
   222
	TEST2(r, KErrNone);
sl@0
   223
	TRAP(errCode,TestViewL(aTest,aCount,aRows));
sl@0
   224
	TEST2(errCode, KErrNone);
sl@0
   225
	r=TheDatabase.Execute(_L("DROP TABLE Compare"));
sl@0
   226
	TEST2(r, KErrNone);
sl@0
   227
	}
sl@0
   228
sl@0
   229
// Test the predicate on the table
sl@0
   230
void TestPredicateBase::TestViewL(const TSelectTest* aTest,TInt aCount,TInt aRows)
sl@0
   231
	{
sl@0
   232
	TUint rowMask=(2u<<aRows)-1;
sl@0
   233
	for (;--aCount>=0;++aTest)
sl@0
   234
		{
sl@0
   235
		TheSql.Format(_L("SELECT Id FROM Compare WHERE Test %s"),aTest->iSearchCondition);
sl@0
   236
		TInt r=TheView.Prepare(TheDatabase,TheSql,TheView.EReadOnly);
sl@0
   237
		TBool ignoreRow0=TheView.Unevaluated();
sl@0
   238
		TEST2(r, KErrNone);
sl@0
   239
		r=TheView.EvaluateAll();
sl@0
   240
		TEST2(r, KErrNone);
sl@0
   241
		TUint rows=0;
sl@0
   242
		while (TheView.NextL())
sl@0
   243
			{
sl@0
   244
			TheView.GetL();
sl@0
   245
			rows|=1u<<TheView.ColUint(1);
sl@0
   246
			}
sl@0
   247
		if (ignoreRow0)
sl@0
   248
			TEST((rows&~ROW(0))==(aTest->iResultSet&rowMask&~ROW(0)));
sl@0
   249
		else
sl@0
   250
			TEST(rows==(aTest->iResultSet&rowMask));
sl@0
   251
		TheView.Close();
sl@0
   252
		}
sl@0
   253
	}
sl@0
   254
sl@0
   255
typedef void (*FSetColL)(TDbColNo aCol,const TAny* aVal);
sl@0
   256
sl@0
   257
void WriteRows(const TAny* aValues,TInt aRows,TInt aSize,FSetColL aSetColL)
sl@0
   258
	{
sl@0
   259
	for (TInt row=0;row<=aRows;++row)
sl@0
   260
		{
sl@0
   261
		TheTable.InsertL();
sl@0
   262
		TEST(TheTable.ColUint(1)==TUint(row));
sl@0
   263
		if (row>0)
sl@0
   264
			{	// first row is always null
sl@0
   265
			aSetColL(2,aValues);
sl@0
   266
			aValues=PtrAdd(aValues,aSize);
sl@0
   267
			}
sl@0
   268
		TheTable.PutL();
sl@0
   269
		}
sl@0
   270
	}
sl@0
   271
sl@0
   272
template <class T>
sl@0
   273
struct SetCol
sl@0
   274
	{
sl@0
   275
	static void SetColL(TDbColNo aCol,const TAny* aVal)
sl@0
   276
		{
sl@0
   277
		TheTable.SetColL(aCol,*(const T*)aVal);
sl@0
   278
		}
sl@0
   279
	};
sl@0
   280
sl@0
   281
template <class T>
sl@0
   282
inline void WriteRows(const T* aValues,TUint aRows)
sl@0
   283
	{
sl@0
   284
	WriteRows(aValues,aRows,sizeof(T),&SetCol<T>::SetColL);
sl@0
   285
	}
sl@0
   286
sl@0
   287
template <class T>
sl@0
   288
class TestPredicate : public TestPredicateBase
sl@0
   289
	{
sl@0
   290
public:
sl@0
   291
	static void Run();
sl@0
   292
	};
sl@0
   293
sl@0
   294
// Test the Predicate operators for all types
sl@0
   295
template <class T>
sl@0
   296
void TestPredicate<T>::Run()
sl@0
   297
	{
sl@0
   298
	Create(T::KType);
sl@0
   299
	WriteRows(T::KValues,elementsof(T::KValues));
sl@0
   300
	Test(T::KTests,elementsof(T::KTests),elementsof(T::KValues));
sl@0
   301
	}
sl@0
   302
sl@0
   303
struct TypeBit
sl@0
   304
	{
sl@0
   305
public:
sl@0
   306
	static const TText* const KType;
sl@0
   307
	static const TUint KValues[];
sl@0
   308
	static const TSelectTest KTests[];
sl@0
   309
	};
sl@0
   310
const TText* const TypeBit::KType=_S("BIT");
sl@0
   311
const TUint TypeBit::KValues[]={0,1};
sl@0
   312
const TSelectTest TypeBit::KTests[]=
sl@0
   313
	{
sl@0
   314
	{_S("IS NULL"),ROW(0)},
sl@0
   315
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   316
	{_S("=0"),ROW(1)},
sl@0
   317
	{_S("<>0"),ROW(2)},
sl@0
   318
	{_S(">0"),ROW(2)},
sl@0
   319
	{_S("<0"),NO_ROWS},
sl@0
   320
	{_S("<=0"),ROW(1)},
sl@0
   321
	{_S(">=0"),ALL_ROWS},
sl@0
   322
	{_S("=1"),ROW(2)},
sl@0
   323
	{_S("<>1"),ROW(1)},
sl@0
   324
	{_S(">1"),NO_ROWS},
sl@0
   325
	{_S("<1"),ROW(1)},
sl@0
   326
	{_S("<=1"),ALL_ROWS},
sl@0
   327
	{_S(">=1"),ROW(2)}
sl@0
   328
	};
sl@0
   329
sl@0
   330
struct TypeUint8
sl@0
   331
	{
sl@0
   332
public:
sl@0
   333
	static const TText* const KType;
sl@0
   334
	static const TUint KValues[];
sl@0
   335
	static const TSelectTest KTests[];
sl@0
   336
	};
sl@0
   337
const TText* const TypeUint8::KType=_S("UNSIGNED TINYINT");
sl@0
   338
const TUint TypeUint8::KValues[]={0,1,127,128,254,255};
sl@0
   339
const TSelectTest TypeUint8::KTests[]=
sl@0
   340
	{
sl@0
   341
	{_S("IS NULL"),ROW(0)},
sl@0
   342
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   343
	{_S("=0"),ROW(1)},
sl@0
   344
	{_S("=3"),NO_ROWS},
sl@0
   345
	{_S("<2"),ROWS(1,2)},
sl@0
   346
	{_S(">=0"),ALL_ROWS},
sl@0
   347
	{_S("<128"),ROWS(1,3)},
sl@0
   348
	{_S("<>1"),ALL_ROWS-ROW(2)},
sl@0
   349
	{_S(">255"),NO_ROWS}
sl@0
   350
	};
sl@0
   351
sl@0
   352
struct TypeUint16
sl@0
   353
	{
sl@0
   354
public:
sl@0
   355
	static const TText* const KType;
sl@0
   356
	static const TUint KValues[];
sl@0
   357
	static const TSelectTest KTests[];
sl@0
   358
	};
sl@0
   359
const TText* const TypeUint16::KType=_S("UNSIGNED SMALLINT");
sl@0
   360
const TUint TypeUint16::KValues[]={0,1,5000,32767,32768,65534,65535};
sl@0
   361
const TSelectTest TypeUint16::KTests[]=
sl@0
   362
	{
sl@0
   363
	{_S("IS NULL"),ROW(0)},
sl@0
   364
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   365
	{_S("=0"),ROW(1)},
sl@0
   366
	{_S("=3"),NO_ROWS},
sl@0
   367
	{_S("<2"),ROWS(1,2)},
sl@0
   368
	{_S(">=32768"),ROWS(5,7)},
sl@0
   369
	{_S("<32767"),ROWS(1,3)},
sl@0
   370
	{_S("<>1"),ALL_ROWS-ROW(2)},
sl@0
   371
	{_S(">65535"),NO_ROWS}
sl@0
   372
	};
sl@0
   373
sl@0
   374
struct TypeUint32
sl@0
   375
	{
sl@0
   376
public:
sl@0
   377
	static const TText* const KType;
sl@0
   378
	static const TUint KValues[];
sl@0
   379
	static const TSelectTest KTests[];
sl@0
   380
	};
sl@0
   381
const TText* const TypeUint32::KType=_S("UNSIGNED INTEGER");
sl@0
   382
const TUint TypeUint32::KValues[]={0,1,2147483647u,2147483648u,3000000000u,4294967294u,4294967295u};
sl@0
   383
const TSelectTest TypeUint32::KTests[]=
sl@0
   384
	{
sl@0
   385
	{_S("IS NULL"),ROW(0)},
sl@0
   386
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   387
	{_S("=0"),ROW(1)},
sl@0
   388
	{_S("=3"),NO_ROWS},
sl@0
   389
	{_S("<2"),ROWS(1,2)},
sl@0
   390
	{_S(">=2147483648"),ROWS(4,7)},
sl@0
   391
	{_S("<2147483647"),ROWS(1,2)},
sl@0
   392
	{_S("<>3000000000"),ALL_ROWS-ROW(5)},
sl@0
   393
	{_S(">4294967295"),NO_ROWS}
sl@0
   394
	};
sl@0
   395
sl@0
   396
struct TypeInt8
sl@0
   397
	{
sl@0
   398
public:
sl@0
   399
	static const TText* const KType;
sl@0
   400
	static const TInt KValues[];
sl@0
   401
	static const TSelectTest KTests[];
sl@0
   402
	};
sl@0
   403
const TText* const TypeInt8::KType=_S("TINYINT");
sl@0
   404
const TInt TypeInt8::KValues[]={-128,-1,0,1,127};
sl@0
   405
const TSelectTest TypeInt8::KTests[]=
sl@0
   406
	{
sl@0
   407
	{_S("IS NULL"),ROW(0)},
sl@0
   408
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   409
	{_S("=0"),ROW(3)},
sl@0
   410
	{_S("=-1"),ROW(2)},
sl@0
   411
	{_S("<2"),ROWS(1,4)},
sl@0
   412
	{_S(">=-128"),ALL_ROWS},
sl@0
   413
	{_S("<128"),ALL_ROWS},
sl@0
   414
	{_S("<>1"),ALL_ROWS-ROW(4)}
sl@0
   415
	};
sl@0
   416
sl@0
   417
struct TypeInt16
sl@0
   418
	{
sl@0
   419
public:
sl@0
   420
	static const TText* const KType;
sl@0
   421
	static const TInt KValues[];
sl@0
   422
	static const TSelectTest KTests[];
sl@0
   423
	};
sl@0
   424
const TText* const TypeInt16::KType=_S("SMALLINT");
sl@0
   425
const TInt TypeInt16::KValues[]={-32768,-32767,-1,0,1,32766,32767};
sl@0
   426
const TSelectTest TypeInt16::KTests[]=
sl@0
   427
	{
sl@0
   428
	{_S("IS NULL"),ROW(0)},
sl@0
   429
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   430
	{_S("=0"),ROW(4)},
sl@0
   431
	{_S("<>0"),ALL_ROWS-ROW(4)},
sl@0
   432
	{_S("=-1"),ROW(3)},
sl@0
   433
	{_S("<2"),ROWS(1,5)},
sl@0
   434
	{_S(">=-40000"),ALL_ROWS},
sl@0
   435
	{_S("<32766"),ROWS(1,5)},
sl@0
   436
	{_S("=40"),NO_ROWS}
sl@0
   437
	};
sl@0
   438
sl@0
   439
struct TypeInt32
sl@0
   440
	{
sl@0
   441
public:
sl@0
   442
	static const TText* const KType;
sl@0
   443
	static const TInt KValues[];
sl@0
   444
	static const TSelectTest KTests[];
sl@0
   445
	};
sl@0
   446
const TText* const TypeInt32::KType=_S("INTEGER");
sl@0
   447
const TInt TypeInt32::KValues[]={0x80000000/*-2147483648*/,-2147483647,-1,0,1,2147483646,2147483647};
sl@0
   448
const TSelectTest TypeInt32::KTests[]=
sl@0
   449
	{
sl@0
   450
	{_S("IS NULL"),ROW(0)},
sl@0
   451
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   452
	{_S("=0"),ROW(4)},
sl@0
   453
	{_S("<>0"),ALL_ROWS-ROW(4)},
sl@0
   454
	{_S("=-1"),ROW(3)},
sl@0
   455
	{_S("<2"),ROWS(1,5)},
sl@0
   456
	{_S(">=-2147483648"),ALL_ROWS},
sl@0
   457
	{_S("<2147483646"),ROWS(1,5)},
sl@0
   458
	{_S(">2147483647"),NO_ROWS},
sl@0
   459
	{_S("=40"),NO_ROWS}
sl@0
   460
	};
sl@0
   461
sl@0
   462
struct TypeInt64
sl@0
   463
	{
sl@0
   464
public:
sl@0
   465
	static const TText* const KType;
sl@0
   466
	static const TInt64 KValues[];
sl@0
   467
	static const TSelectTest KTests[];
sl@0
   468
	};
sl@0
   469
const TText* const TypeInt64::KType=_S("BIGINT");
sl@0
   470
const TInt64 TypeInt64::KValues[]=
sl@0
   471
	{
sl@0
   472
	MAKE_TINT64(0x80000000, 0x00000000), // min int64
sl@0
   473
	_LINT64(-4294967296),
sl@0
   474
	TInt(0x80000000),			// -2147483648!
sl@0
   475
	-1,
sl@0
   476
	0u,
sl@0
   477
	1u,
sl@0
   478
	2147483647u,
sl@0
   479
	_LINT64(2147483648),
sl@0
   480
	_LINT64(4294967295),
sl@0
   481
	_LINT64(4294967296),
sl@0
   482
	_LINT64(9223372036854775807)		// max int64
sl@0
   483
	};
sl@0
   484
const TSelectTest TypeInt64::KTests[]=
sl@0
   485
	{
sl@0
   486
	{_S("IS NULL"),ROW(0)},
sl@0
   487
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   488
	{_S("=0"),ROW(5)},
sl@0
   489
	{_S("<>0"),ALL_ROWS-ROW(5)},
sl@0
   490
	{_S("=-1"),ROW(4)},
sl@0
   491
	{_S("<2"),ROWS(1,6)},
sl@0
   492
	{_S(">=-9223372036854775808"),ALL_ROWS},
sl@0
   493
	{_S("<4294967296"),ROWS(1,9)},
sl@0
   494
	{_S(">9223372036854775806"),ROW(11)},
sl@0
   495
	{_S("=40"),NO_ROWS}
sl@0
   496
	};
sl@0
   497
sl@0
   498
struct TypeReal32
sl@0
   499
	{
sl@0
   500
public:
sl@0
   501
	static const TText* const KType;
sl@0
   502
	static const TReal32 KValues[];
sl@0
   503
	static const TSelectTest KTests[];
sl@0
   504
	};
sl@0
   505
const TText* const TypeReal32::KType=_S("REAL");
sl@0
   506
const TReal32 TypeReal32::KValues[]=
sl@0
   507
	{
sl@0
   508
	-KMaxTReal32,
sl@0
   509
	-1.0f,
sl@0
   510
	-KMinTReal32,
sl@0
   511
	0.0f,
sl@0
   512
	KMinTReal32,
sl@0
   513
	1.0f,
sl@0
   514
	KMaxTReal32
sl@0
   515
	};
sl@0
   516
const TSelectTest TypeReal32::KTests[]=
sl@0
   517
	{
sl@0
   518
	{_S("IS NULL"),ROW(0)},
sl@0
   519
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   520
	{_S("=0"),ROW(4)},
sl@0
   521
	{_S("<>0.0"),ALL_ROWS-ROW(4)},
sl@0
   522
	{_S("=-1"),ROW(2)},
sl@0
   523
	{_S("<2e1"),ROWS(1,6)},
sl@0
   524
	{_S(">=-100000000000000"),ROWS(2,7)},
sl@0
   525
	{_S("<1e-36"),ROWS(1,5)},
sl@0
   526
	{_S(">1e15"),ROW(7)},
sl@0
   527
	{_S("=.5"),NO_ROWS},
sl@0
   528
	{_S("<=-.0"),ROWS(1,4)},
sl@0
   529
	{_S("<1e40"),ALL_ROWS}
sl@0
   530
	};
sl@0
   531
sl@0
   532
struct TypeReal64
sl@0
   533
	{
sl@0
   534
public:
sl@0
   535
	static const TText* const KType;
sl@0
   536
	static const TReal64 KValues[];
sl@0
   537
	static const TSelectTest KTests[];
sl@0
   538
	};
sl@0
   539
const TText* const TypeReal64::KType=_S("DOUBLE");
sl@0
   540
const TReal64 TypeReal64::KValues[]=
sl@0
   541
	{
sl@0
   542
	-KMaxTReal64,
sl@0
   543
	-1.0f,
sl@0
   544
	-KMinTReal64,
sl@0
   545
	0.0f,
sl@0
   546
	KMinTReal64,
sl@0
   547
	1.0f,
sl@0
   548
	KMaxTReal64
sl@0
   549
	};
sl@0
   550
const TSelectTest TypeReal64::KTests[]=
sl@0
   551
	{
sl@0
   552
	{_S("IS NULL"),ROW(0)},
sl@0
   553
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   554
	{_S("=0"),ROW(4)},
sl@0
   555
	{_S("<>0"),ALL_ROWS-ROW(4)},
sl@0
   556
	{_S("=-1"),ROW(2)},
sl@0
   557
	{_S("<2"),ROWS(1,6)},
sl@0
   558
	{_S(">=-100000000000000"),ROWS(2,7)},
sl@0
   559
	{_S("<1e-300"),ROWS(1,5)},
sl@0
   560
	{_S(">1e15"),ROW(7)},
sl@0
   561
	{_S("=.5"),NO_ROWS},
sl@0
   562
	{_S("<=0"),ROWS(1,4)},
sl@0
   563
	{_S("<1e40"),ROWS(1,6)}
sl@0
   564
	};
sl@0
   565
sl@0
   566
struct TypeTime
sl@0
   567
	{
sl@0
   568
public:
sl@0
   569
	static const TText* const KType;
sl@0
   570
	static const TTime KValues[];
sl@0
   571
	static const TSelectTest KTests[];
sl@0
   572
	};
sl@0
   573
const TText* const TypeTime::KType=_S("TIME");
sl@0
   574
const TTime TypeTime::KValues[]=
sl@0
   575
	{
sl@0
   576
	TInt64(0u),				// zero date/time
sl@0
   577
	_L(":085815"),			// 8:58:15am
sl@0
   578
	_L("19181010:110000"),	// 11am, 11 Nov 1918
sl@0
   579
	_L("19750226:"),		// midnight, 27 Mar 1975
sl@0
   580
	_L("19961130:235959"),	// 11:59:59pm, 31 Dec 1996
sl@0
   581
	_L("19970000:"),		// midnight, 1 Jan 1997
sl@0
   582
	_L("19970611:210000"),	// 9pm, 12 July 1997
sl@0
   583
	_L("19980309:214500"),	// 9:45pm, 10 April 1998
sl@0
   584
	_L("20700608:")			// midnight, 9 July 2070
sl@0
   585
	};
sl@0
   586
const TSelectTest TypeTime::KTests[]=
sl@0
   587
	{
sl@0
   588
	{_S("IS NULL"),ROW(0)},
sl@0
   589
	{_S("IS NOT NULL"),ALL_ROWS},
sl@0
   590
	{_S("=#12am#"),ROW(1)},
sl@0
   591
	{_S("<#Jan 1 2100#"),ALL_ROWS},
sl@0
   592
	{_S("<>#31/12/1996 23:59:59#"),ALL_ROWS-ROW(5)},
sl@0
   593
	{_S("<#9a#"),ROWS(1,2)},
sl@0
   594
	{_S(">=#11:59:59pm, 31 Dec 1996#"),ROWS(5,9)},
sl@0
   595
	{_S("=#9:45pm 10 April, 1998#"),ROW(8)},
sl@0
   596
	{_S("=#8:58:15#"),ROW(2)}
sl@0
   597
	};
sl@0
   598
sl@0
   599
struct TypeText
sl@0
   600
	{
sl@0
   601
public:
sl@0
   602
	static const TText* const KType;
sl@0
   603
	static const TText* const KValues[];
sl@0
   604
	static TSelectTest KTests[];
sl@0
   605
	};
sl@0
   606
const TText* const TypeText::KType=_S("VARCHAR(100)");
sl@0
   607
const TText* const TypeText::KValues[]=
sl@0
   608
	{
sl@0
   609
	_S(""),					// this should be equivalent to NULL
sl@0
   610
	_S("a"),
sl@0
   611
	_S("aa"),
sl@0
   612
	_S("aba"),
sl@0
   613
	_S("like"),
sl@0
   614
	_S("abcdefghijklmnopqrstuvwxyzlike"),
sl@0
   615
	_S("likeabcdefghijklmnopqrstuvwxyz"),
sl@0
   616
	_S("abcdefghijklmnopqrstuvwxyzlikeabcdefghijklmnopqrstuvwxyz"),
sl@0
   617
	_S("abcdefghijklmnopqrstuvwxyzliveabcdefghijklmnopqrstuvwxyz"),
sl@0
   618
	_S("l'ke"),
sl@0
   619
	_S("'Tis")
sl@0
   620
	};
sl@0
   621
TSelectTest TypeText::KTests[]=
sl@0
   622
	{
sl@0
   623
	{_S("IS NULL"),ROWS(0,1)},
sl@0
   624
	{_S("IS NOT NULL"),ALL_ROWS-ROW(1)},
sl@0
   625
//
sl@0
   626
	{_S("=''"),ROWS(0,1)},					// equivalent to IS NULL
sl@0
   627
	{_S("<>''"),ALL_ROWS-ROW(1)},			// equivalent to IS NOT NULL
sl@0
   628
	{_S(">''"),ALL_ROWS-ROW(1)},			// equivalent to IS NOT NULL
sl@0
   629
	{_S("<''"),NO_ROWS},					// expression is trivially false
sl@0
   630
	{_S("<=''"),ROWS(0,1)},
sl@0
   631
	{_S(">=''"),ALL_ROWS+ROW(0)},			// expression is trivially true
sl@0
   632
//
sl@0
   633
	{_S("LIKE ''"),ROWS(0,1)},			// synonomous with IS NULL
sl@0
   634
	{_S("NOT LIKE ''"),ALL_ROWS-ROW(1)},
sl@0
   635
	{_S("LIKE '?*'"),ALL_ROWS-ROW(1)},	// synonomous with IS NOT NULL
sl@0
   636
	{_S("NOT LIKE '?*'"),ROWS(0,1)},
sl@0
   637
	{_S("LIKE '*'"),ALL_ROWS+ROW(0)},	// trivially true
sl@0
   638
	{_S("NOT LIKE '*'"),NO_ROWS},
sl@0
   639
//
sl@0
   640
	{_S("='a'"),ROW(2)},
sl@0
   641
	{_S("<'ab'"),ROWS(0,3)+ROW(11)},
sl@0
   642
	{_S("<'abc'"),ROWS(0,4)+ROW(11)},
sl@0
   643
	{_S("<'b'"),ROWS(0,4)+ROW(6)+ROWS(8,9)+ROW(11)},
sl@0
   644
	{_S(">'abc'"),ROWS(5,10)},
sl@0
   645
	{_S("='like'"),ROW(5)},
sl@0
   646
	{_S("='l''ke'"),ROW(10)},
sl@0
   647
	{_S("='''Tis'"),ROW(11)},
sl@0
   648
//
sl@0
   649
	{_S("LIKE 'a'"),ROW(2)},
sl@0
   650
	{_S("LIKE 'a*'"),ROWS(2,4)+ROW(6)+ROWS(8,9)},
sl@0
   651
	{_S("LIKE '*a'"),ROWS(2,4)},
sl@0
   652
	{_S("LIKE 'a*a'"),ROWS(3,4)},
sl@0
   653
	{_S("LIKE '*a*'"),ROWS(2,4)+ROWS(6,9)},
sl@0
   654
//
sl@0
   655
	{_S("LIKE 'like'"),ROW(5)},
sl@0
   656
	{_S("LIKE 'l?ke'"),ROW(5)+ROW(10)},
sl@0
   657
	{_S("LIKE 'like*'"),ROW(5)+ROW(7)},
sl@0
   658
	{_S("LIKE '*like'"),ROWS(5,6)},
sl@0
   659
	{_S("LIKE '*like*'"),ROWS(5,8)},
sl@0
   660
	{_S("LIKE '*likeit*'"),NO_ROWS},
sl@0
   661
	{_S("LIKE '*li?e*'"),ROWS(5,9)},
sl@0
   662
	{_S("LIKE '?*li?e*'"),ROW(6)+ROWS(8,9)},
sl@0
   663
	{_S("LIKE '*li?e*?'"),ROWS(7,9)},
sl@0
   664
	{_S("LIKE '?*li?e*?'"),ROWS(8,9)},
sl@0
   665
	{_S("LIKE '*?k?*'"),ROWS(5,10)},
sl@0
   666
	{_S("LIKE '*?i?e*'"),ROWS(5,9)},
sl@0
   667
//
sl@0
   668
	{_S("LIKE '*e*'"),ROWS(5,10)},
sl@0
   669
	{_S("LIKE '*z*k*e*'"),ROW(6)+ROW(8)},
sl@0
   670
	{_S("LIKE '\?\?k?'"),ROW(5)+ROW(10)},
sl@0
   671
	{_S("LIKE '\?\?k*'"),ROW(5)+ROW(7)+ROW(10)},
sl@0
   672
	{_S("LIKE '*''*'"),ROWS(10,11)},
sl@0
   673
	{_S("LIKE '?''\?\?'"),ROW(10)},
sl@0
   674
	{_S("LIKE '?'"),ROW(2)},
sl@0
   675
	{_S("LIKE '\?\?\?\?'"),ROW(5)+ROWS(10,11)},
sl@0
   676
	{_S("LIKE '\?\?*\?\?'"),ROWS(5,11)},
sl@0
   677
	{_S("LIKE '''*'"),ROW(11)}
sl@0
   678
	};
sl@0
   679
sl@0
   680
TEMPLATE_SPECIALIZATION struct SetCol<const TText* const>
sl@0
   681
	{
sl@0
   682
	static void SetColL(TDbColNo aCol,const TAny* aVal)
sl@0
   683
		{
sl@0
   684
		TheTable.SetColL(aCol,TPtrC(*(const TText* const*)aVal));
sl@0
   685
		}
sl@0
   686
	};
sl@0
   687
TEMPLATE_SPECIALIZATION struct SetCol<const TText*>
sl@0
   688
	{
sl@0
   689
	static void SetColL(TDbColNo aCol,const TAny* aVal)
sl@0
   690
		{
sl@0
   691
		TheTable.SetColL(aCol,TPtrC(*(const TText* const*)aVal));
sl@0
   692
		}
sl@0
   693
	};
sl@0
   694
sl@0
   695
struct TypeLongText
sl@0
   696
	{
sl@0
   697
public:
sl@0
   698
	static const TText* const KType;
sl@0
   699
	};
sl@0
   700
const TText* const TypeLongText::KType=_S("LONG VARCHAR");
sl@0
   701
sl@0
   702
class TestPredicate2 : public TestPredicateBase
sl@0
   703
	{
sl@0
   704
public:
sl@0
   705
	static void RunL();
sl@0
   706
	};
sl@0
   707
sl@0
   708
// write rows equivalent to TypeText and use its tests
sl@0
   709
void TestPredicate2::RunL()
sl@0
   710
	{
sl@0
   711
	Create(TypeLongText::KType);
sl@0
   712
	TBuf<1022> fill=_S("abcdefghijklmnopqrstuvqxyz");
sl@0
   713
	fill.AppendFill('.',fill.MaxLength()-fill.Length());
sl@0
   714
sl@0
   715
	for (TInt row=0;row<=TInt(elementsof(TypeText::KValues));++row)
sl@0
   716
		{
sl@0
   717
		TheTable.InsertL();
sl@0
   718
		TheTable.SetColL(1,row);
sl@0
   719
		if (row>0)
sl@0
   720
			{
sl@0
   721
			RDbColWriteStream blob;
sl@0
   722
			blob.OpenLC(TheTable,2);
sl@0
   723
			switch (row)
sl@0
   724
				{
sl@0
   725
			case 0:
sl@0
   726
				break;
sl@0
   727
			case 1: case 2: case 3: case 4: case 5: case 10: case 11:
sl@0
   728
				blob.WriteL(TPtrC(TypeText::KValues[row-1]));
sl@0
   729
				break;
sl@0
   730
			case 6:
sl@0
   731
				blob.WriteL(fill);
sl@0
   732
				blob.WriteL(_L("like"));
sl@0
   733
				break;
sl@0
   734
			case 7:
sl@0
   735
				blob.WriteL(_L("like"));
sl@0
   736
				blob.WriteL(fill);
sl@0
   737
				break;
sl@0
   738
			case 8:
sl@0
   739
				blob.WriteL(fill);
sl@0
   740
				blob.WriteL(_L("like"));
sl@0
   741
				blob.WriteL(fill);
sl@0
   742
				break;
sl@0
   743
			case 9:
sl@0
   744
				blob.WriteL(fill);
sl@0
   745
				blob.WriteL(_L("live"));
sl@0
   746
				blob.WriteL(fill);
sl@0
   747
				break;
sl@0
   748
				}
sl@0
   749
			blob.CommitL();
sl@0
   750
			CleanupStack::PopAndDestroy();
sl@0
   751
			}
sl@0
   752
		TheTable.PutL();
sl@0
   753
		}
sl@0
   754
	TheTable.Close();
sl@0
   755
	TInt r=TheDatabase.Commit();
sl@0
   756
	TEST2(r, KErrNone);
sl@0
   757
	TestViewL(TypeText::KTests,elementsof(TypeText::KTests),elementsof(TypeText::KValues));
sl@0
   758
	CDbKey& key=*CDbKey::NewLC();
sl@0
   759
	key.AddL(TDbKeyCol(_L("Test"),120));
sl@0
   760
	r=TheDatabase.CreateIndex(_L("Key"),_L("Compare"),key);
sl@0
   761
	TEST2(r, KErrNone);
sl@0
   762
	CleanupStack::PopAndDestroy();
sl@0
   763
	TestViewL(TypeText::KTests,elementsof(TypeText::KTests),elementsof(TypeText::KValues));
sl@0
   764
	r=TheDatabase.Execute(_L("DROP TABLE Compare"));
sl@0
   765
	TEST2(r, KErrNone);
sl@0
   766
	}
sl@0
   767
sl@0
   768
/**
sl@0
   769
* Utility for DEF063276 fix.
sl@0
   770
*/
sl@0
   771
sl@0
   772
#ifndef __TOOLS2__
sl@0
   773
_LIT(KTypeTextKTests44, "Z:\\test\\data\\typetextktests44.dat");
sl@0
   774
_LIT(KTypeTextKTests46, "Z:\\test\\data\\typetextktests46.dat");
sl@0
   775
_LIT(KTypeTextKTests47, "Z:\\test\\data\\typetextktests47.dat");
sl@0
   776
#else
sl@0
   777
_LIT(KTypeTextKTests44, ".\\dbms-tst\\typetextktests44.dat");
sl@0
   778
_LIT(KTypeTextKTests46, ".\\dbms-tst\\typetextktests46.dat");
sl@0
   779
_LIT(KTypeTextKTests47, ".\\dbms-tst\\typetextktests47.dat");
sl@0
   780
#endif
sl@0
   781
sl@0
   782
static void ReadDesc(TDes& aDes, const TDesC& aFilename, RFs& aFs)
sl@0
   783
	{
sl@0
   784
	RFile file;
sl@0
   785
	TInt err = file.Open(aFs, aFilename, EFileRead);
sl@0
   786
	TheTest(err == KErrNone);
sl@0
   787
	CleanupClosePushL(file);
sl@0
   788
	
sl@0
   789
	TPtr8 ptr(reinterpret_cast<TUint8*>(const_cast<TUint16*>(aDes.Ptr())), aDes.MaxSize());
sl@0
   790
	err = file.Read(ptr);
sl@0
   791
	TheTest(err == KErrNone);
sl@0
   792
	aDes.SetLength(ptr.Length() / sizeof(TText));
sl@0
   793
	CleanupStack::PopAndDestroy(&file);
sl@0
   794
	}
sl@0
   795
sl@0
   796
/**
sl@0
   797
@SYMTestCaseID          SYSLIB-DBMS-CT-0633
sl@0
   798
@SYMTestCaseDesc        Tests the Predicate operators for all types
sl@0
   799
@SYMTestPriority        Medium
sl@0
   800
@SYMTestActions         Attempt to check with different types
sl@0
   801
@SYMTestExpectedResults Test must not fail
sl@0
   802
@SYMREQ                 REQ0000
sl@0
   803
*/
sl@0
   804
LOCAL_C void TestPredicatesL()
sl@0
   805
	{
sl@0
   806
	TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0633 init "));
sl@0
   807
	CreateDatabase();
sl@0
   808
	TestPredicate<TypeBit>::Run();
sl@0
   809
	TestPredicate<TypeUint8>::Run();
sl@0
   810
	TestPredicate<TypeUint16>::Run();
sl@0
   811
	TestPredicate<TypeUint32>::Run();
sl@0
   812
	TestPredicate<TypeInt8>::Run();
sl@0
   813
	TestPredicate<TypeInt16>::Run();
sl@0
   814
	TestPredicate<TypeInt32>::Run();
sl@0
   815
	TestPredicate<TypeInt64>::Run();
sl@0
   816
	TestPredicate<TypeReal32>::Run();
sl@0
   817
	TestPredicate<TypeReal64>::Run();
sl@0
   818
	TestPredicate<TypeTime>::Run();
sl@0
   819
sl@0
   820
	/**
sl@0
   821
	* Work around for DEF063276.
sl@0
   822
	* These literals are now loaded from Z:\test\data\TypeTextKTests44.dat, 
sl@0
   823
	* Z:\test\data\TypeTextKTests44.dat and Z:\test\data\TypeTextKTests44.dat respectively.
sl@0
   824
	* Bullseye Coverage corrupts these literals to avoid this they are stored in files as to not be touched by Bullseye Coverage.
sl@0
   825
	*/	
sl@0
   826
	
sl@0
   827
	TBuf<16> buf44;
sl@0
   828
	ReadDesc(buf44, KTypeTextKTests44, TheFs);	
sl@0
   829
	TypeText::KTests[44].iSearchCondition = const_cast<TText*>(buf44.PtrZ());
sl@0
   830
	
sl@0
   831
	TBuf<32> buf46(TypeText::KTests[46].iSearchCondition);
sl@0
   832
	ReadDesc(buf46, KTypeTextKTests46, TheFs);	
sl@0
   833
	TypeText::KTests[46].iSearchCondition = const_cast<TText*>(buf46.PtrZ());
sl@0
   834
	
sl@0
   835
	TBuf<32> buf47(TypeText::KTests[47].iSearchCondition);
sl@0
   836
	ReadDesc(buf47, KTypeTextKTests47, TheFs);	
sl@0
   837
	TypeText::KTests[47].iSearchCondition = const_cast<TText*>(buf47.PtrZ());
sl@0
   838
	
sl@0
   839
	// End fix.
sl@0
   840
	
sl@0
   841
	TestPredicate<TypeText>::Run();
sl@0
   842
	TestPredicate2::RunL();
sl@0
   843
	CloseDatabase();
sl@0
   844
	TheTest.End();
sl@0
   845
	}
sl@0
   846
sl@0
   847
/**
sl@0
   848
@SYMTestCaseID          SYSLIB-DBMS-CT-0634
sl@0
   849
@SYMTestCaseDesc        DML Query test
sl@0
   850
                        Test for RDbNamedDatabase::Execute() function
sl@0
   851
@SYMTestPriority        Medium
sl@0
   852
@SYMTestActions         Tests for CREATE TABLE,CREATE UNIQUE INDEX,INSET INTO,UPDATE,DELETE,DROP queries
sl@0
   853
@SYMTestExpectedResults Test must not fail
sl@0
   854
@SYMREQ                 REQ0000
sl@0
   855
*/
sl@0
   856
LOCAL_C void TestDML()
sl@0
   857
	{
sl@0
   858
	TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0634 init "));
sl@0
   859
	Connect();
sl@0
   860
	ShareDatabase();
sl@0
   861
	TInt r=TheDatabase.Execute(_L("CREATE TABLE test (ID INTEGER NOT NULL,SALARY DOUBLE)"));
sl@0
   862
	TEST2(r, KErrNone);
sl@0
   863
	r=TheDatabase.Execute(_L("CREATE UNIQUE INDEX key ON test (ID)"));
sl@0
   864
	TEST2(r, KErrNone);
sl@0
   865
	
sl@0
   866
	TheTest.Next(_L("insert-statements"));
sl@0
   867
	r=TheDatabase.Execute(_L("INSERT INTO test VALUES (0,0)"));
sl@0
   868
	TEST(r==1);
sl@0
   869
	r=TheDatabase.Execute(_L("INSERT INTO test (ID) VALUES (1)"));
sl@0
   870
	TEST(r==1);
sl@0
   871
	r=TheDatabase.Execute(_L("INSERT INTO test (SALARY,ID) VALUES (20.4,2)"));
sl@0
   872
	TEST(r==1);
sl@0
   873
	
sl@0
   874
	TheTest.Next(_L("update-statements"));
sl@0
   875
	r=TheDatabase.Execute(_L("UPDATE test SET SALARY=30000 WHERE ID=1"));
sl@0
   876
	TEST(r==1);
sl@0
   877
	
sl@0
   878
	TheTest.Next(_L("delete-statements"));
sl@0
   879
	r=TheDatabase.Execute(_L("DELETE FROM test WHERE SALARY<40"));
sl@0
   880
	TEST(r==2);
sl@0
   881
	r=TheDatabase.Execute(_L("DELETE FROM test"));
sl@0
   882
	TEST(r==1);
sl@0
   883
	r=TheDatabase.Execute(_L("DROP TABLE test"));
sl@0
   884
	TEST2(r, KErrNone);
sl@0
   885
//
sl@0
   886
	TheTest.Next(_L("larger table"));
sl@0
   887
	r=TheDatabase.Execute(_L("CREATE TABLE test (ID COUNTER,DATA INTEGER)"));
sl@0
   888
	TEST2(r, KErrNone);
sl@0
   889
	
sl@0
   890
	TheTest.Next(_L("insert"));
sl@0
   891
	TheDatabase.Begin();
sl@0
   892
	TBuf<256> sql;
sl@0
   893
	for (TInt ii=0;ii<100;++ii)
sl@0
   894
		{
sl@0
   895
		sql.Format(_L("INSERT INTO test (DATA) VALUES (%D)"),100-ii);
sl@0
   896
		r=TheDatabase.Execute(sql);
sl@0
   897
		TEST(r==1);
sl@0
   898
		}
sl@0
   899
	r=TheDatabase.Commit();
sl@0
   900
	TEST2(r, KErrNone);
sl@0
   901
	
sl@0
   902
	TheTest.Next(_L("update"));
sl@0
   903
	r=TheDatabase.Execute(_L("UPDATE test SET DATA=200 WHERE ID>=40 AND ID<60"));
sl@0
   904
	TEST(r==20);
sl@0
   905
	
sl@0
   906
	TheTest.Next(_L("delete"));
sl@0
   907
	r=TheDatabase.Execute(_L("DELETE FROM test WHERE DATA>90"));
sl@0
   908
	TEST(r==30);
sl@0
   909
	
sl@0
   910
	TheTest.Next(_L("update"));
sl@0
   911
	r=TheDatabase.Execute(_L("UPDATE test SET DATA=-1"));
sl@0
   912
	TEST(r==70);
sl@0
   913
	
sl@0
   914
	TheTest.Next(_L("delete"));
sl@0
   915
	r=TheDatabase.Execute(_L("DELETE FROM test"));
sl@0
   916
	TEST(r==70);
sl@0
   917
	r=TheDatabase.Execute(_L("DROP TABLE test"));
sl@0
   918
	TEST2(r, KErrNone);
sl@0
   919
	CloseDatabase();
sl@0
   920
	Disconnect();
sl@0
   921
	TheTest.End();
sl@0
   922
	}
sl@0
   923
sl@0
   924
/**
sl@0
   925
@SYMTestCaseID          SYSLIB-DBMS-CT-0635
sl@0
   926
@SYMTestCaseDesc        DBMS SQL parsing and execution tests.Tests for database index order
sl@0
   927
						Test for RDbNamedDatabase::Execute() function
sl@0
   928
@SYMTestPriority        Medium
sl@0
   929
@SYMTestActions         Tests for order by index
sl@0
   930
@SYMTestExpectedResults Test must not fail
sl@0
   931
@SYMREQ                 REQ0000
sl@0
   932
*/
sl@0
   933
LOCAL_C void TestOrderByL()
sl@0
   934
	{
sl@0
   935
	static const TReal TestDataSalary[]={10,34000,15000,53200,17800,240000};
sl@0
   936
	static const TText* const TestDataNames[]={_S("gopher"),_S("james '007' bond"),_S("moneypenny"),_S("Q"),_S("james '007' bond"),_S("M")};
sl@0
   937
//
sl@0
   938
	TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0635 init "));
sl@0
   939
	Connect();
sl@0
   940
	ShareDatabase();
sl@0
   941
	TheDatabase.Begin();
sl@0
   942
	TInt r=TheDatabase.Execute(_L("CREATE TABLE test (ID INTEGER NOT NULL,SALARY DOUBLE,NAME VARCHAR)"));
sl@0
   943
	TEST2(r, KErrNone);
sl@0
   944
	r=TheDatabase.Execute(_L("CREATE UNIQUE INDEX key ON test (ID)"));
sl@0
   945
	TEST2(r, KErrNone);
sl@0
   946
	
sl@0
   947
	TheTest.Next(_L("insert data"));
sl@0
   948
	r=TheView.Prepare(TheDatabase,_L("SELECT ID,SALARY,NAME FROM test"),TheView.EInsertOnly);
sl@0
   949
	TEST2(r, KErrNone);
sl@0
   950
	TInt ii;
sl@0
   951
	for (ii=0;ii<6;++ii)
sl@0
   952
		{
sl@0
   953
		TheView.InsertL();
sl@0
   954
		TheView.SetColL(1,6-ii);
sl@0
   955
		TheView.SetColL(2,TestDataSalary[ii]);
sl@0
   956
		TheView.SetColL(3,TPtrC(TestDataNames[ii]));
sl@0
   957
		TheView.PutL();
sl@0
   958
		}
sl@0
   959
	r=TheDatabase.Commit();
sl@0
   960
	TEST2(r, KErrNone);
sl@0
   961
	TheView.Close();
sl@0
   962
	
sl@0
   963
	TheTest.Next(_L("Order by <index>"));
sl@0
   964
	// test the index is used here
sl@0
   965
	r=TheView.Prepare(TheDatabase,_L("SELECT ID FROM test ORDER BY ID"));
sl@0
   966
	TEST2(r, KErrNone);
sl@0
   967
	TEST(!TheView.Unevaluated());
sl@0
   968
	TInt c=0;
sl@0
   969
	if (TheView.FirstL())
sl@0
   970
		{
sl@0
   971
		++c;
sl@0
   972
		TheView.GetL();
sl@0
   973
		TInt last=TheView.ColInt(1);
sl@0
   974
		while (TheView.NextL())
sl@0
   975
			{
sl@0
   976
			++c;
sl@0
   977
			TheView.GetL();
sl@0
   978
			TInt v=TheView.ColInt(1);
sl@0
   979
			TEST(v>last);
sl@0
   980
			last=v;
sl@0
   981
			}
sl@0
   982
		}
sl@0
   983
	TEST(c==6);
sl@0
   984
	TEST(c==TheView.CountL());
sl@0
   985
	TheView.Close();
sl@0
   986
	
sl@0
   987
	TheTest.Next(_L("Order by <no-index> 1"));
sl@0
   988
	// test that no index is used here
sl@0
   989
	r=TheView.Prepare(TheDatabase,_L("SELECT SALARY FROM test ORDER BY SALARY"));
sl@0
   990
	TEST2(r, KErrNone);
sl@0
   991
	TEST(TheView.Unevaluated());
sl@0
   992
	r=TheView.EvaluateAll();
sl@0
   993
	TEST2(r, KErrNone);
sl@0
   994
	c=0;
sl@0
   995
	if (TheView.FirstL())
sl@0
   996
		{
sl@0
   997
		++c;
sl@0
   998
		TheView.GetL();
sl@0
   999
		TReal last=TheView.ColReal(1);
sl@0
  1000
		while (TheView.NextL())
sl@0
  1001
			{
sl@0
  1002
			++c;
sl@0
  1003
			TheView.GetL();
sl@0
  1004
			TReal v=TheView.ColReal(1);
sl@0
  1005
			TEST(v>=last);
sl@0
  1006
			last=v;
sl@0
  1007
			}
sl@0
  1008
		}
sl@0
  1009
	TEST(c==6);
sl@0
  1010
	TEST(c==TheView.CountL());
sl@0
  1011
	TheView.Close();
sl@0
  1012
	
sl@0
  1013
	TheTest.Next(_L("Order by <no-index> 2"));
sl@0
  1014
	// test that no index is used here
sl@0
  1015
	r=TheView.Prepare(TheDatabase,_L("SELECT SALARY FROM test ORDER BY SALARY,NAME"));
sl@0
  1016
	TEST2(r, KErrNone);
sl@0
  1017
	TEST(TheView.Unevaluated());
sl@0
  1018
	r=TheView.EvaluateAll();
sl@0
  1019
	TEST2(r, KErrNone);
sl@0
  1020
	c=0;
sl@0
  1021
	if (TheView.FirstL())
sl@0
  1022
		{
sl@0
  1023
		++c;
sl@0
  1024
		TheView.GetL();
sl@0
  1025
		TReal last=TheView.ColReal(1);
sl@0
  1026
		while (TheView.NextL())
sl@0
  1027
			{
sl@0
  1028
			++c;
sl@0
  1029
			TheView.GetL();
sl@0
  1030
			TReal v=TheView.ColReal(1);
sl@0
  1031
			TEST(v>=last);
sl@0
  1032
			last=v;
sl@0
  1033
			}
sl@0
  1034
		}
sl@0
  1035
	TEST(c==6);
sl@0
  1036
	TEST(c==TheView.CountL());
sl@0
  1037
	TheView.Close();
sl@0
  1038
	
sl@0
  1039
	TheTest.Next(_L("Order by <no-index> 3"));
sl@0
  1040
	// test that no index is used here
sl@0
  1041
	r=TheView.Prepare(TheDatabase,_L("SELECT NAME FROM test ORDER BY NAME"));
sl@0
  1042
	TEST2(r, KErrNone);
sl@0
  1043
	TEST(TheView.Unevaluated());
sl@0
  1044
	r=TheView.EvaluateAll();
sl@0
  1045
	TEST2(r, KErrNone);
sl@0
  1046
	c=0;
sl@0
  1047
	if (TheView.FirstL())
sl@0
  1048
		{
sl@0
  1049
		++c;
sl@0
  1050
		TheView.GetL();
sl@0
  1051
		TBuf<50> last=TheView.ColDes(1);
sl@0
  1052
		while (TheView.NextL())
sl@0
  1053
			{
sl@0
  1054
			++c;
sl@0
  1055
			TheView.GetL();
sl@0
  1056
			TPtrC v=TheView.ColDes(1);
sl@0
  1057
			TEST(v>=last);
sl@0
  1058
			last=v;
sl@0
  1059
			}
sl@0
  1060
		}
sl@0
  1061
	TEST(c==6);
sl@0
  1062
	TEST(c==TheView.CountL());
sl@0
  1063
	TheView.Close();
sl@0
  1064
	
sl@0
  1065
	TheTest.Next(_L("Order by <no-index> 4"));
sl@0
  1066
	// test that no index is used here
sl@0
  1067
	r=TheView.Prepare(TheDatabase,_L("SELECT NAME FROM test ORDER BY NAME,SALARY"));
sl@0
  1068
	TEST2(r, KErrNone);
sl@0
  1069
	TEST(TheView.Unevaluated());
sl@0
  1070
	r=TheView.EvaluateAll();
sl@0
  1071
	TEST2(r, KErrNone);
sl@0
  1072
	c=0;
sl@0
  1073
	if (TheView.FirstL())
sl@0
  1074
		{
sl@0
  1075
		++c;
sl@0
  1076
		TheView.GetL();
sl@0
  1077
		TBuf<50> last=TheView.ColDes(1);
sl@0
  1078
		while (TheView.NextL())
sl@0
  1079
			{
sl@0
  1080
			++c;
sl@0
  1081
			TheView.GetL();
sl@0
  1082
			TPtrC v=TheView.ColDes(1);
sl@0
  1083
			TEST(v>=last);
sl@0
  1084
			last=v;
sl@0
  1085
			}
sl@0
  1086
		}
sl@0
  1087
	TEST(c==6);
sl@0
  1088
	TEST(c==TheView.CountL());
sl@0
  1089
	TheView.Close();
sl@0
  1090
	
sl@0
  1091
	TheTest.Next(_L("Order by + search <no-index>"));
sl@0
  1092
	// test that no index is used here
sl@0
  1093
	r=TheView.Prepare(TheDatabase,_L("SELECT ID,SALARY FROM test WHERE SALARY>30000 ORDER BY SALARY DESC"));
sl@0
  1094
	TEST2(r, KErrNone);
sl@0
  1095
	TEST(TheView.Unevaluated());
sl@0
  1096
	r=TheView.EvaluateAll();
sl@0
  1097
	TEST2(r, KErrNone);
sl@0
  1098
	c=0;
sl@0
  1099
	if (TheView.FirstL())
sl@0
  1100
		{
sl@0
  1101
		++c;
sl@0
  1102
		TheView.GetL();
sl@0
  1103
		TReal last=TheView.ColReal(2);
sl@0
  1104
		while (TheView.NextL())
sl@0
  1105
			{
sl@0
  1106
			++c;
sl@0
  1107
			TheView.GetL();
sl@0
  1108
			TReal v=TheView.ColReal(2);
sl@0
  1109
			TEST(v<=last);
sl@0
  1110
			last=v;
sl@0
  1111
			}
sl@0
  1112
		}
sl@0
  1113
	TEST(c==3);
sl@0
  1114
	TEST(c==TheView.CountL());
sl@0
  1115
	TheView.Close();
sl@0
  1116
//
sl@0
  1117
	CloseDatabase();
sl@0
  1118
	Disconnect();
sl@0
  1119
	
sl@0
  1120
	TheTest.Next(_L("Order by <index> Finished"));
sl@0
  1121
	TheTest.End();
sl@0
  1122
	}
sl@0
  1123
sl@0
  1124
LOCAL_C void doMain()
sl@0
  1125
	{
sl@0
  1126
	TheTest.Start(_L("Predicate tests"));
sl@0
  1127
	TRAPD(errCode, TestPredicatesL());
sl@0
  1128
	TEST2(errCode, KErrNone);
sl@0
  1129
	
sl@0
  1130
	TheTest.Next(_L("DML execution"));
sl@0
  1131
	TestDML();
sl@0
  1132
	
sl@0
  1133
	TheTest.Next(_L("ORDER BY clause"));
sl@0
  1134
	TRAP(errCode, TestOrderByL());
sl@0
  1135
	TEST2(errCode, KErrNone);
sl@0
  1136
	TheTest.End();
sl@0
  1137
	}
sl@0
  1138
sl@0
  1139
// Prepare the test directory.
sl@0
  1140
LOCAL_C void setupTestDirectory()
sl@0
  1141
    {
sl@0
  1142
	TInt r=TheFs.Connect();
sl@0
  1143
	TEST2(r, KErrNone);
sl@0
  1144
//
sl@0
  1145
	r=TheFs.MkDir(KTestDatabase);
sl@0
  1146
	TEST(r==KErrNone || r==KErrAlreadyExists);
sl@0
  1147
	}
sl@0
  1148
sl@0
  1149
// Initialise the cleanup stack.
sl@0
  1150
LOCAL_C void setupCleanup()
sl@0
  1151
    {
sl@0
  1152
	TheTrapCleanup=CTrapCleanup::New();
sl@0
  1153
	TEST(TheTrapCleanup!=NULL);
sl@0
  1154
	TRAPD(r,\
sl@0
  1155
		{\
sl@0
  1156
		for (TInt i=KTestCleanupStack;i>0;i--)\
sl@0
  1157
			CleanupStack::PushL((TAny*)0);\
sl@0
  1158
		CleanupStack::Pop(KTestCleanupStack);\
sl@0
  1159
		});
sl@0
  1160
	TEST2(r, KErrNone);
sl@0
  1161
	}
sl@0
  1162
sl@0
  1163
// Test streaming conversions.
sl@0
  1164
GLDEF_C TInt E32Main()
sl@0
  1165
    {
sl@0
  1166
	TheTest.Title();
sl@0
  1167
	setupTestDirectory();
sl@0
  1168
	setupCleanup();
sl@0
  1169
	__UHEAP_MARK;
sl@0
  1170
//
sl@0
  1171
	TheTest.Start(_L("Standard database"));
sl@0
  1172
	doMain();
sl@0
  1173
sl@0
  1174
	TheTest.Printf(_L("Waiting for server exit\n"));
sl@0
  1175
	const TUint KExitDelay=6*0x100000;	// ~6 seconds
sl@0
  1176
	User::After(KExitDelay);
sl@0
  1177
sl@0
  1178
	// clean up data file used by this test - must be done before call to End() - DEF047652
sl@0
  1179
	::TestCleanup();
sl@0
  1180
	
sl@0
  1181
#ifndef __linux__
sl@0
  1182
	TInt err;
sl@0
  1183
#ifndef __TOOLS2__
sl@0
  1184
	TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
sl@0
  1185
	TheTest(err==KErrNone);
sl@0
  1186
	TheTest(lc==KErrNone);
sl@0
  1187
#else
sl@0
  1188
	TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
sl@0
  1189
	TPtrC errmsg;
sl@0
  1190
	TheCrcChecker.ErrorReportL(err, errmsg);
sl@0
  1191
	RDebug::Print(errmsg);
sl@0
  1192
	TheTest(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
sl@0
  1193
#endif
sl@0
  1194
#endif
sl@0
  1195
	
sl@0
  1196
	TheTest.End();
sl@0
  1197
//
sl@0
  1198
	__UHEAP_MARKEND;
sl@0
  1199
sl@0
  1200
sl@0
  1201
	delete TheTrapCleanup;
sl@0
  1202
	TheTest.Close();
sl@0
  1203
	return 0;
sl@0
  1204
    }