[fdo-commits] r2702 - in trunk: Providers/GenericRdbms/Src/UnitTest Providers/GenericRdbms/Src/UnitTest/Common Providers/GenericRdbms/Src/UnitTest/MySql Providers/GenericRdbms/Src/UnitTest/Odbc Utilities/SchemaMgr/Inc/Sm Utilities/SchemaMgr/Inc/Sm/Ph Utilities/SchemaMgr/Src/Sm/Ph Utilities/TestCommon/Inc Utilities/TestCommon/Src

svn_fdo at osgeo.org svn_fdo at osgeo.org
Wed Mar 21 16:38:20 EDT 2007


Author: brentrobinson
Date: 2007-03-21 16:38:20 -0400 (Wed, 21 Mar 2007)
New Revision: 2702

Added:
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.h
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.h
   trunk/Providers/GenericRdbms/Src/UnitTest/apply_schema_lt_err1_master.txt
Modified:
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoAdvancedSelectTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSqlCmdTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/Makefile.am
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.h
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/Makefile.am
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.h
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcDescribeSchemaTest.cpp
   trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoInsertTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoSelectTest.h
   trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestMySql.vcproj
   trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestOdbc.vcproj
   trunk/Utilities/SchemaMgr/Inc/Sm/Ph/BaseObject.h
   trunk/Utilities/SchemaMgr/Inc/Sm/SchemaElement.h
   trunk/Utilities/SchemaMgr/Src/Sm/Ph/BaseObject.cpp
   trunk/Utilities/SchemaMgr/Src/Sm/Ph/DbObject.cpp
   trunk/Utilities/SchemaMgr/Src/Sm/Ph/Field.cpp
   trunk/Utilities/TestCommon/Inc/TestCommonConstraints.h
   trunk/Utilities/TestCommon/Src/TestCommonConstraints.cpp
Log:
Ticket #18: Handle views based on 2 tables with same unqualified name.

This submission  fixes an "item already in collection" that occurs when a non-FDO datastore contains a view based on 2 tables. The 2 tables have the same name but are in different datastores.

The fix was to change the baseObject collection, in FdoSmPhDbObject, to be keyed by qualified name instead of unqualified name.

This submission also contains various unit test case additions.



Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -422,3 +422,8 @@
 
     return env;
 }
+
+SchemaOverrideUtilP ConnectionUtil::NewSchemaOverrideUtil()
+{
+    return new SchemaOverrideUtil();
+}

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/ConnectionUtil.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -76,6 +76,7 @@
 	virtual FdoStringP GetEnviron( const char *name, FdoString *suffix = L"" );
     virtual FdoStringP GetEnv( const char* name );
 	virtual StaticConnection* NewStaticConnection() = 0;
+    virtual SchemaOverrideUtilP NewSchemaOverrideUtil();
 	virtual void SetProvider( const char *providerName ) = 0;
 	virtual FdoInsertTest* GetInsertTest () = 0;
 	virtual FdoStringP GetOutputFileName (FdoString* pBaseFileName) = 0;

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -93,6 +93,25 @@
 //      FdoSchemaManagerP sm = connection->GetSchemaManager();
         LoadTestData(connection /*, sm*/ );
 
+        printf( "Closing Connection ... \n" );
+        UnitTestUtil::CloseConnection(
+            connection,
+            false,
+            L"_describeschema"
+        );
+
+        printf( "Re-opening Connection ... \n" );
+        connection = UnitTestUtil::CreateConnection(
+            false,
+            false,
+            L"_describeschema",
+            NULL,
+            NULL,
+            0
+        );
+
+        FdoPtr<FdoIConnectionCapabilities> conCap = connection->GetConnectionCapabilities();
+
         printf( "Performing Describe ... \n" );
         FdoPtr<FdoIDescribeSchema>  pDescSchemaCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
         FdoFeatureSchemasP                     fsc = pDescSchemaCmd->Execute();
@@ -113,7 +132,7 @@
 
             FdoClassDefinitionP fc = FdoClassesP(fs->GetClasses())->GetItem( L"AcDbEntity" );
             CPPUNIT_ASSERT( fc != NULL );
-     /*
+
             FdoClassCapabilitiesP cc = fc->GetCapabilities();
             CPPUNIT_ASSERT( cc != NULL );
 
@@ -127,9 +146,11 @@
             FdoInt32 lockTypeCount = 0;
             FdoLockType* lockTypes = cc->GetLockTypes( lockTypeCount );
 
-            CPPUNIT_ASSERT( lockTypeCount == 1 );
-            CPPUNIT_ASSERT( lockTypes[0] == FdoLockType_Transaction );
-    */
+            CPPUNIT_ASSERT( lockTypeCount == GetLockTypeCount() );
+            if ( GetLockTypeCount() > 0 ) {
+                CPPUNIT_ASSERT( lockTypes[0] == FdoLockType_Transaction );
+            }
+
             // Verify that the feature class has the right system properties
             // There are actually 5 system properties, but FeatId is omitted
             // because AcDbEntity.ID gets grafted onto it.
@@ -175,6 +196,11 @@
     }
 }
 
+FdoInt32 DescribeSchemaTest::GetLockTypeCount()
+{
+    return 1;
+}
+
 void DescribeSchemaTest::LoadTestData(FdoIConnection* connection/*, FdoRdbmsSchemaManager* sm*/)
 {
     static char* id_cols[] = { "ID" };
@@ -185,7 +211,7 @@
     static char* custid_cols[] = { "NAME", "PROVINCE" };
 
     // Create schema
-    UnitTestUtil::Sql2Db( (const wchar_t**) mInputSchema, connection );
+    UnitTestUtil::Sql2Db( GetSchema(), connection );
 
     // Load data
     UnitTestUtil::Sql2Db( (const wchar_t**) mInputData, connection );
@@ -217,7 +243,9 @@
     return true;
 }
 
-const wchar_t* DescribeSchemaTest::mSchema[] = {
+FdoString** DescribeSchemaTest::GetSchema()
+{
+    static FdoString* theSchema[] = {
     L"create table acdbentity (",
     L"    ID       INT NOT NULL,",
     L"    LAYER    VARCHAR(255)",
@@ -338,8 +366,10 @@
     L"    CUSTOMER_PROVINCE       VARCHAR(50) NOT NULL",
     L");",
     NULL
-};
+    };
 
+    return theSchema;
+}
 
 const wchar_t* DescribeSchemaTest::mData[] = {
     L"",

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/DescribeSchemaTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -47,7 +47,9 @@
     virtual void dropDb();
     virtual void describe ();
     void describe2 ();
+    virtual FdoInt32 GetLockTypeCount();
     virtual void LoadTestData(FdoIConnection* connection/*, FdoSchemaManagerP sm*/);
+    virtual FdoString** GetSchema();
     // Checks if a property is in a readonly property collection.
     // Returns true if present.
     bool Find_ROP( FdoReadOnlyPropertyDefinitionCollection* props, FdoString* propName );
@@ -55,7 +57,6 @@
     const wchar_t** mInputSchema;
     const wchar_t** mInputData;
 	
-	static const wchar_t* mSchema[];
     static const wchar_t* mData[];
 };
 #endif //CPP_UNIT_DESCRIBESCHEMATEST_H

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoAdvancedSelectTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoAdvancedSelectTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoAdvancedSelectTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -50,22 +50,7 @@
 {
     try
     {
-        if (UnitTestUtil::DatastoreExists(DB_SUFFIX))
-            mConnection = (FdoIConnection *) UnitTestUtil::GetConnection(DB_SUFFIX);
-        else
-        {
-            mConnection = (FdoIConnection *) UnitTestUtil::GetConnection(DB_SUFFIX, true);
-
-            // Insert the test data.
-            FdoInsertTest *insert = new FdoInsertTest(DB_SUFFIX);
-            insert->setUp();
-            insert->insert();
-            delete insert;
-            insert = new FdoInsertTest(DB_SUFFIX);
-            insert->setUp();
-            insert->insert2();
-            delete insert;
-        }
+        mConnection = (FdoIConnection *) UnitTestUtil::GetConnection(DB_SUFFIX, true, true);
     }
     catch (FdoException *ex)
     {
@@ -250,8 +235,18 @@
                 while ( myReader->ReadNext() )
                 {
                     count++;
-                    FdoString *testFunc = myReader->GetString(L"TestCompProp");
-                    printf("Computed id= %ls\n", testFunc);
+                    FdoString *testFunc = NULL;
+                    if (!myReader->IsNull(L"TestCompProp"))  
+                    {
+                        testFunc = myReader->GetString(L"TestCompProp");
+                        printf("Computed id= %ls\n", testFunc);
+                    }
+                    else
+                    {
+                        printf("Computed value is NULL.\n");
+                        CPPUNIT_ASSERT_MESSAGE( "Computed value is NULL", false );
+                    }
+
                     FdoInt32 segcount = myReader->GetInt32(L"segcount");
                     if (!myReader->IsNull(L"xdata2"))
                     {
@@ -785,7 +780,10 @@
             {
                 double testFunc = myDataReader->GetDouble(L"TestFunc");
                 printf("Sum(xdata2.seq) = %f\n", testFunc );
+//Remove this ifndef when defect 917635 is fixed.
+#ifndef RDBI_DEF_SA_ORA
                 CPPUNIT_ASSERT_MESSAGE("Wrong sum(xdata2.seq) returned", testFunc==3.0);
+#endif
             }
         }
     }
@@ -1321,7 +1319,10 @@
         try
         {
             myDataReader = selCmdAggreg->Execute();
-            TestCommonFail(FdoException::Create(L"TestUpperDateProperty should fail!"));
+// Remove ifndef when defect 917671 is fixed
+#ifndef RDBI_DEF_SA_ORA
+            TestCommonFail(FdoException::Create(L"TestMaxBoolProperty should fail!"));
+#endif
         }
         catch( FdoException *ex )
         {
@@ -1351,7 +1352,10 @@
         try
         {
             myDataReader = selCmdAggreg->Execute();
+// Remove ifndef when defect 917671 is fixed
+#ifndef RDBI_DEF_SA_ORA
             TestCommonFail(FdoException::Create(L"TestUpperDateProperty should fail!"));
+#endif
         }
         catch( FdoException *ex )
         {
@@ -1380,7 +1384,10 @@
         try
         {
             myDataReader = selCmdAggreg->Execute();
-            TestCommonFail(FdoException::Create(L"TestUpperDateProperty should fail!"));
+// Remove ifndef when defect 917671 is fixed
+#ifndef RDBI_DEF_SA_ORA
+            TestCommonFail(FdoException::Create(L"TestCeilInt64Property should fail!"));
+#endif
         }
         catch( FdoException *ex )
         {

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -648,7 +648,7 @@
         fdoClasses->RemoveAt( fdoClasses->IndexOf(L"view_op") );
 
         FdoRdbmsOvSchemaMappingP mapping = (FdoRdbmsOvPhysicalSchemaMapping*) mappings->GetItem( connection, pSchema->GetName());
-        ShemaOvSetOwner(mapping, UnitTestUtil::GetEnviron("datastore", DB_NAME_OVERRIDE_SUFFIX) );
+        SchemaOvSetOwner(mapping, UnitTestUtil::GetEnviron("datastore", DB_NAME_OVERRIDE_SUFFIX) );
 
         // Apply the foreign schema
         FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
@@ -5970,3 +5970,98 @@
 	else
 		return UnitTestUtil::GetOutputFileName( FdoStringP::Format( L"apply_schema_overrides_err%d%ls.txt", fileNum, L"_master") );
 }
+
+FdoRdbmsOvClassDefinition* FdoApplySchemaTest::CreateOvClassDefinition(FdoString *name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvClassDefinition(name);
+}
+
+void FdoApplySchemaTest::ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->ClassesOvAdd(pSchema, pClass);
+}
+
+FdoRdbmsOvTable* FdoApplySchemaTest::CreateOvTable(FdoString* name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvTable(name);
+}
+
+FdoRdbmsOvColumn* FdoApplySchemaTest::CreateOvColumn(FdoString* name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvColumn(name);
+}
+
+FdoRdbmsOvGeometricColumn* FdoApplySchemaTest::CreateOvGeometricColumn(FdoString* name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvGeometricColumn(name);
+}
+
+FdoRdbmsOvDataPropertyDefinition* FdoApplySchemaTest::CreateOvDataPropertyDefinition(FdoString *name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvDataPropertyDefinition(name);
+}
+
+FdoRdbmsOvGeometricPropertyDefinition* FdoApplySchemaTest::CreateOvGeometricPropertyDefinition(FdoString *name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvGeometricPropertyDefinition(name);
+}
+
+void FdoApplySchemaTest::PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->PropertiesOvAdd(pClass, pProp);
+}
+
+void FdoApplySchemaTest::ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->ClassOvSetTable(pClass, pTable);
+}
+
+void FdoApplySchemaTest::TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->TableOvSetTablespace(pTable, tablespace);
+}
+
+void FdoApplySchemaTest::DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->DataPropOvSetColumn(pDataProp, pDataColumn);
+}
+
+void FdoApplySchemaTest::GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->GeometricPropOvSetColumn(pGeomProp, pGeometricColumn);
+}
+
+void FdoApplySchemaTest::ColumnOvSetSequence(FdoRdbmsOvColumn* pColumn, FdoString *sequence)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->ColumnOvSetSequence(pColumn, sequence);
+}
+
+FdoRdbmsOvObjectPropertyDefinition* FdoApplySchemaTest::CreateOvObjectPropertyDefinition(FdoString *name)
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvObjectPropertyDefinition(name);
+}
+
+FdoRdbmsOvPropertyMappingSingle* FdoApplySchemaTest::CreateOvPropertyMappingSingle()
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvPropertyMappingSingle();
+}
+
+FdoRdbmsOvPropertyMappingConcrete* FdoApplySchemaTest::CreateOvPropertyMappingConcrete()
+{
+    return UnitTestUtil::NewSchemaOverrideUtil()->CreateOvPropertyMappingConcrete();
+}
+
+void FdoApplySchemaTest::ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->ObjectPropertyOvSetMappingDefinition(pObProp, mapping);
+}
+
+void FdoApplySchemaTest::PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->PropertyMappingOvSetInternalClass(pMapping, pClass);
+}
+
+void FdoApplySchemaTest::SchemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner)
+{
+    UnitTestUtil::NewSchemaOverrideUtil()->SchemaOvSetOwner(mapping, owner);
+}

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoApplySchemaTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -137,25 +137,25 @@
 
     // Helper methods for overrides tests; need to be overriden for each provider:
     virtual void CreateRdbmsSpecificElements(FdoIConnection* connection, FdoString* wDatastore) { };
-    virtual FdoRdbmsOvClassDefinition* CreateOvClassDefinition(FdoString *name = NULL) { return NULL; };
-    virtual void ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass) {};
-    virtual FdoRdbmsOvTable* CreateOvTable(FdoString* name) { return NULL; };
-    virtual FdoRdbmsOvColumn* CreateOvColumn(FdoString* name) { return NULL; };
-    virtual FdoRdbmsOvGeometricColumn* CreateOvGeometricColumn(FdoString* name) { return NULL; };
-    virtual FdoRdbmsOvDataPropertyDefinition* CreateOvDataPropertyDefinition(FdoString *name) { return NULL; };
-    virtual FdoRdbmsOvGeometricPropertyDefinition* CreateOvGeometricPropertyDefinition(FdoString *name) { return NULL; };
-    virtual void PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp) {};
-    virtual void ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable) {};
-    virtual void TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace) {};
-    virtual void DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn) {};
-    virtual void GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn) {};
-    virtual void ColumnOvSetSequence(FdoRdbmsOvColumn* pColumn, FdoString *sequence) {};
-    virtual FdoRdbmsOvObjectPropertyDefinition* CreateOvObjectPropertyDefinition(FdoString *name) { return NULL; };
-    virtual FdoRdbmsOvPropertyMappingSingle* CreateOvPropertyMappingSingle() { return NULL; };
-    virtual FdoRdbmsOvPropertyMappingConcrete* CreateOvPropertyMappingConcrete() { return NULL; };
-    virtual void ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping) {};
-    virtual void PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass) {};
-    virtual void ShemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner) {};
+    virtual FdoRdbmsOvClassDefinition* CreateOvClassDefinition(FdoString *name = NULL);
+    virtual void ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass);
+    virtual FdoRdbmsOvTable* CreateOvTable(FdoString* name);
+    virtual FdoRdbmsOvColumn* CreateOvColumn(FdoString* name);
+    virtual FdoRdbmsOvGeometricColumn* CreateOvGeometricColumn(FdoString* name);
+    virtual FdoRdbmsOvDataPropertyDefinition* CreateOvDataPropertyDefinition(FdoString *name);
+    virtual FdoRdbmsOvGeometricPropertyDefinition* CreateOvGeometricPropertyDefinition(FdoString *name);
+    virtual void PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp);
+    virtual void ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable);
+    virtual void TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace);
+    virtual void DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn);
+    virtual void GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn);
+    virtual void ColumnOvSetSequence(FdoRdbmsOvColumn* pColumn, FdoString *sequence);
+    virtual FdoRdbmsOvObjectPropertyDefinition* CreateOvObjectPropertyDefinition(FdoString *name);
+    virtual FdoRdbmsOvPropertyMappingSingle* CreateOvPropertyMappingSingle();
+    virtual FdoRdbmsOvPropertyMappingConcrete* CreateOvPropertyMappingConcrete();
+    virtual void ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping);
+    virtual void PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass);
+    virtual void SchemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner);
 
     virtual void VldClassCapabilities( int ltMode, int lckMode, FdoClassDefinition* pClass );
 

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -94,7 +94,7 @@
       FdoLockType* lockTypes = connectionCapabilities->GetLockTypes( size );
 
       printf("SIZE = %d\n", size);
-      CPPUNIT_ASSERT( size == 0 );
+      CPPUNIT_ASSERT( size == GetLockTypeCount() );
 
       for (i = 0; i < size; i++) {
 
@@ -128,8 +128,8 @@
 
       }  //  for ( ...
 
-      //for ( i = 0; i < size; i++ )
-      //    CPPUNIT_ASSERT( lockArray[i] );
+      for ( i = 0; i < size; i++ )
+          CPPUNIT_ASSERT( lockArray[i] );
 
       FdoPtr<FdoICommandCapabilities> commandCapabilities = connection->GetCommandCapabilities();
       FdoInt32 *commands = commandCapabilities->GetCommands(size);
@@ -763,6 +763,10 @@
 
 }  //  GetUnexpectedFlagValueErrorString ()
 
+FdoInt32 FdoCapabilityTest::GetLockTypeCount()
+{
+    return 0;
+}
 
 FdoCapabilityTest::ArgObject *FdoCapabilityTest::InitArgument (
                                                     FdoString   *argName,

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoCapabilityTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -264,6 +264,11 @@
                                                       bool      expected_value,
                                                       bool      actualValue);
 
+        //  GetLockTypeCount:
+        //      The function returns the number of lock types supported by the current provider.
+
+        virtual FdoInt32 GetLockTypeCount();
+
         //  InitArgument:
         //      The function creates a new object of type "ArgObject", 
         //      initializes it using the provided data and returns it back

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -186,3 +186,18 @@
 		CPPUNIT_FAIL("Unknown exception");
 	}
 }
+
+void FdoConnectTest::connectWithExtraneousSpaces()
+{
+    wchar_t *wConnection = UnitTestUtil::GetConnectionString(Connection_WithDatastore, L"", true);
+
+    FdoPtr<FdoIConnection> connection = UnitTestUtil::GetProviderConnectionObject();
+    connection->SetConnectionString (wConnection);
+    FdoPtr<FdoIConnectionInfo> connInfo = connection->GetConnectionInfo();
+    FdoPtr<FdoIConnectionPropertyDictionary> connDict = connInfo->GetConnectionProperties();
+	if( connection->Open() != FdoConnectionState_Open )
+    {
+        connection->Close();
+        throw "connectWithExtraneousSpaces failed";
+    }
+}

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -26,6 +26,7 @@
 	CPPUNIT_TEST ( connectPropDictionaryTest );
 	CPPUNIT_TEST ( connectWithInvalidString );
     CPPUNIT_TEST( query );
+    CPPUNIT_TEST( connectWithExtraneousSpaces );
     CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -40,6 +41,7 @@
     virtual void query ();
 	virtual void connectPropDictionaryTest(){};
 	virtual void connectWithInvalidString();
+    virtual void connectWithExtraneousSpaces();
 
     FdoPtr<FdoIConnection> mConnection;
     void ReadAcDbPolyline( int connNumber, FdoIFeatureReader *myReader );

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -86,6 +86,18 @@
 
 }
 
+void FdoConnectionInfoTest::CheckProviderInfo ()
+{
+    FdoPtr<FdoIConnectionInfo> connectionInfo =
+                                            mConnection->GetConnectionInfo();
+
+    FdoString* featureDataObjectsVersion = connectionInfo->GetFeatureDataObjectsVersion();
+    FdoString* providerDescription = connectionInfo->GetProviderDescription();
+    FdoString* providerName = connectionInfo->GetProviderName();
+    FdoString* providerVersion = connectionInfo->GetProviderVersion();
+
+}  //  CheckDatabaseBasedProviderInfo ()
+
 void FdoConnectionInfoTest::CheckDatabaseBasedProviderInfo ()
 {
 

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConnectionInfoTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -60,6 +60,7 @@
 
     void AddFileNameToList (FdoStringP fileName);
     void ClearFileNameList ();
+    void CheckProviderInfo ();
     void CheckDatabaseBasedProviderInfo ();
     void CheckFileBasedProviderInfo ();
     void CheckList (FdoStringP dependentFileName);

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -36,28 +36,26 @@
 	set_provider();
 }
 
-FdoIConnection* FdoConstraintsTest::CreateConnection( FdoBoolean recreateDb )
+void FdoConstraintsTest::CreateConnection( Context& context, FdoBoolean recreateDb )
 {
-	FdoIConnection* connection;
-
     FdoBoolean lRecreateDb = recreateDb && RECREATE_CONSTRAINTS_DB;
     FdoBoolean destroySchema = recreateDb && !RECREATE_CONSTRAINTS_DB;
 
     // delete, re-create and open the datastore
-	connection = UnitTestUtil::CreateConnection(
+	context.connection = UnitTestUtil::CreateConnection(
 		lRecreateDb,
 		lRecreateDb,
         DB_NAME_CONSTRAINTS_SUFFIX,
         NULL,
         NULL,
-        0
+        context.ltMethod
     );
 
     if ( destroySchema )	{
 		try {
 			// Drop the schema
-			FdoPtr<FdoIDestroySchema>  pCmd = (FdoIDestroySchema*) connection->CreateCommand(FdoCommandType_DestroySchema);
-			FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+			FdoPtr<FdoIDestroySchema>  pCmd = (FdoIDestroySchema*) context.connection->CreateCommand(FdoCommandType_DestroySchema);
+			FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
             FdoFeatureSchemasP schemas = pDescCmd->Execute();
             FdoInt32 idx;
             for ( idx = 0; idx < schemas->GetCount(); idx++ ) {
@@ -68,8 +66,6 @@
 			// ignore
 		}
 	}
-    
-    return connection;
 }
 
 void FdoConstraintsTest::TestParser()
@@ -86,7 +82,7 @@
 	success &= TestParser(L"(INTRANGE >= 10 and INTRANGE < 20))");
 	success &= TestParser(L"(STRINGLIST = 'close' or STRINGLIST = 'open')");
 
-	success &= TestParser(L"INTLIST = 30 or INTLIST = 20 or INTLIST = 10)");
+	success &= TestParser(L"INTLIST = 30 or INTLIST = 20 or INTLIST = 10");
 	success &= TestParser(L"INTRANGE >= 10 and INTRANGE < 20");
 	success &= TestParser(L"STRINGLIST = 'close' or STRINGLIST = 'open'");
 

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoConstraintsTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -41,7 +41,7 @@
     void setUp();
 
 protected:
-    virtual FdoIConnection* CreateConnection( FdoBoolean recreateDb = false );
+    virtual void CreateConnection( Context& context, FdoBoolean recreateDb = false );
     virtual FdoBoolean CanRestrictCheckConstraint();
     virtual FdoDouble GetDoubleRounding( FdoDataType dataType );
     virtual void  set_provider() {};

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -36,7 +36,7 @@
     mSuffix[0] = '\0';
 }
 
-FdoInsertTest::FdoInsertTest(wchar_t *suffix)
+FdoInsertTest::FdoInsertTest(FdoString *suffix)
 {
     m_DisableFailures = false;
     wcsncpy(mSuffix, suffix, 11 );
@@ -310,24 +310,30 @@
                         dataValue = FdoDataValue::Create(L"Ontario");
                         propertyValue = AddNewProperty( propertyValues3, L"Pr\x00f6vince");
                         propertyValue->SetValue(dataValue);
-                        char id[16];
-                        sprintf(id,"P%d_%d",feat,count1);
-                        FdoStringP str( id );
-                        dataValue = FdoDataValue::Create((FdoString*)str);
+                        FdoStringP id = FdoStringP::Format(L"P%d_%d",feat,count1);
+                        dataValue = FdoDataValue::Create((FdoString*) id);
                         propertyValue = AddNewProperty( propertyValues3, L"PIN");
                         propertyValue->SetValue(dataValue);
 
                         propertyValue = AddNewProperty( propertyValues3, L"Geometry");
                         propertyValue->SetValue(geometryValue);
 
-                        if( count1 > 7 )
+//                        if( count1 > 7 )
 						{
 							FdoPtr<FdoIFeatureReader> reader4 = insertCommand3->Execute();
 							while( reader4->ReadNext() ) {
+//Remove this ifdef when defect 918057 fixed
+#ifdef RDBI_DEF_SA_ORA
+								if( !reader4->IsNull( L"PIN" ) )	{
+									FdoString* pin = reader4->GetString(L"PIN");
+									DBG(printf("inserted pin=%ls\n", pin));
+								}
+#else
 								if( !reader4->IsNull( L"FeatId" ) )	{
 									FdoInt64 featid = reader4->GetInt64(L"FeatId");
 									DBG(printf("inserted featid=%ld\n", featid));
 								}
+#endif
 							}
 						}
 
@@ -496,6 +502,7 @@
         {
             double       coordsBuffer[400];
             int                 segCount = 2;
+            bool supportsZ = (FdoPtr<FdoIGeometryCapabilities>(connection->GetGeometryCapabilities())->GetDimensionalities() & FdoDimensionality_Z);
 
             FdoPtr<FdoPropertyValue> propertyValue;
 
@@ -506,14 +513,22 @@
 
             FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
 
-			// Use 2D points to accomodate MySql 
-            coordsBuffer[0] = 1.1;
-            coordsBuffer[1] = 2.2;
-            coordsBuffer[2] = 1.1;
-            coordsBuffer[3] = 3.3;
+            int ord = 0;
+            coordsBuffer[ord++] = 1.1;
+            coordsBuffer[ord++] = 2.2;
+            if ( supportsZ ) 
+                coordsBuffer[ord++] = 0.0;
+            coordsBuffer[ord++] = 1.1;
+            coordsBuffer[ord++] = 3.3;
+            if ( supportsZ ) 
+                coordsBuffer[ord++] = 0.0;
 
             propertyValue = AddNewProperty( propertyValues, L"Geometry");
-            FdoPtr<FdoILineString> line1 = gf->CreateLineString(FdoDimensionality_XY, 2*2, coordsBuffer);
+            FdoPtr<FdoILineString> line1 = gf->CreateLineString(
+                supportsZ ? FdoDimensionality_XY|FdoDimensionality_Z : FdoDimensionality_XY, 
+                ord, 
+                coordsBuffer
+             );
             FdoPtr<FdoByteArray> byteArray = gf->GetFgf(line1);
 
             FdoPtr<FdoGeometryValue> geometryValue = FdoGeometryValue::Create(byteArray);
@@ -789,8 +804,12 @@
 
 			featureReader = selectCmd->Execute();
 			CPPUNIT_ASSERT(featureReader->ReadNext());
+
+// Reinstate when defect 917085 is fixed.
+#ifndef RDBI_DEF_ORA
             CPPUNIT_ASSERT ( featureReader->GetInt64(L"int64") == (GetMaxInt64Value() - 1) );
             CPPUNIT_ASSERT ( featureReader->GetSingle(L"single") == GetSmallestSingleValue() );
+#endif
 //            CPPUNIT_ASSERT ( featureReader->GetDouble(L"double") == GetSmallestDoubleValue() );
 
             insertBoundaryCleanup( connection );
@@ -1294,7 +1313,7 @@
             L"aaaaaaaaaabbbbiiiii", 
             L"3333"};
 
-        connection = UnitTestUtil::GetConnection(L"LT", true, Connection_WithDatastore, 1, true );
+        connection = UnitTestUtil::GetConnection(L"LT", true, true, Connection_WithDatastore, 1, true );
 
         // Setup the long transaction environment required for this test.
         // NOTE: The long transaction names are prefixed with the current user
@@ -1589,3 +1608,542 @@
     }
 }
 
+void FdoInsertTest::insertLongString()
+{
+	try
+    {
+
+        FdoPtr<FdoIConnection> connection = UnitTestUtil::GetConnection(mSuffix, true);
+
+        try
+        {
+			//delete row
+			FdoPtr<FdoISQLCommand> delCmd = (FdoISQLCommand*)connection->CreateCommand( FdoCommandType_SQLCommand );
+            delCmd->SetSQLStatement(L"delete from ACDBENTITY_ACXDATA_ACXOBJ where intdata=200");
+			delCmd->ExecuteNonQuery();
+
+			FdoIInsert *insertCommand = (FdoIInsert *) connection->CreateCommand(FdoCommandType_Insert);
+            insertCommand->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+	        FdoPtr<FdoPropertyValueCollection> propertyValues = insertCommand->GetPropertyValues();
+
+			FdoPtr<FdoDataValue> dataValue;
+	        FdoPtr<FdoPropertyValue> propertyValue;
+
+			dataValue = FdoDataValue::Create(L"256");
+	        propertyValue = AddNewProperty( propertyValues,L"color"); 
+	        propertyValue->SetValue(dataValue);
+
+	        dataValue = FdoDataValue::Create(0);
+	        propertyValue = AddNewProperty( propertyValues, L"segcount");
+	        propertyValue->SetValue(dataValue);
+		
+	        dataValue = FdoDataValue::Create(200);
+	        propertyValue = AddNewProperty( propertyValues, L"layer");
+	        propertyValue->SetValue(dataValue);
+
+	        dataValue = FdoDataValue::Create(1);
+	        propertyValue = AddNewProperty( propertyValues, L"xdata.seq");
+	        propertyValue->SetValue(dataValue);
+
+	        dataValue = FdoDataValue::Create(L"xyz");
+	        propertyValue = AddNewProperty( propertyValues, L"xdata.DataValue");
+	        propertyValue->SetValue(dataValue);
+                            
+            dataValue = FdoDataValue::Create(200);
+	        propertyValue = AddNewProperty( propertyValues, L"xdata.AcXObj.intdata");
+	        propertyValue->SetValue(dataValue);
+			// Generate very long string
+			FdoStringP strData = L"abcdefghi";
+			for (int i=1; i<400; i++)
+				strData += L"abcdefghij";
+			strData += L"X";
+            dataValue = FdoDataValue::Create(strData);
+	        propertyValue = AddNewProperty( propertyValues, L"xdata.AcXObj.strdata");
+	        propertyValue->SetValue(dataValue);
+
+			FdoPtr<FdoIFeatureReader> reader = insertCommand->Execute();
+			CPPUNIT_ASSERT(reader != NULL);
+			reader->Close();
+			FdoISelect *selCmd;
+			selCmd = (FdoISelect*)connection->CreateCommand( FdoCommandType_Select );
+            selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline.xdata.AcXObj");
+            FdoComparisonCondition* filterPtr = FdoComparisonCondition::Create(
+						FdoPtr<FdoIdentifier> (FdoIdentifier::Create(L"intdata")), 
+						FdoComparisonOperations_EqualTo, 
+						FdoPtr<FdoDataValue>(FdoDataValue::Create((int)200)));
+			selCmd->SetFilter(filterPtr);
+            filterPtr->Release();
+            reader = selCmd->Execute();
+			CPPUNIT_ASSERT(reader != NULL);
+			while (reader->ReadNext())
+			{
+				if (!reader->IsNull(L"strdata"))
+				{
+					FdoStringP strSel = reader->GetString(L"strdata");
+					CPPUNIT_ASSERT(strSel.ICompare(strData) == 0);
+				}
+			}
+			reader->Close();
+			connection->Close();
+		}
+		catch (...)
+        {
+            if (connection)
+                connection->Close ();
+            throw;
+        }
+    }
+    catch (FdoCommandException *ex)
+    {
+        UnitTestUtil::FailOnException(ex);
+    }
+    catch (FdoException *ex)
+    {
+        UnitTestUtil::FailOnException(ex);
+    }
+}
+
+void FdoInsertTest::featureReaderTest()
+{
+
+    bool                                featureReaderError  = false;
+    FdoIConnection                      *connection         = NULL;
+	FdoIApplySchema                     *applySchemaCmd     = NULL;
+    FdoPtr<FdoFeatureSchemaCollection>  schemas;
+	FdoFeatureSchema                    *schema             = NULL;
+    FdoClass                            *schemaClass        = NULL;
+    FdoFeatureClass                     *schemaFeatureClass = NULL;
+    FdoClassCollection                  *classes            = NULL;
+    FdoIFeatureReader                   *featureReader      = NULL;
+
+    try
+    {
+        printf(" >>> Feature Reader Test \n");
+
+        // Create the data store used for the test. Note that none of the
+        // standard schemas is created.
+        printf(" >>> ... creating test database \n");
+        if (UnitTestUtil::DatastoreExists(L"_frc"))
+            UnitTestUtil::DropDb(L"_frc");
+        UnitTestUtil::CreateDB(false, false, L"_frc");
+
+        // Connect and create the test schema.
+        connection = UnitTestUtil::GetConnection(L"_frc");
+
+        printf(" >>> ... creating test schema FeatureReaderCheck \n");
+        applySchemaCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+        schemas = FdoFeatureSchemaCollection::Create(NULL);
+	    schema  = FdoFeatureSchema::Create(L"FeatureReaderCheck", L"Feature Reader Check Schema");
+        classes = schema->GetClasses();
+
+        // Add a class with the feature id property as its sole identity property. In this case
+        // use the identifier FeatId for the feature id property.
+        printf(" >>> ...... adding class FRC_SSFIDC \n");
+        schemaFeatureClass = CreateFdoFeatureClass(L"FRC_SSFIDC", L"FeatId", NULL, 1);
+        classes->Add(schemaFeatureClass);
+        FDO_SAFE_RELEASE(schemaFeatureClass);
+
+        // Add a class with the feature id property as its sole identity property. In this case
+        // use the identifier FeatureId for the feature id property.
+        printf(" >>> ...... adding class FRC_SCFIDC \n");
+        schemaFeatureClass = CreateFdoFeatureClass(L"FRC_SCFIDC", L"FeatureId", NULL, 1);
+        classes->Add(schemaFeatureClass);
+        FDO_SAFE_RELEASE(schemaFeatureClass);
+
+        // Add a class with two identity properties. The identity properties do not
+        // include the feature id property.
+        printf(" >>> ...... adding class FRC_MIDC \n");
+        schemaFeatureClass = CreateFdoFeatureClass(L"FRC_MIDC", L"Id1", L"Id2", 2);
+        classes->Add(schemaFeatureClass);
+        FDO_SAFE_RELEASE(schemaFeatureClass);
+
+        // Add a class with two identity properties. The identity properties do include
+        // the feature id property.
+        printf(" >>> ...... adding class FRC_MIDWFIDC \n");
+        schemaFeatureClass =  CreateFdoFeatureClass(L"FRC_MIDWFIDC", L"Id1", L"FeatureId", 3);
+        classes->Add(schemaFeatureClass);
+        FDO_SAFE_RELEASE(schemaFeatureClass);
+
+        // Add a non-feature class.
+        printf(" >>> ...... adding class FRC_NFC \n");
+        schemaClass = CreateFdoClass(L"FRC_NFC");
+        classes->Add(schemaClass);
+        FDO_SAFE_RELEASE(schemaClass);
+
+        schemas->Add(schema);
+        applySchemaCmd->SetFeatureSchema(schema);
+        printf(" >>> ...... applying schema \n");
+        applySchemaCmd->Execute();
+
+        FDO_SAFE_RELEASE(classes);
+        FDO_SAFE_RELEASE(schema);
+        FDO_SAFE_RELEASE(applySchemaCmd);
+
+
+        printf(" >>> ... insert data and check the returned feature reader \n");
+        printf(" >>> ...... processing class FRC_SSFIDC \n");
+        featureReader = AddFeature(connection, L"FRC_SSFIDC", true, 1);
+        featureReader->ReadNext();
+        try
+        {
+            FdoInt64 fid = featureReader->GetInt64(L"FeatId");
+        }
+        catch (...)
+        {
+            printf(" >>> ......... Feature Reader Error for class FRC_SSFIDC \n");
+            featureReaderError = true;
+        }
+        FDO_SAFE_RELEASE(featureReader);
+
+        printf(" >>> ...... processing class FRC_SCFIDC \n");
+        featureReader = AddFeature(connection, L"FRC_SCFIDC", true, 1);
+        featureReader->ReadNext();
+        try
+        {
+            FdoInt64 fid = featureReader->GetInt64(L"FeatureId");
+        }
+        catch (...)
+        {
+            printf(" >>> ......... Feature Reader Error for class FRC_SCFIDC \n");
+            featureReaderError = true;
+        }
+        FDO_SAFE_RELEASE(featureReader);
+
+        printf(" >>> ...... processing class FRC_MIDC \n");
+        featureReader = AddFeature(connection, L"FRC_MIDC", true, 2);
+        featureReader->ReadNext();
+//Remove this ifdef when defect 918057 fixed
+#ifdef RDBI_DEF_SA_ORA
+        try
+        {
+            FdoStringP id1str = featureReader->GetString(L"Id1");
+            FdoStringP id2str = featureReader->GetString(L"Id2");
+        }
+        catch (...)
+        {
+            printf(" >>> ......... Feature Reader Error for class FRC_MIDC \n");
+            featureReaderError = true;
+        }
+#endif
+        FDO_SAFE_RELEASE(featureReader);
+
+        printf(" >>> ...... processing class FRC_MIDWFIDC \n");
+        featureReader = AddFeature(connection, L"FRC_MIDWFIDC", true, 3);
+        featureReader->ReadNext();
+//Remove this ifdef when defect 918057 fixed
+#ifdef RDBI_DEF_SA_ORA
+        try
+        {
+            FdoStringP id1str = featureReader->GetString(L"Id1");
+            FdoInt64 fid      = featureReader->GetInt64(L"FeatureId");
+        }
+        catch (...)
+        {
+            printf(" >>> ......... Feature Reader Error for class FRC_MIDWFIDC \n");
+            featureReaderError = true;
+        }
+#endif
+        FDO_SAFE_RELEASE(featureReader);
+
+        printf(" >>> ...... processing class FRC_NFC \n");
+        featureReader = AddFeature(connection, L"FRC_NFC", false, 0);
+        featureReader->ReadNext();
+//Remove this ifdef when defect 918057 fixed
+#ifdef RDBI_DEF_SA_ORA
+        try
+        {
+            FdoInt32 fid = featureReader->GetInt32(L"xid");
+        }
+        catch (...)
+        {
+            printf(" >>> ......... Feature Reader Error for class FRC_NFC \n");
+            featureReaderError = true;
+        }
+#endif
+        FDO_SAFE_RELEASE(featureReader);
+
+		connection->Close();
+        if (featureReaderError)
+            throw FdoException::Create(L"Feature Reader Test Failed");
+        printf(" >>> Feature Reader Test Succeeded\n");
+	}
+
+    catch (FdoException *exp)
+    {
+        printf(" >>> Exception: %ls\n", exp->GetExceptionMessage());
+        connection->Close ();
+        FDO_SAFE_RELEASE(classes);
+        FDO_SAFE_RELEASE(schema);
+        FDO_SAFE_RELEASE(applySchemaCmd);
+        TestCommonFail(exp);
+    }
+
+	catch (...)
+    {
+        if ( connection ) connection->Close ();
+        FDO_SAFE_RELEASE(classes);
+        FDO_SAFE_RELEASE(schema);
+        FDO_SAFE_RELEASE(applySchemaCmd);
+        throw;
+    }
+}
+
+FdoIFeatureReader *FdoInsertTest::AddFeature (FdoIConnection *connection, FdoString *className, bool isSpatial, int idScenario)
+{
+    double                     coordinateBuffer[5];
+    FdoIInsert                 *insertCommand      = NULL;
+	FdoDataValue               *dataValue          = NULL;
+    FdoByteArray               *byteArray          = NULL;
+    FdoILineString             *lineStr            = NULL;
+    FdoGeometryValue           *geometryValue      = NULL;
+	FdoPropertyValue           *propertyValue      = NULL;
+    FdoIFeatureReader          *featureReader      = NULL;
+    FdoFgfGeometryFactory      *geometryFactory    = NULL;
+    FdoPropertyValueCollection *propertyValues     = NULL;
+
+    try
+    {
+        insertCommand = (FdoIInsert *) connection->CreateCommand(FdoCommandType_Insert);
+        insertCommand->SetFeatureClassName(className);
+	    propertyValues = insertCommand->GetPropertyValues();
+
+        if (isSpatial)
+        {
+            coordinateBuffer[0] = 100.0;
+            coordinateBuffer[1] = 100.0;
+            coordinateBuffer[2] = 101.0;
+            coordinateBuffer[3] = 101.0;
+
+            geometryFactory = FdoFgfGeometryFactory::GetInstance();
+            lineStr         = geometryFactory->CreateLineString(
+                                    FdoDimensionality_XY,
+                                    4, 
+                                    coordinateBuffer);
+            byteArray       = geometryFactory->GetFgf(lineStr);
+            geometryValue   = FdoGeometryValue::Create(byteArray);
+
+            propertyValue = AddNewProperty(propertyValues, L"RDBMS_GEOM");
+            propertyValue->SetValue(geometryValue);
+            FDO_SAFE_RELEASE(geometryValue);
+            FDO_SAFE_RELEASE(lineStr);
+            FDO_SAFE_RELEASE(byteArray);
+            FDO_SAFE_RELEASE(geometryValue);
+            FDO_SAFE_RELEASE(propertyValue);
+        }
+        else
+        {
+            dataValue     = FdoDataValue::Create(L"1001");
+            propertyValue = AddNewProperty(propertyValues, L"xid");
+            propertyValue->SetValue(dataValue);
+            FDO_SAFE_RELEASE(propertyValue);
+            FDO_SAFE_RELEASE(dataValue);
+        }
+
+        switch (idScenario)
+        {
+            case 1:  // Single identity property representing the feature id property.
+                //Nothing to do.
+                break;
+
+            case 2: // Multiple identity properties; no feature id property included.
+                dataValue     = FdoDataValue::Create(L"1001");
+                propertyValue = AddNewProperty(propertyValues, L"Id1");
+                propertyValue->SetValue(dataValue);
+                FDO_SAFE_RELEASE(dataValue);
+                FDO_SAFE_RELEASE(propertyValue);
+
+                dataValue     = FdoDataValue::Create(L"1001");
+                propertyValue = AddNewProperty(propertyValues, L"Id2");
+                propertyValue->SetValue(dataValue);
+                FDO_SAFE_RELEASE(dataValue);
+                FDO_SAFE_RELEASE(propertyValue);
+                break;
+
+            case 3: // Multiple identity properties; feature id property included.
+                dataValue     = FdoDataValue::Create(L"1001");
+                propertyValue = AddNewProperty(propertyValues, L"Id1");
+                propertyValue->SetValue(dataValue);
+                FDO_SAFE_RELEASE(dataValue);
+                FDO_SAFE_RELEASE(propertyValue);
+                break;
+        }
+
+        dataValue     = FdoDataValue::Create(L"Blue");
+        propertyValue = AddNewProperty(propertyValues, L"color");
+        propertyValue->SetValue(dataValue);
+        FDO_SAFE_RELEASE(dataValue);
+        FDO_SAFE_RELEASE(propertyValue);
+
+        featureReader = insertCommand->Execute();
+
+        FDO_SAFE_RELEASE(propertyValues);
+        FDO_SAFE_RELEASE(insertCommand);
+
+        return featureReader;
+    
+    }  //  try ...
+
+    catch ( ... )
+    {
+        FDO_SAFE_RELEASE(propertyValue);
+        FDO_SAFE_RELEASE(geometryValue);
+        FDO_SAFE_RELEASE(lineStr);
+        FDO_SAFE_RELEASE(byteArray);
+        FDO_SAFE_RELEASE(geometryValue);
+        FDO_SAFE_RELEASE(dataValue);
+        FDO_SAFE_RELEASE(propertyValues);
+        FDO_SAFE_RELEASE(insertCommand);
+        throw;
+    }
+}
+
+FdoDataPropertyDefinition *FdoInsertTest::CreateDataProperty (FdoString   *propertyName,
+                                                           FdoDataType dataType,
+                                                           FdoInt32    dataSize,
+                                                           bool        isNullable)
+{
+    FdoDataPropertyDefinition *dataPropertyDefinition = NULL;
+
+	dataPropertyDefinition = FdoDataPropertyDefinition::Create(propertyName, propertyName);
+	dataPropertyDefinition->SetDataType(dataType);
+    if (dataType == FdoDataType_String)
+        dataPropertyDefinition->SetLength(dataSize);
+	dataPropertyDefinition->SetNullable(isNullable);
+    return dataPropertyDefinition;
+}
+
+FdoClass *FdoInsertTest::CreateFdoClass (FdoString *className)
+{
+    FdoClass                            *theClass                = NULL;
+    FdoDataPropertyDefinition           *dataPropertyDefinition  = NULL;
+    FdoPropertyDefinitionCollection     *dataPropertyDefinitions = NULL;
+    FdoDataPropertyDefinitionCollection *idPropertyDefinitions   = NULL;
+
+    try
+    {
+        theClass = FdoClass::Create(className, className);
+	    theClass->SetIsAbstract(false);
+        dataPropertyDefinitions = theClass->GetProperties();
+        idPropertyDefinitions   = theClass->GetIdentityProperties();
+
+        dataPropertyDefinition  = CreateDataProperty(L"xid", FdoDataType_Int32, 0, false);
+	    dataPropertyDefinitions->Add(dataPropertyDefinition);
+        idPropertyDefinitions->Add(dataPropertyDefinition);
+	    FDO_SAFE_RELEASE(dataPropertyDefinition);
+
+        dataPropertyDefinition = CreateDataProperty(L"color", FdoDataType_String, 30, false);
+	    dataPropertyDefinitions->Add(dataPropertyDefinition);
+	    FDO_SAFE_RELEASE(dataPropertyDefinition);
+
+        FDO_SAFE_RELEASE(idPropertyDefinitions);
+        FDO_SAFE_RELEASE(dataPropertyDefinitions);
+
+        return theClass;
+    }
+
+    catch ( ... )
+    {
+	    FDO_SAFE_RELEASE(dataPropertyDefinition);
+        FDO_SAFE_RELEASE(idPropertyDefinitions);
+        FDO_SAFE_RELEASE(dataPropertyDefinitions);
+
+        throw;
+    }
+}
+
+FdoFeatureClass *FdoInsertTest::CreateFdoFeatureClass (FdoString *className,
+                                                    FdoString *idColName1,
+                                                    FdoString *idColName2,
+                                                    int       idScenario)
+{
+    FdoFeatureClass                     *theClass                    = NULL;
+    FdoDataPropertyDefinition           *dataPropertyDefinition      = NULL;
+    FdoGeometricPropertyDefinition      *geometricPropertyDefinition = NULL;
+    FdoPropertyDefinitionCollection     *dataPropertyDefinitions     = NULL;
+    FdoDataPropertyDefinitionCollection *idPropertyDefinitions       = NULL;
+
+    try
+    {
+        theClass = FdoFeatureClass::Create(className, className);
+	    theClass->SetIsAbstract(false);
+        dataPropertyDefinitions = theClass->GetProperties();
+        idPropertyDefinitions   = theClass->GetIdentityProperties();
+
+        switch (idScenario)
+        {
+            case 1: // Single identity property representing the feature id property.
+                dataPropertyDefinition = CreateDataProperty(idColName1, FdoDataType_Int64, 0, false);
+                dataPropertyDefinition->SetIsAutoGenerated(true);
+                dataPropertyDefinitions->Add(dataPropertyDefinition);
+                idPropertyDefinitions->Add(dataPropertyDefinition);
+                FDO_SAFE_RELEASE(dataPropertyDefinition);
+                break;
+
+            case 2: // Multiple identity properties; no feature id property included.
+                dataPropertyDefinition = CreateDataProperty(idColName1, FdoDataType_String, 50, false);
+                dataPropertyDefinitions->Add(dataPropertyDefinition);
+                idPropertyDefinitions->Add(dataPropertyDefinition);
+                FDO_SAFE_RELEASE(dataPropertyDefinition);
+
+                dataPropertyDefinition = CreateDataProperty(idColName2, FdoDataType_String, 50, false);
+                dataPropertyDefinitions->Add(dataPropertyDefinition);
+                idPropertyDefinitions->Add(dataPropertyDefinition);
+                FDO_SAFE_RELEASE(dataPropertyDefinition);
+                break;
+
+            case 3: // Multiple identity properties; feature id property included.
+                dataPropertyDefinition = CreateDataProperty(idColName1, FdoDataType_String, 50, false);
+                dataPropertyDefinitions->Add(dataPropertyDefinition);
+                idPropertyDefinitions->Add(dataPropertyDefinition);
+                FDO_SAFE_RELEASE(dataPropertyDefinition);
+
+                dataPropertyDefinition = CreateDataProperty(idColName2, FdoDataType_Int64, 0, false);
+                dataPropertyDefinition->SetIsAutoGenerated(true);
+                dataPropertyDefinitions->Add(dataPropertyDefinition);
+                idPropertyDefinitions->Add(dataPropertyDefinition);
+                FDO_SAFE_RELEASE(dataPropertyDefinition);
+                break;
+        }
+
+        dataPropertyDefinition = CreateDataProperty(L"color", FdoDataType_String, 30, false);
+	    dataPropertyDefinitions->Add(dataPropertyDefinition);
+	    FDO_SAFE_RELEASE(dataPropertyDefinition);
+
+        geometricPropertyDefinition = CreateGeometricProperty(L"RDBMS_GEOM");
+	    dataPropertyDefinitions->Add(geometricPropertyDefinition);
+        theClass->SetGeometryProperty(geometricPropertyDefinition);
+	    FDO_SAFE_RELEASE(geometricPropertyDefinition);
+
+        FDO_SAFE_RELEASE(idPropertyDefinitions);
+        FDO_SAFE_RELEASE(dataPropertyDefinitions);
+
+        theClass->SetBaseClass(NULL);
+        return theClass;
+
+    }  //  try ...
+
+    catch ( ... )
+    {
+	    FDO_SAFE_RELEASE(geometricPropertyDefinition);
+	    FDO_SAFE_RELEASE(dataPropertyDefinition);
+        FDO_SAFE_RELEASE(idPropertyDefinitions);
+        FDO_SAFE_RELEASE(dataPropertyDefinitions);
+
+        throw;
+    }
+}
+
+FdoGeometricPropertyDefinition *FdoInsertTest::CreateGeometricProperty (FdoString *propertyName)
+{
+    FdoGeometricPropertyDefinition *geometricPropertyDefinition = NULL;
+	geometricPropertyDefinition = FdoGeometricPropertyDefinition::Create(propertyName, propertyName);
+    geometricPropertyDefinition->SetGeometryTypes(FdoGeometricType_Point   | 
+                                                  FdoGeometricType_Curve   | 
+                                                  FdoGeometricType_Surface | 
+                                                  FdoGeometricType_Solid     );
+    geometricPropertyDefinition->SetHasElevation(false);
+    return geometricPropertyDefinition;
+}
+
+
+

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoInsertTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -36,11 +36,13 @@
   CPPUNIT_TEST( insertFlushTest );
   //CPPUNIT_TEST( conditionalInsert );
   CPPUNIT_TEST( insertAutoGen );
+  //CPPUNIT_TEST( insertLongString );
+  CPPUNIT_TEST( featureReaderTest );
   CPPUNIT_TEST_SUITE_END();
 
 public:
     FdoInsertTest(void);
-    FdoInsertTest(wchar_t *suffix);
+    FdoInsertTest(FdoString *suffix);
     virtual ~FdoInsertTest(void);
     void setUp ();
 
@@ -57,6 +59,8 @@
 	virtual void conditionalInsert();
     virtual void DisableFailures(){m_DisableFailures=true;};
 	virtual void insertAutoGen(); //Insert empty non-feature
+	virtual void insertLongString();
+    virtual void featureReaderTest();
 
 protected:
     virtual void  set_provider() {};   
@@ -66,6 +70,22 @@
 	static FdoPropertyValue* AddNewProperty( FdoPropertyValueCollection* propertyValues, const wchar_t *name );
     void insertBoundaryCleanup( FdoIConnection* connection );
 
+    // Functions used to setup the test environment for the unit test
+    // featureReaderTest and execute it.
+    FdoIFeatureReader *AddFeature (FdoIConnection *connection, FdoString *className, bool isSpatial, int idScenario);
+
+    FdoDataPropertyDefinition *CreateDataProperty (FdoString   *propertyName,
+                                                   FdoDataType dataType,
+                                                   FdoInt32    dataSize,
+                                                   bool        isNullable);
+    FdoClass *CreateFdoClass (FdoString *className);
+    FdoFeatureClass *CreateFdoFeatureClass (FdoString *className,
+                                            FdoString *idColName1,
+                                            FdoString *idColName2,
+                                            int       idScenario);
+    FdoGeometricPropertyDefinition *CreateGeometricProperty (FdoString *propertyName);
+
+
     //Various Max/Min values for various numeric types.
     //Used by insertBoundary test.
     //Providers can overrides these if they don't support the same ranges of values.

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -17,6 +17,7 @@
 #include "Pch.h"
 #include "FdoSelectTest.h"
 #include "UnitTestUtil.h"
+#include "FdoSpatial.h"
 //#include <Geometry/GeometryStd.h>
 //#include <Geometry/Fgf/Factory.h>
 //#include "FdoGeometry.h"
@@ -430,38 +431,79 @@
     {
         try
         {
-            selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
-            selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
-            FdoPtr<FdoFilter> filterPtr = FdoSelectTest::CreateFilter();
-            double coords[6];
-            double      distance = 300.0;
-            coords[0] = 1410804.854546;
-            coords[1] = 553505.994735;
-            coords[2] = 0.0;
-            coords[3] = 1412350.770162;
-            coords[4] = 554980.139631;
-            coords[5] = 0.0;
-            FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
-            FdoPtr<FdoILineString> line1 = gf->CreateLineString(FdoDimensionality_XY|FdoDimensionality_Z, 2*3, coords);
-            FdoPtr<FdoByteArray> byteArray = gf->GetFgf(line1);
+            FdoInt32 size;
 
-            FdoPtr<FdoGeometryValue> geomValue = FdoPtr<FdoGeometryValue>( FdoGeometryValue::Create(byteArray));
-            FdoPtr<FdoDistanceCondition> pSpatialFilter = FdoPtr<FdoDistanceCondition>( FdoDistanceCondition::Create(L"Geometry",
-                                                                                FdoDistanceOperations_Within,
-                                                                                geomValue,
-                                                                                distance ));
-            FdoPtr<FdoFilter> filter = FdoFilter::Combine( filterPtr, FdoBinaryLogicalOperations_And, pSpatialFilter);
-            selCmd->SetFilter(filter);
+            FdoPtr<FdoIFilterCapabilities> filterCapabilities = mConnection->GetFilterCapabilities();
+            FdoDistanceOperations *distanceOperations = filterCapabilities->GetDistanceOperations(size);
 
-            myReader = selCmd->Execute();
-            if( myReader != NULL  )
+            // Do test only if provider supports distance filters.
+            if ( size > 0 ) 
             {
-                while ( myReader->ReadNext() )
+                selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
+                selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+                FdoPtr<FdoFilter> filterPtr = FdoSelectTest::CreateFilter();
+                double coords[6];
+                double      distance = 300.0;
+                coords[0] = 1410804.854546;
+                coords[1] = 553505.994735;
+                coords[2] = 0.0;
+                coords[3] = 1412350.770162;
+                coords[4] = 554980.139631;
+                coords[5] = 0.0;
+                FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+                FdoPtr<FdoILineString> line1 = gf->CreateLineString(FdoDimensionality_XY|FdoDimensionality_Z, 2*3, coords);
+                FdoPtr<FdoByteArray> byteArray = gf->GetFgf(line1);
+
+                FdoPtr<FdoGeometryValue> geomValue = FdoPtr<FdoGeometryValue>( FdoGeometryValue::Create(byteArray));
+                FdoPtr<FdoDistanceCondition> pSpatialFilter = FdoPtr<FdoDistanceCondition>( FdoDistanceCondition::Create(L"Geometry",
+                                                                                    FdoDistanceOperations_Within,
+                                                                                    geomValue,
+                                                                                    distance ));
+                FdoPtr<FdoFilter> filter = FdoFilter::Combine( filterPtr, FdoBinaryLogicalOperations_And, pSpatialFilter);
+                selCmd->SetFilter(filter);
+
+                myReader = selCmd->Execute();
+                if( myReader != NULL  )
                 {
-                    read_feature_data( myReader );
+                    while ( myReader->ReadNext() )
+                    {
+                        read_feature_data( myReader );
+                    }
                 }
+
+                // Try the same query again, but with a dimensionality mismatch between filter and selected geometries.
+                selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
+                selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+			    filterPtr = CreateFilter();
+                double coords2[4];
+                coords2[0] = 1410804.854546;
+                coords2[1] = 553505.994735;
+                coords2[2] = 1412350.770162;
+                coords2[3] = 554980.139631;
+			    line1 = gf->CreateLineString(FdoDimensionality_XY, 4, coords2);
+			    byteArray = gf->GetFgf(line1);
+                printf("Testing DistanceCondition with 2D geometry:\n<<%ls>>\n", line1->GetText());
+     
+			    geomValue = FdoPtr<FdoGeometryValue>( FdoGeometryValue::Create(byteArray));
+		        pSpatialFilter = FdoPtr<FdoDistanceCondition>( FdoDistanceCondition::Create(L"Geometry", 
+																				    FdoDistanceOperations_Within,
+																				    geomValue, 
+																				    distance ));
+			    filter = FdoFilter::Combine( filterPtr, FdoBinaryLogicalOperations_And, pSpatialFilter);
+			    selCmd->SetFilter(filter);
+
+                FdoInt32 numRows = 0;
+                myReader = selCmd->Execute();
+                if( myReader != NULL  )
+                {
+                    while ( myReader->ReadNext() )
+                    {
+                        numRows++;
+                        read_feature_data( myReader );
+                    }
+                }
+                printf("Read %d rows.\n", numRows);
             }
-
         }
         catch( FdoException *ex )
         {
@@ -517,6 +559,169 @@
     }
 }
 
+void FdoSelectTest::spatial_query_defect792377()
+{
+    FdoPtr<FdoIFeatureReader> myReader;
+	FdoPtr<FdoISelect> selCmd;
+
+    if( mConnection != NULL )
+    {
+        try
+        {
+            FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+            selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
+            selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+			FdoPtr<FdoFilter> filterPtr = CreateFilter();
+
+            // We want a geometry with more than 999 ordinates, which is a limit imposed
+            // by the Oracle parser.  This makes sure that we are binding geometries in
+            // spatial filters -- binding can be done with any legal geometry.
+            // The easiest way to create one here is to linearise a circular arc.
+
+            FdoString * geomText = L"CURVEPOLYGON XYZ ((1410804.854546 553505.994735 0 (CIRCULARARCSEGMENT (1412350.770162 554980.139631 0, 1410804.854546 553505.994735 0))))";
+            FdoPtr<FdoIGeometry> geom = gf->CreateGeometry(geomText);
+
+            FdoPtr<FdoIGeometry> linearizedGeom =
+                FdoSpatialUtility::ApproximateGeometryWithLineStrings(geom, 0, 0.001, gf);
+
+            FdoGeometryType geomType = linearizedGeom->GetDerivedType();
+            CPPUNIT_ASSERT( geomType == FdoGeometryType_Polygon );
+            FdoIPolygon * poly = static_cast<FdoIPolygon *>(linearizedGeom.p);
+            FdoPtr<FdoILinearRing> ring = poly->GetExteriorRing();
+            FdoInt32 numPositions = ring->GetCount();
+            CPPUNIT_ASSERT( numPositions > 333 );
+
+	        FdoPtr<FdoGeometryValue> geomValue = FdoPtr<FdoGeometryValue>(FdoGeometryValue::Create(FdoPtr<FdoByteArray>(gf->GetFgf(linearizedGeom))));
+	        FdoPtr<FdoSpatialCondition> pSpatialFilter = FdoPtr<FdoSpatialCondition>(FdoSpatialCondition::Create(L"Geometry", 
+																	  FdoSpatialOperations_Intersects, 
+																	  geomValue));
+
+			FdoPtr<FdoFilter> filter = FdoFilter::Combine( filterPtr, FdoBinaryLogicalOperations_And, pSpatialFilter);
+			selCmd->SetFilter(filter);
+            
+            FdoInt32 numFeatures = 0;
+
+            myReader = selCmd->Execute();
+            if( myReader != NULL  )
+            {
+                while ( myReader->ReadNext() )
+                {
+                    numFeatures++;
+                    read_feature_data( myReader );
+                }
+            }
+            printf("   %i feature(s) read\n", numFeatures);
+        }
+        catch( FdoException *ex )
+        {
+            printf("FDO Feature query error: %ls\n", ex->GetExceptionMessage());
+            throw;
+        }
+    }
+}
+
+void FdoSelectTest::spatial_query_defect813611 ()
+{
+    FdoPtr<FdoIFeatureReader> myReader;
+	FdoPtr<FdoISelect> selCmd;
+
+    if( mConnection != NULL )
+    {
+        try
+        {
+            FdoInt32 size;
+            FdoInt32 idx;
+            bool found = false;
+            FdoPtr<FdoIFilterCapabilities> filterCapabilities = mConnection->GetFilterCapabilities();
+            FdoSpatialOperations *spatialOperations = filterCapabilities->GetSpatialOperations(size);
+
+            for ( idx = 0; idx < size; idx++ ) 
+            {
+                if ( spatialOperations[idx] == FdoSpatialOperations_Inside )
+                {
+                    found = true;
+                    break;
+                }
+            }
+
+            if ( found ) 
+            {
+                FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+                selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
+                selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+
+                // We want a polygon with one circle formed by two arcs.
+
+                FdoString * geomText = L"CURVEPOLYGON XYZ ((1500876 500030 0 (CIRCULARARCSEGMENT (1400856 600050 0, 1300836 500030 0), CIRCULARARCSEGMENT (1400856 400010 0, 1500876 500030 0))))";
+                FdoPtr<FdoIGeometry> geom = gf->CreateGeometry(geomText);
+
+	            FdoPtr<FdoGeometryValue> geomValue = FdoPtr<FdoGeometryValue>(FdoGeometryValue::Create(FdoPtr<FdoByteArray>(gf->GetFgf(geom))));
+	            FdoPtr<FdoSpatialCondition> pSpatialFilter = FdoPtr<FdoSpatialCondition>(FdoSpatialCondition::Create(L"Geometry", 
+																	      FdoSpatialOperations_Inside, 
+																	      geomValue));
+
+			    selCmd->SetFilter(pSpatialFilter);
+                
+                FdoInt32 numFeatures = 0;
+
+                myReader = selCmd->Execute();
+                if( myReader != NULL  )
+                {
+                    while ( myReader->ReadNext() )
+                    {
+                        numFeatures++;
+                        read_feature_data( myReader );
+                    }
+                }
+                printf("   %i feature(s) read\n", numFeatures);
+            }
+        }
+        catch( FdoException *ex )
+        {
+            printf("FDO Feature query error: %ls\n", ex->GetExceptionMessage());
+            throw;
+        }
+    }
+}
+
+void FdoSelectTest::spatial_query_defect880310 ()
+{
+    FdoPtr<FdoIFeatureReader> myReader;
+	FdoPtr<FdoISelect> selCmd;
+
+    if( mConnection != NULL )
+    {
+        try
+        {
+            FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+            selCmd = (FdoISelect*)mConnection->CreateCommand( FdoCommandType_Select );
+            selCmd->SetFeatureClassName(L"Acad:AcDb3dPolyline");
+
+            // Use multiple spatial filters (tests binding of multiple geometries).
+            selCmd->SetFilter(L"Geometry INTERSECTS geomfromtext('MULTILINESTRING XYZ ((10 48,10 21,10 0), (16 0,16 23,16 48))') "
+                              L"or Geometry INTERSECTS geomfromtext('MULTILINESTRING XYZ ((10 48,10 21,10 0), (16 0,16 23,16 48))')");
+            
+            FdoInt32 numFeatures = 0;
+
+            myReader = selCmd->Execute();
+            if( myReader != NULL  )
+            {
+                while ( myReader->ReadNext() )
+                {
+                    numFeatures++;
+                    read_feature_data( myReader );
+                }
+            }
+            printf("   %i feature(s) read\n", numFeatures);
+        }
+        catch( FdoException *ex )
+        {
+            printf("FDO Feature query error: %ls\n", ex->GetExceptionMessage());
+            throw;
+        }
+    }
+}
+
 void FdoSelectTest::feature_subset_query ()
 {
     FdoPtr<FdoIFeatureReader> myReader;
@@ -826,9 +1031,19 @@
 
                     if( ! myReader->IsNull(L"Geometry") )
                     {
+                        int count1, count2;
+
+                        const FdoByte* bytes = myReader->GetGeometry(L"Geometry", &count1);
+
                         FdoPtr<FdoByteArray> byteArray = myReader->GetGeometry(L"Geometry");
                         DBG( printf(" \t\tGemetry byte array size: %d\n", byteArray->GetCount()) );
-                        byteArray->GetCount();
+                        count2 = byteArray->GetCount();
+                        printf(" \t\tGeometry byte array size: %d\n", count2);
+                        if ( count1 != count2 )
+                        {
+                            CPPUNIT_FAIL((const char*) FdoStringP::Format(L"FDO Feature query error: count1=%d vs. count2=%d\n", count1, count2));
+                            throw;
+                        }
                     }
                     DBG( printf("\n") );
                 }

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSelectTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -30,10 +30,13 @@
   CPPUNIT_TEST( feature_subset_query );
   CPPUNIT_TEST( feature_query );
   CPPUNIT_TEST( non_feature_query );
- // CPPUNIT_TEST( distance_query );
+  CPPUNIT_TEST( distance_query );
   CPPUNIT_TEST( spatial_query );
- // CPPUNIT_TEST(feature_object_query);
-//  CPPUNIT_TEST(feature_select_obj_distinct);
+  CPPUNIT_TEST( spatial_query_defect792377 );
+  CPPUNIT_TEST( spatial_query_defect813611 );
+  CPPUNIT_TEST( spatial_query_defect880310 );
+  CPPUNIT_TEST(feature_object_query);
+  CPPUNIT_TEST(feature_select_obj_distinct);
   CPPUNIT_TEST(feature_geom_query);
   CPPUNIT_TEST(concurrent_select);
   CPPUNIT_TEST(_duplicateComputedIdTest);
@@ -52,6 +55,9 @@
     virtual void non_feature_query ();
     virtual void distance_query ();
     virtual void spatial_query ();
+    virtual void spatial_query_defect792377();
+    virtual void spatial_query_defect813611();
+    virtual void spatial_query_defect880310();
     virtual void feature_object_query();
 
     virtual void feature_subset_query ();

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSqlCmdTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSqlCmdTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoSqlCmdTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -18,11 +18,6 @@
 #include "Pch.h"
 #include "FdoSqlCmdTest.h"
 #include "UnitTestUtil.h"
-#include "FdoRdbmsGetSpatialContexts.h"
-#include "FdoRdbmsCreateSpatialContext.h"
-#include "FdoRdbmsDestroySpatialContext.h"
-#include "FdoRdbmsActivateSpatialContext.h"
-#include "FdoRdbmsConnection.h"
 
 #ifdef _DEBUG
 #define  DBG(X)    X
@@ -187,13 +182,13 @@
     {
         try
         {
-            FdoPtr<FdoRdbmsGetSpatialContexts> gscCmd;
+            FdoPtr<FdoIGetSpatialContexts> gscCmd;
             FdoPtr<FdoISpatialContextReader> reader;
             DBG(printf("\n.Getting Spatial Contexts (active_only=%s)\n", active_only? "true":"false" ));
 
             ///////////////////////////////////////////////////////////////////////////////////////////
             // This will initialize for fetching the SC
-            gscCmd = (FdoRdbmsGetSpatialContexts *)mConnection->CreateCommand( FdoCommandType_GetSpatialContexts );
+            gscCmd = (FdoIGetSpatialContexts *)mConnection->CreateCommand( FdoCommandType_GetSpatialContexts );
 
             gscCmd->SetActiveOnly(active_only);
         
@@ -218,16 +213,16 @@
 
 void FdoSqlCmdTest::CreateActivateDestroySC()
 {
-    FdoPtr<FdoRdbmsCreateSpatialContext>   cscCmd;
-    FdoPtr<FdoRdbmsDestroySpatialContext>  dscCmd;
-    FdoPtr<FdoRdbmsActivateSpatialContext> ascCmd;
+    FdoPtr<FdoICreateSpatialContext>   cscCmd;
+    FdoPtr<FdoIDestroySpatialContext>  dscCmd;
+    FdoPtr<FdoIActivateSpatialContext> ascCmd;
 
     DBG(printf("\n.Creating/Activating/Destroying Spatial Context\n"));
     if( mConnection != NULL )
     {
         try
         {
-            cscCmd = (FdoRdbmsCreateSpatialContext *)mConnection->CreateCommand( FdoCommandType_CreateSpatialContext );
+            cscCmd = (FdoICreateSpatialContext *)mConnection->CreateCommand( FdoCommandType_CreateSpatialContext );
 
     #pragma message ("ToDo: investigate trancation failure with longer SC names on MySQL.")
             cscCmd->SetName(L"SC_X"); 
@@ -261,7 +256,7 @@
         {
             FdoPtr<FdoIConnection> mConn = UnitTestUtil::GetConnection(L"", false);
 
-            ascCmd = (FdoRdbmsActivateSpatialContext *)mConn->CreateCommand( FdoCommandType_ActivateSpatialContext );
+            ascCmd = (FdoIActivateSpatialContext *)mConn->CreateCommand( FdoCommandType_ActivateSpatialContext );
 
             ascCmd->SetName(L"SC_X");
       
@@ -279,7 +274,7 @@
         {
             FdoPtr<FdoIConnection> mConn = UnitTestUtil::GetConnection(L"", false);
 
-            ascCmd = (FdoRdbmsActivateSpatialContext *)mConn->CreateCommand( FdoCommandType_ActivateSpatialContext );
+            ascCmd = (FdoIActivateSpatialContext *)mConn->CreateCommand( FdoCommandType_ActivateSpatialContext );
 
             ascCmd->SetName(L"SC_X");
       
@@ -297,7 +292,7 @@
         {
             FdoPtr<FdoIConnection> mConn = UnitTestUtil::GetConnection(L"", false);
 
-            dscCmd = (FdoRdbmsDestroySpatialContext *)mConn->CreateCommand( FdoCommandType_DestroySpatialContext );
+            dscCmd = (FdoIDestroySpatialContext *)mConn->CreateCommand( FdoCommandType_DestroySpatialContext );
 
             dscCmd->SetName(L"SC_X");
       

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -357,7 +357,7 @@
         prop = FdoUpdateTest::AddNewProperty( properties, L"layer");
         if( prop )
             prop->SetValue( L"'32001'" );
-#if 0
+#if 1
         prop = FdoUpdateTest::AddNewProperty( properties, L"xdata.seq");
         if( prop )
             prop->SetValue( FdoPtr<FdoDataValue>(FdoDataValue::Create( (int)4 )) );
@@ -419,11 +419,11 @@
         dataValue = FdoDataValue::Create(5);
         propertyValue = FdoUpdateTest::AddNewProperty( propertyValues, L"Age");
         propertyValue->SetValue(dataValue);
-#if 0
+
         dataValue = FdoDataValue::Create(43);
         propertyValue = FdoUpdateTest::AddNewProperty( propertyValues, L"Object.ObjectWeight");
         propertyValue->SetValue(dataValue);
-#endif
+
         updateCommand->Execute();
 
         featureTransaction->Commit();
@@ -506,7 +506,6 @@
         propertyValue->SetValue(dataValue);
 
         dataValue = FdoDataValue::Create((float)((float)INT_MAX/2.0));
-        //dataValue = FdoDataValue::Create(L"Hello");
         propertyValue = FdoUpdateTest::AddNewProperty( propertyValues, L"single");
         propertyValue->SetValue(dataValue);
 
@@ -948,7 +947,7 @@
     {
         connection = UnitTestUtil::GetConnection(mSuffix, false);
         UnitTestUtil::CreateLandSchema(connection);
-        //UnitTestUtil::CreateNonUniqueSchema(connection);
+        UnitTestUtil::CreateNonUniqueSchema(connection);
 
         featureTransaction = connection->BeginTransaction();
 
@@ -1325,6 +1324,9 @@
         CPPUNIT_ASSERT( expectedZ == pos->GetZ() );
 }
 
+void FdoUpdateTest::CheckSpatialContexts(FdoPtr<FdoIConnection> connection, int expected)
+{
+}
 
 void FdoUpdateTest::ConditionalUpdate()
 {
@@ -1337,7 +1339,7 @@
 
 	try
 	{
-        connection = UnitTestUtil::GetConnection(L"LT", true, Connection_WithDatastore, 1, true);
+        connection = UnitTestUtil::GetConnection(L"LT", true, true, Connection_WithDatastore, 1, true);
 
         // Generate the necessary long transaction names.
 
@@ -1804,6 +1806,9 @@
         CreateExternalTable( owner, L"TABLE_NOID_GEOM", false, m_hasGeom, false );
         CreateExternalTable( owner, table_noid_nogeom, false, false, false );
 
+        // Special tables for special testing. 
+        CreateExternalTable( owner, L"TABLE_ID_GEOM_LL", true, providerName != L"SqlServer", false );
+        CreateExternalTable( owner, L"TABLE_ID_GEOM_XYZM", true, providerName != L"SqlServer", false );
 
         owner->Commit();
 
@@ -1813,6 +1818,7 @@
             NoMetaSuffix()
         );
 
+        UpdSpatialMetadata( connection );
         CreateExternalData( connection, phMgr, table_id_geom, m_hasGeom, m_hasAssoc );
 
 #ifdef RDBI_DEF_SSQL
@@ -1925,7 +1931,7 @@
         table->AddPkeyCol( fkColumn->GetName() );
 
     if ( hasGeom )
-        column = table->CreateColumnGeom( phMgr->GetDcColumnName(L"GEOMETRY"), (FdoSmPhScInfo*) NULL, true, false );
+        column = table->CreateColumnGeom( phMgr->GetDcColumnName(L"GEOMETRY"), CreateScInfo(tableName), true, false );
 
     column = table->CreateColumnChar( phMgr->GetDcColumnName(ValueColName()), true, 20 );
 
@@ -1962,13 +1968,59 @@
 
     if ( hasGeom ) {
         columnName = phMgr->GetDcColumnName(L"GEOMETRY");
-        column = view->CreateColumnGeom( columnName, (FdoSmPhScInfo*) NULL, true, false, false, columnName );
+        column = view->CreateColumnGeom( columnName, CreateScInfo(tableName), true, false, false, columnName );
     }
 
     columnName = phMgr->GetDcColumnName(ValueColName());
     column = view->CreateColumnChar( columnName, true, 20, columnName );
 }
 
+FdoPtr<FdoSmPhScInfo> FdoUpdateTest::CreateScInfo( FdoStringP objectName )
+{
+    FdoSmPhScInfo *scinfo = NULL;
+		
+	// The tables need to have the same SRID since this test is copying from one another
+	scinfo = FdoSmPhScInfo::Create();
+
+	// The tables need to have the same SRID since this test is copying from one another
+	scinfo->mSrid = 81989; // British National Grid
+	scinfo->mCoordSysName = L"";
+
+	FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+	FdoPtr<FdoIEnvelope>          env;
+
+	if ( objectName == L"TABLE_ID_GEOM" )
+		env = gf->CreateEnvelopeXY( -1001, -1002, 1001, 1002 );
+	else if ( objectName == L"TABLE_ID_GEOM_LL" )
+	{
+		env = gf->CreateEnvelopeXY( -180, -90, 180, 90 );
+		scinfo->mSrid = 524288; // Longitude / Latitude (NAD 83) Datum 33
+	}
+	else if ( objectName == L"TABLE_ID_GEOM_XYZM" )
+	{
+		env = gf->CreateEnvelopeXYZ( -3001, -3002, -3003, 3001, 3002, 3003);
+	}
+	else
+		env = gf->CreateEnvelopeXY( -2001, -2002, 2001, 2002 );
+	
+    FdoPtr<FdoIGeometry>		  geom = gf->CreateGeometry(env); 
+	scinfo->mExtent = gf->GetFgf(geom);
+	scinfo->mXYTolerance = 0.0333;
+	scinfo->mZTolerance = 0.0111;
+
+    return scinfo;
+}
+
+bool FdoUpdateTest::GetHasElevation( FdoStringP objectName )
+{
+	bool						  hasElevation = true;
+
+	if ( objectName == L"TABLE_ID_GEOM_LL" )
+		hasElevation = false;
+
+    return hasElevation;
+}
+
 void FdoUpdateTest::CreateExternalData( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom, bool hasAssoc )
 {
 
@@ -2153,6 +2205,10 @@
     deleteCommand = NULL;
 }
 
+void FdoUpdateTest::UpdSpatialMetadata( FdoPtr<FdoIConnection> connection )
+{
+}
+
 void FdoUpdateTest::SelectNoMetaAll( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom, bool hasAssoc )
 {
     FdoPtr<FdoISelect> selectCommand = (FdoISelect *) connection->CreateCommand(FdoCommandType_Select);

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/FdoUpdateTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -60,7 +60,10 @@
 
     void CreateExternalTable( FdoSmPhOwnerP owner, FdoStringP tableName, bool hasKey, bool hasGeom, bool hasAssoc );
     void CreateExternalView( FdoSmPhOwnerP owner, FdoStringP viewName, FdoStringP tableName, bool hasKey, bool hasGeom, bool hasAssoc );
+	FdoPtr<FdoSmPhScInfo> CreateScInfo( FdoStringP objectName );
+    bool GetHasElevation( FdoStringP objectName );
     void CreateExternalData( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom, bool hasAssoc );
+    virtual void UpdSpatialMetadata( FdoPtr<FdoIConnection> connection );
     void SelectNoMetaAll( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom, bool hasAssoc );
     void SelectNoMetaFilter( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom, bool hasAssoc );
     void SelectNoMetaProps( FdoPtr<FdoIConnection> connection, FdoSmPhMgrP phMgr, FdoStringP tableName, bool hasGeom );
@@ -75,6 +78,7 @@
         bool hasAssoc
     );
     void CheckGeometry(FdoPtr<FdoIFeatureReader> rdr, FdoString* propName, double expectedX, double expectedY, double expectedZ);
+    virtual void CheckSpatialContexts(FdoPtr<FdoIConnection> connection, int expected);
 
     virtual FdoString* NoMetaSuffix();
     virtual FdoString* MultiIdSuffix();

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/Makefile.am
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/Makefile.am	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/Makefile.am	2007-03-21 20:38:20 UTC (rev 2702)
@@ -52,6 +52,7 @@
 GeometryTests.cpp \
 MessageTest.cpp \
 SchemaMgrTests.cpp \
+SchemaOverrideUtil.cpp \
 SelectTests.cpp \
 XmlFormatter.cpp \
 UnitTestUtil.cpp
@@ -85,6 +86,7 @@
 GeometryTests.h \
 MessageTest.h \
 SchemaMgrTests.h \
+SchemaOverrideUtil.h \
 SelectTests.h \
 StringPropertiesDictionary.h \
 UnitTestUtil.h \

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -1260,6 +1260,156 @@
     }
 }
 
+void SchemaMgrTests::testViews ()
+{
+    StaticConnection* conn = CreateStaticConnection();
+    FdoPtr<FdoIConnection> fdoConn;
+
+    try
+    {
+        char prvenv[100];
+        sprintf( prvenv, "provider=%s", conn->GetServiceName() );
+#ifdef _WIN32
+        _putenv( prvenv );
+#else
+        putenv( prvenv );
+#endif
+        FdoStringP provider = conn->GetServiceName();
+
+        // Sets the other env.
+        UnitTestUtil::SetProvider( conn->GetServiceName() ); 
+
+        printf( "Creating original schema ...\n" );
+
+        conn->connect();
+
+        FdoSchemaManagerP mgr = conn->CreateSchemaManager();
+
+        FdoSmPhGrdMgrP phMgr = mgr->GetPhysicalSchema()->SmartCast<FdoSmPhGrdMgr>();
+
+        FdoSmPhDatabaseP database = phMgr->GetDatabase();
+
+        GdbiConnection* gdbiConn = phMgr->GetGdbiConnection();
+        GdbiCommands* gdbiCommands = gdbiConn->GetCommands();
+
+        FdoStringP datastore = phMgr->GetDcOwnerName(
+            UnitTestUtil::GetEnviron("datastore", DB_NAME_SUFFIX)
+        );
+
+        FdoStringP fdatastore = phMgr->GetDcOwnerName(
+            UnitTestUtil::GetEnviron("datastore", DB_NAME_FOREIGN_SUFFIX)
+        );
+
+        FdoSmPhOwnerP owner = phMgr->FindOwner( datastore, L"", false );
+        if ( owner ) {
+            owner->SetElementState( FdoSchemaElementState_Deleted );
+            owner->Commit();
+        }
+
+        owner = database->CreateOwner(
+            datastore, 
+            false
+        );
+        owner->SetPassword( L"test" );
+    
+        FdoSmPhOwnerP fowner = phMgr->FindOwner( fdatastore, L"", false );
+        if ( fowner ) {
+            fowner->SetElementState( FdoSchemaElementState_Deleted );
+            fowner->Commit();
+        }
+
+        fowner = database->CreateOwner(
+            fdatastore, 
+            false
+        );
+        fowner->SetPassword( L"test" );
+    
+        FdoSmPhTableP tableA = owner->CreateTable( phMgr->GetDcDbObjectName(L"TABLE1") );
+        FdoSmPhColumnP column = tableA->CreateColumnInt32( phMgr->GetDcColumnName(L"ID"), false );
+        tableA->AddPkeyCol( column->GetName() );
+        column = tableA->CreateColumnInt32( phMgr->GetDcColumnName(L"PARENT_ID"), false );
+        column = tableA->CreateColumnInt16( phMgr->GetDcColumnName(L"INT16_COL1"), false );
+
+        FdoSmPhTableP tableB = fowner->CreateTable( phMgr->GetDcDbObjectName(L"TABLE1") );
+        column = tableB->CreateColumnInt32( phMgr->GetDcColumnName(L"ID"), false );
+        tableB->AddPkeyCol( column->GetName() );
+        column = tableB->CreateColumnInt32( phMgr->GetDcColumnName(L"PARENT_ID"), false );
+        column = tableB->CreateColumnInt16( phMgr->GetDcColumnName(L"INT16_COL1"), false );
+
+        database->Commit();
+
+        FdoSmPhGrdOwnerP grdOwner = fowner->SmartCast<FdoSmPhGrdOwner>();
+#ifdef RDBI_DEF_ORA
+        grdOwner->ActivateAndExecute( L"grant select on table1 to public" );
+#endif
+
+        FdoStringP createViewSql = FdoStringP::Format( 
+            L"create view view1 ( id, int16_col1, int16_col2b ) as select a.id, a.int16_col1, b.int16_col1 from %ls a, %ls b where a.id = b.parent_id", 
+            (FdoString*)(tableA->GetDbQName()),
+            (FdoString*)(tableA->GetDbQName())
+        );
+        grdOwner = owner->SmartCast<FdoSmPhGrdOwner>();
+        grdOwner->ActivateAndExecute( (FdoString*) createViewSql );
+
+        createViewSql = FdoStringP::Format( 
+            L"create view view2 ( id, int16_col1, int16_col2b ) as select a.id, a.int16_col1, b.int16_col1 from %ls a, %ls b where a.id = b.parent_id", 
+            (FdoString*)(tableA->GetDbQName()),
+            (FdoString*)(tableB->GetDbQName())
+        );
+        grdOwner->ActivateAndExecute( (FdoString*) createViewSql );
+
+        mgr = NULL;
+        phMgr = NULL;
+        conn->disconnect();
+        delete conn;
+        conn = CreateStaticConnection();
+        conn->connect();
+        mgr = conn->CreateSchemaManager();
+        phMgr = mgr->GetPhysicalSchema()->SmartCast<FdoSmPhGrdMgr>();
+
+        printf( "Autogenerating schema from datastore ...\n" );
+
+        fdoConn = UnitTestUtil::CreateConnection(
+            false,
+            false,
+            DB_NAME_SUFFIX
+        );
+
+        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) fdoConn->CreateCommand(FdoCommandType_DescribeSchema);
+        FdoFeatureSchemasP schemas = pDescCmd->Execute();
+        FdoFeatureSchemaP schema = schemas->GetItem(0);
+        FdoClassesP classes = schema->GetClasses();
+
+        CPPUNIT_ASSERT( classes->GetCount() == 3 );
+
+        FdoClassDefinitionP classDef = classes->GetItem( table2class(phMgr, L"VIEW1") );
+        FdoDataPropertiesP idProps = classDef->GetIdentityProperties();
+        CPPUNIT_ASSERT( idProps->GetCount() == (SupportsBaseObjects() ? 1 : 0) );
+
+        classDef = classes->GetItem( table2class(phMgr, L"VIEW2") );
+        idProps = classDef->GetIdentityProperties();
+#ifndef RDBI_DEF_SSQL
+        CPPUNIT_ASSERT( idProps->GetCount() == 0 );
+#endif
+
+        UnitTestUtil::CloseConnection( fdoConn, false, DB_NAME_SUFFIX );
+
+        printf( "Done\n" );
+    }
+    catch (FdoException* e ) 
+    {
+        UnitTestUtil::FailOnException(e);
+    }
+    catch (CppUnit::Exception exception)
+    {
+        throw exception;
+    }
+    catch (...)
+    {
+        CPPUNIT_FAIL ("unexpected exception encountered");
+    }
+}
+
 void SchemaMgrTests::testConfigError ()
 {
     FdoPtr<FdoIConnection> fdoConn;

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaMgrTests.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -31,6 +31,7 @@
     CPPUNIT_TEST (testGenConfig1);
     CPPUNIT_TEST (testGenKeys);
     CPPUNIT_TEST (testFKeys);
+    CPPUNIT_TEST (testViews);
     CPPUNIT_TEST (testConfigError);
 //    CPPUNIT_TEST (constraints);
 //    CPPUNIT_TEST (delFdoBr);
@@ -52,6 +53,8 @@
     // Also tests reverse-engineering foreign keys into Association properties for MySQL.
     virtual void testFKeys();
 
+    void testViews();
+
     virtual void testConfigError();
     void testGeometricProperties();
 

Added: trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.cpp	                        (rev 0)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -0,0 +1,32 @@
+ //
+ // Copyright (C) 2004-2006  Autodesk, Inc.
+ // 
+ // This library is free software; you can redistribute it and/or
+ // modify it under the terms of version 2.1 of the GNU Lesser
+ // General Public License as published by the Free Software Foundation.
+ // 
+ // This library is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ // Lesser General Public License for more details.
+ // 
+ // You should have received a copy of the GNU Lesser General Public
+ // License along with this library; if not, write to the Free Software
+ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+#include "Pch.h"
+#include "SchemaOverrideUtil.h"
+
+SchemaOverrideUtil::SchemaOverrideUtil(void)
+{
+}
+
+SchemaOverrideUtil::~SchemaOverrideUtil(void)
+{
+}
+
+void SchemaOverrideUtil::Dispose()
+{
+    delete this;
+}
+

Added: trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.h	                        (rev 0)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/SchemaOverrideUtil.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -0,0 +1,63 @@
+ //
+ // Copyright (C) 2004-2006  Autodesk, Inc.
+ // 
+ // This library is free software; you can redistribute it and/or
+ // modify it under the terms of version 2.1 of the GNU Lesser
+ // General Public License as published by the Free Software Foundation.
+ // 
+ // This library is distributed in the hope that it will be useful,
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ // Lesser General Public License for more details.
+ // 
+ // You should have received a copy of the GNU Lesser General Public
+ // License along with this library; if not, write to the Free Software
+ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+#ifndef CPP_UNIT_SCHEMAOVERRIDEUTIL_H
+#define CPP_UNIT_SCHEMAOVERRIDEUTIL_H
+
+#include <Rdbms/Override/RdbmsOvPhysicalSchemaMapping.h>
+
+/* 
+ * A test case for ApplySchemaCommand.
+ *
+ * Loads some schemas into a database.
+ */
+
+class SchemaOverrideUtil : public FdoIDisposable
+{
+public:
+    SchemaOverrideUtil(void);
+    virtual ~SchemaOverrideUtil(void);
+
+    
+
+    virtual FdoRdbmsOvClassDefinition* CreateOvClassDefinition(FdoString *name = NULL) { return NULL; };
+    virtual void ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass) {};
+    virtual FdoRdbmsOvTable* CreateOvTable(FdoString* name) { return NULL; };
+    virtual FdoRdbmsOvColumn* CreateOvColumn(FdoString* name) { return NULL; };
+    virtual FdoRdbmsOvGeometricColumn* CreateOvGeometricColumn(FdoString* name) { return NULL; };
+    virtual FdoRdbmsOvDataPropertyDefinition* CreateOvDataPropertyDefinition(FdoString *name) { return NULL; };
+    virtual FdoRdbmsOvGeometricPropertyDefinition* CreateOvGeometricPropertyDefinition(FdoString *name) { return NULL; };
+    virtual void PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp) {};
+    virtual void ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable) {};
+    virtual void TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace) {};
+    virtual void DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn) {};
+    virtual void GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn) {};
+    virtual void ColumnOvSetSequence(FdoRdbmsOvColumn* pColumn, FdoString *sequence) {};
+    virtual FdoRdbmsOvObjectPropertyDefinition* CreateOvObjectPropertyDefinition(FdoString *name) { return NULL; };
+    virtual FdoRdbmsOvPropertyMappingSingle* CreateOvPropertyMappingSingle() { return NULL; };
+    virtual FdoRdbmsOvPropertyMappingConcrete* CreateOvPropertyMappingConcrete() { return NULL; };
+    virtual void ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping) {};
+    virtual void PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass) {};
+    virtual void SchemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner) {};
+
+protected:
+    virtual void Dispose();
+
+};
+
+typedef FdoPtr<SchemaOverrideUtil> SchemaOverrideUtilP;
+
+#endif // CPP_UNIT_FDOAPPLYSCHEMATEST_H

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -163,13 +163,16 @@
 void UnitTestUtil::CreateAcadSchema( FdoIConnection* connection, bool useBaseMapping )
 {
     FdoIApplySchema*  pCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
-//    FdoPtr<FdoOracleOvPhysicalSchemaMapping>pOverrides;
-//    FdoPtr<FdoOracleOvClassDefinition>pOvClass;
-//    if( useBaseMapping )
-//    {
-//        pOverrides =  (FdoOracleOvPhysicalSchemaMapping*) connection->CreateSchemaMapping();
-//        pCmd->SetPhysicalMapping( pOverrides );
-//    }
+    FdoPtr<FdoRdbmsOvPhysicalSchemaMapping>pOverrides;
+    FdoPtr<FdoRdbmsOvClassDefinition>pOvClass;
+    SchemaOverrideUtilP overrideUtil = NewSchemaOverrideUtil();
+
+    if( useBaseMapping )
+    {
+        pOverrides =  (FdoRdbmsOvPhysicalSchemaMapping*) connection->CreateSchemaMapping();
+        pOverrides->SetTableMapping( FdoSmOvTableMappingType_BaseTable  );
+        pCmd->SetPhysicalMapping( pOverrides );
+    }
     FdoPtr<FdoFeatureSchemaCollection> pSchemas = FdoFeatureSchemaCollection::Create(NULL);
 
     FdoFeatureSchema* pSchema = FdoFeatureSchema::Create( L"Acad", L"AutoCAD schema" );
@@ -231,18 +234,18 @@
     testClass->GetProperties()->Add( pObjPropData );
     FDO_SAFE_RELEASE(pObjPropData);
 
-    //if( useBaseMapping )
-    //{
-    //    // Object Property overrides
-    //    pOvClass = FdoOracleOvClassDefinition::Create( L"testClass" );
-    //    pOvClass->SetTableMapping( FdoSmOvTableMappingType_BaseTable );
-    //    FdoOracleOvClassesP(pOverrides->GetClasses())->Add(pOvClass);
-    //    FdoOracleOvObjectPropertyP pObProp = FdoOracleOvObjectPropertyDefinition::Create( L"Object" );
-    //    FdoOracleOvPropertiesP(pOvClass->GetProperties())->Add(pObProp);
-    //    FdoOracleOvPropertyMappingSingleP mapping = FdoOracleOvPropertyMappingSingle::Create();
-    //    pObProp->SetMappingDefinition(mapping);
-    //    mapping->SetPrefix( L"OvTest" );
-    //}
+    if( useBaseMapping && overrideUtil )
+    {
+        // Object Property overrides
+        pOvClass = overrideUtil->CreateOvClassDefinition( L"testClass" );
+        pOvClass->SetTableMapping( FdoSmOvTableMappingType_BaseTable );
+        overrideUtil->ClassesOvAdd(pOverrides, pOvClass);
+        FdoRdbmsOvObjectPropertyP pObProp = overrideUtil->CreateOvObjectPropertyDefinition( L"Object" );
+        overrideUtil->PropertiesOvAdd(pOvClass, pObProp);
+        FdoRdbmsOvPropertyMappingSingleP mapping = overrideUtil->CreateOvPropertyMappingSingle();
+        overrideUtil->ObjectPropertyOvSetMappingDefinition(pObProp, mapping);
+        mapping->SetPrefix( L"OvTest" );
+    }
 
     FdoPtr<FdoObjectPropertyDefinition>pObjPropData2 = FdoObjectPropertyDefinition::Create( L"Object2", L"object property" );
     pObjPropData2->SetClass( pObjectClass2 );
@@ -309,16 +312,16 @@
     pObjPropData2->SetObjectType( FdoObjectType_Value );
     pXData->GetProperties()->Add( pObjPropData2 );
 
-    //if( useBaseMapping )
-    //{
-    //    pOvClass = FdoOracleOvClassDefinition::Create( L"AcXData" );
-    //    FdoOracleOvClassesP(pOverrides->GetClasses())->Add(pOvClass);
-    //    FdoOracleOvObjectPropertyP pObProp = FdoOracleOvObjectPropertyDefinition::Create( L"AcXObj" );
-    //    FdoOracleOvPropertiesP(pOvClass->GetProperties())->Add(pObProp);
-    //    FdoOracleOvPropertyMappingSingleP mapping = FdoOracleOvPropertyMappingSingle::Create();
-    //    pObProp->SetMappingDefinition(mapping);
-    //    mapping->SetPrefix( L"OvTest2" );
-    //}
+    if( useBaseMapping && overrideUtil )
+    {
+        pOvClass = overrideUtil->CreateOvClassDefinition( L"AcXData" );
+        overrideUtil->ClassesOvAdd(pOverrides, pOvClass);
+        FdoRdbmsOvObjectPropertyP pObProp = overrideUtil->CreateOvObjectPropertyDefinition( L"AcXObj" );
+        overrideUtil->PropertiesOvAdd(pOvClass, pObProp);
+        FdoRdbmsOvPropertyMappingSingleP mapping = overrideUtil->CreateOvPropertyMappingSingle();
+        overrideUtil->ObjectPropertyOvSetMappingDefinition(pObProp, mapping);
+        mapping->SetPrefix( L"OvTest2" );
+    }
     pSchema->GetClasses()->Add( pXData );
 
     FdoClass* pXData2 = FdoClass::Create( L"AcXData2", L"Xdata2" );
@@ -432,6 +435,7 @@
     FdoObjectPropertyDefinition* pObjProp = FdoObjectPropertyDefinition::Create( L"xdata", L"xdata" );
     pObjProp->SetClass( pXData );
     pObjProp->SetObjectType( FdoObjectType_Value );
+	//pObjProp->SetIdentityProperty( pXDataSeq );
     pEntClass->GetProperties()->Add( pObjProp );
     FDO_SAFE_RELEASE(pProp);
 
@@ -491,7 +495,8 @@
 {
     // Version must be incremented each time the following Land schema is updated.
     // This forces a re-create of the Land Schema in existing datastores.
-    static wchar_t* currVersion = L"1.6";
+    static wchar_t* currVersion = L"1.7";
+    FdoPtr<FdoISchemaCapabilities>	schemaCap = connection->GetSchemaCapabilities();    
 
     FdoPtr<FdoIDescribeSchema> pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
 
@@ -502,7 +507,7 @@
 
     // If it does, check if it has the current version. The version is kept in
     // the Schema Attribute dictionary.
-/*
+
     if ( pSchema ) {
         if ( (!FdoSADP(pSchema->GetAttributes())->ContainsAttribute(L"version")) ||
              (wcscmp(FdoSADP(pSchema->GetAttributes())->GetAttributeValue(L"version"), currVersion) != 0) ) {
@@ -511,13 +516,13 @@
             // First, delete any objects, since these will prevent schema destruction.
 
             FdoPtr<FdoIDelete> deleteCommand = (FdoIDelete *) connection->CreateCommand(FdoCommandType_Delete);
-            deleteCommand->SetFeatureClassName(L"Ind\x00fcstri\x00e4l P\x00e4rcel");
+            deleteCommand->SetFeatureClassName(L"L\x00e4nd:Ind\x00fcstri\x00e4l P\x00e4rcel");
             deleteCommand->Execute();
 
-            deleteCommand->SetFeatureClassName(L"Municipality");
+            deleteCommand->SetFeatureClassName(L"L\x00e4nd:Municipality");
             deleteCommand->Execute();
 
-            deleteCommand->SetFeatureClassName(L"Parcel");
+            deleteCommand->SetFeatureClassName(L"L\x00e4nd:Parcel");
             deleteCommand->Execute();
 
             FdoPtr<FdoIDestroySchema>  pCmd = (FdoIDestroySchema*) connection->CreateCommand(FdoCommandType_DestroySchema);
@@ -526,7 +531,7 @@
             pSchema = NULL;
         }
     }
-*/
+
     if ( !pSchema )
     {
         FdoPtr<FdoIApplySchema>  pCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
@@ -565,6 +570,22 @@
         FdoPropertiesP(pParcelClass->GetProperties())->Add( pProp );
         FdoDataPropertiesP(pParcelClass->GetIdentityProperties())->Add( pProp );
 
+/*
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    GisPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    GisPtr<FdoDataValue>   val1 = FdoDataValue::Create( L"A" );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    GisPtr<FdoDataValue>   val2 = FdoDataValue::Create( L"z" );
+		    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+*/
+
         pProp = FdoDataPropertyDefinition::Create( L"PIN", L"parcel id" );
         pProp->SetDataType( FdoDataType_String );
         pProp->SetLength(15);
@@ -579,6 +600,20 @@
         pProp->SetScale( 0 );
         FdoPropertiesP(pParcelClass->GetProperties())->Add( pProp );
 
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    FdoPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    FdoPtr<FdoDataValue>   val1 = FdoDataValue::Create( (double) 0, FdoDataType_Decimal );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    FdoPtr<FdoDataValue>   val2 = FdoDataValue::Create( 100000000, FdoDataType_Decimal );
+		    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+
         pProp = FdoDataPropertyDefinition::Create( L"AUTOGEN1", L"1st autogenerated property" );
         pProp->SetDataType( FdoDataType_Int64 );
         pProp->SetNullable(true);
@@ -604,6 +639,45 @@
         pGeomProp->SetHasElevation( true );
         FdoClassesP(pSchema->GetClasses())->Add( pParcelClass );
 
+		FdoPtr<FdoFeatureClass> pParcelAClass = FdoFeatureClass::Create( L"Parcel_A", L"land parcel" );
+		pParcelAClass->SetIsAbstract(false);
+
+		pProp = FdoDataPropertyDefinition::Create( L"Name", L"" );
+		pProp->SetDataType( FdoDataType_String );
+		pProp->SetLength(20);
+		pProp->SetNullable(false);
+		FdoPropertiesP(pParcelAClass->GetProperties())->Add( pProp );
+
+		pProp = FdoDataPropertyDefinition::Create( L"PIN", L"parcel id" );
+		pProp->SetDataType( FdoDataType_String );
+		pProp->SetLength(15);
+		pProp->SetNullable(false);
+		FdoPropertiesP(pParcelAClass->GetProperties())->Add( pProp );
+		FdoDataPropertiesP(pParcelAClass->GetIdentityProperties())->Add( pProp );
+
+		pProp = FdoDataPropertyDefinition::Create( L"Value", L"" );
+		pProp->SetDataType( FdoDataType_Decimal );
+		pProp->SetNullable(true);
+		pProp->SetPrecision( 8 );
+		pProp->SetScale( 0 );
+		FdoPropertiesP(pParcelAClass->GetProperties())->Add( pProp );
+
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    FdoPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    FdoPtr<FdoDataValue>   val1 = FdoDataValue::Create( (double) 0, FdoDataType_Decimal );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    FdoPtr<FdoDataValue>   val2 = FdoDataValue::Create( 100000000, FdoDataType_Decimal );
+		    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+
+		FdoClassesP(pSchema->GetClasses())->Add( pParcelAClass );
+
         FdoPtr<FdoFeatureClass> pClass = FdoFeatureClass::Create( L"Ind\x00fcstri\x00e4l P\x00e4rcel", L"" );
         pClass->SetIsAbstract(false);
         pClass->SetBaseClass( pParcelClass );
@@ -632,6 +706,20 @@
         pProp->SetNullable(false);
         FdoPropertiesP(pCityClass->GetProperties())->Add( pProp );
 
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    FdoPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    FdoPtr<FdoDataValue>   val1 = FdoDataValue::Create( 0 );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    FdoPtr<FdoDataValue>   val2 = FdoDataValue::Create( 100000000 );
+		    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+
         pObjProp = FdoObjectPropertyDefinition::Create( L"mayor", L"" );
         pObjProp->SetObjectType( FdoObjectType_Value );
         pObjProp->SetClass( pPersonClass );
@@ -645,6 +733,68 @@
 
         FdoClassesP(pSchema->GetClasses())->Add( pCityClass );
 
+	    FdoFeatureClassP pZoningClass = FdoFeatureClass::Create( L"Zoning", L"land use zone" );
+	    pZoningClass->SetIsAbstract(false);
+
+ 	    pProp = FdoDataPropertyDefinition::Create( L"ByLaw", L"" );
+	    pProp->SetDataType( FdoDataType_String );
+	    pProp->SetLength(20);
+	    pProp->SetNullable(false);
+	    FdoPropertiesP(pZoningClass->GetProperties())->Add( pProp );
+	    FdoDataPropertiesP(pZoningClass->GetIdentityProperties())->Add( pProp );
+
+	    pProp = FdoDataPropertyDefinition::Create( L"ZoningType", L"" );
+	    pProp->SetDataType( FdoDataType_Int32 );
+	    pProp->SetNullable(false);
+	    FdoPropertiesP(pZoningClass->GetProperties())->Add( pProp );
+
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    FdoPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    FdoPtr<FdoDataValue>   val1 = FdoDataValue::Create( 1 );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    FdoPtr<FdoDataValue>   val2 = FdoDataValue::Create( 20 );
+    	    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+
+	    FdoClassesP(pSchema->GetClasses())->Add( pZoningClass );
+
+	    pZoningClass = FdoFeatureClass::Create( L"Zoning_A", L"land use zone" );
+	    pZoningClass->SetIsAbstract(false);
+
+	    pProp = FdoDataPropertyDefinition::Create( L"ByLaw", L"" );
+	    pProp->SetDataType( FdoDataType_String );
+	    pProp->SetLength(20);
+	    pProp->SetNullable(false);
+	    FdoPropertiesP(pZoningClass->GetProperties())->Add( pProp );
+	    FdoDataPropertiesP(pZoningClass->GetIdentityProperties())->Add( pProp );
+
+	    pProp = FdoDataPropertyDefinition::Create( L"ZoningType", L"" );
+	    pProp->SetDataType( FdoDataType_Int32 );
+	    pProp->SetNullable(false);
+	    FdoPropertiesP(pZoningClass->GetProperties())->Add( pProp );
+
+ 	    if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
+	    {
+		    FdoPtr<FdoPropertyValueConstraintRange>  newRangeConstr1 =  FdoPropertyValueConstraintRange::Create();
+		    newRangeConstr1->SetMinInclusive(true);
+
+		    FdoPtr<FdoDataValue>   val1 = FdoDataValue::Create( 21 );
+		    newRangeConstr1->SetMinValue( val1 );
+
+		    newRangeConstr1->SetMaxInclusive(true);
+		    FdoPtr<FdoDataValue>   val2 = FdoDataValue::Create( 40 );
+		    newRangeConstr1->SetMaxValue( val2 );
+		    pProp->SetValueConstraint(newRangeConstr1);
+	    }
+
+	    FdoClassesP(pSchema->GetClasses())->Add( pZoningClass );
+
         pCmd->SetFeatureSchema( pSchema );
         pCmd->Execute();
     }
@@ -655,7 +805,7 @@
 {
     // Version must be incremented each time the following Land schema is updated.
     // This forces a re-create of the NonUnique Schema in existing datastores.
-    static wchar_t* currVersion = L"1.2";
+    static wchar_t* currVersion = L"1.3";
 
     FdoPtr<FdoIDescribeSchema> pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
 
@@ -923,8 +1073,8 @@
 
 	// Optimization: This has been already checked in GetConnection(). Make sure the caller 
 	// checks the existence explictly.
-	//bool bExists = DatastoreExists(suffix);
-	bool bExists = false;
+	bool bExists = DatastoreExists(suffix);
+	//bool bExists = false;
 
     if (bExists == false)
     {
@@ -936,7 +1086,6 @@
         connection->SetConnectionString ( connectString);
         connection->Open ();
 
-//		connection->GetDbiConnection()->dbi_set_lt_method(local_lt_method);
         if( addSchema )
         {
             try
@@ -1308,37 +1457,45 @@
     return(found);
 }
 
-FdoIConnection* UnitTestUtil::GetConnection(FdoString *suffix, bool bCreate, StringConnTypeRequest pTypeReq, int lt_method, bool lt_method_fixed)
+FdoIConnection* UnitTestUtil::GetConnection(FdoString *suffix, bool bCreate, bool bRecreateData, StringConnTypeRequest pTypeReq, int lt_method, bool lt_method_fixed)
 {
     FdoIConnection* connection = GetProviderConnectionObject();
 
     try {
 
-		if (bCreate)
+        bool bCreated = false;
+        if (bCreate)
         {
-            bool bExists = DatastoreExists(suffix);
+            bool bExists = UnitTestUtil::DatastoreExists(suffix);
             if (!bExists)
             {
 				UnitTestUtil::CreateDB(true, false, suffix, lt_method, lt_method_fixed);
-				
-				FdoInsertTest *insert = UnitTestUtil::InfoUtilConnection->GetInsertTest();
-                insert->setUp();
-                insert->insert();
-                delete insert;
-/* TODO
-                insert = new FdoInsertTest();
-                insert->setUp();
-                insert->insert2();
-                delete insert;
-*/
+                bCreated = true;
             }
         }
-        wchar_t *connectionString = UnitTestUtil::GetConnectionString(pTypeReq, suffix);
+        wchar_t *connectionString = UnitTestUtil::GetConnectionString(Connection_WithDatastore, suffix);
 
         FdoConnectionState state = connection->GetConnectionState();
-        connection->SetConnectionString(connectionString);
+      	connection->SetConnectionString(connectionString);
 
         connection->Open();
+        if ( (!bCreated) && bRecreateData ) {
+            TestCommonMiscUtil::DeleteObjects( connection, L"Acad", L"AcDb3dPolyline", NULL );
+            TestCommonMiscUtil::DeleteObjects( connection, L"L\x00e4nd", L"Parcel", NULL );
+            TestCommonMiscUtil::DeleteObjects( connection, L"Acad", L"testClass", NULL );
+        }
+
+        if ( bCreated || bRecreateData ) {
+            FdoInsertTest *insert = new FdoInsertTest(suffix);
+
+            insert->setUp();
+            insert->insert();
+            delete insert;
+            insert = new FdoInsertTest(suffix);
+            insert->setUp();
+            insert->insert2();
+            delete insert;
+        }
     }
     catch ( FdoException* e )
     {
@@ -1362,6 +1519,11 @@
 	return UnitTestUtil::InfoUtilConnection->NewStaticConnection();
 }
 
+SchemaOverrideUtilP UnitTestUtil::NewSchemaOverrideUtil()
+{
+	return UnitTestUtil::InfoUtilConnection->NewSchemaOverrideUtil();
+}
+
 bool UnitTestUtil::fuzzyEqual (const double d1, const double d2)
 {
     if ((d1==0.0) || (d2==0.0))

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Common/UnitTestUtil.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -21,6 +21,7 @@
 
 // Various utility functions to help with unit testing.
 #include <Sm/SchemaManager.h>
+#include "SchemaOverrideUtil.h"
 
 enum StringConnTypeRequest {
     Connection_WithDatastore,
@@ -147,8 +148,9 @@
     //      false - otherwise.
     static bool DatastoreExists(FdoString *suffix = L"");
     
-	static FdoIConnection* GetConnection(FdoString *suffix = L"", bool bCreate = false, StringConnTypeRequest pTypeReq = Connection_WithDatastore, int lt_method = 0, bool lt_method_fixed = false );
+	static FdoIConnection* GetConnection(FdoString *suffix = L"", bool bCreate = false, bool bRecreateData = false, StringConnTypeRequest pTypeReq = Connection_WithDatastore, int lt_method = 0, bool lt_method_fixed = false );
     static StaticConnection* NewStaticConnection();
+    static SchemaOverrideUtilP NewSchemaOverrideUtil();
 
 	// compares two doubles for *approximate* equality:
     static bool fuzzyEqual (const double d1, const double d2);

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/Makefile.am
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/Makefile.am	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/Makefile.am	2007-03-21 20:38:20 UTC (rev 2702)
@@ -50,6 +50,7 @@
 MySqlFdoUpdateTest.cpp \
 MySqlGeometryTests.cpp \
 MySqlSchemaMgrTests.cpp \
+MySqlSchemaOverrideUtil.cpp \
 MySqlSelectTests.cpp
 
 noinst_HEADERS = $(libMySqlUnitTests_la_SOURCES) \
@@ -81,6 +82,7 @@
 MySqlFdoUpdateTest.h \
 MySqlGeometryTests.h \
 MySqlSchemaMgrTests.h \
+MySqlSchemaOverrideUtil.h \
 MySqlSelectTests.h
 
 INCLUDES = \
@@ -101,7 +103,8 @@
   -I../ \
   -I../Common \
   -I../../Fdo/FeatureCommands \
-  -I$(FDOUTILITIES)/TestCommon/Inc
+  -I$(FDOUTILITIES)/TestCommon/Inc \
+  -I../../../Inc
 
 libMySqlUnitTests_la_LDFLAGS =
 

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -18,6 +18,7 @@
 
 #include "Pch.h"
 #include "MySqlConnectionUtil.h"
+#include "MySqlSchemaOverrideUtil.h"
 #include "UnitTestUtil.h"
 #include "MySqlFdoInsertTest.h"
 #include "../../MySQL/SchemaMgr/SchemaManager.h"
@@ -200,6 +201,11 @@
 	return new MySqlStaticConnection();
 }
 
+SchemaOverrideUtilP MySqlConnectionUtil::NewSchemaOverrideUtil()
+{
+    return new MySqlSchemaOverrideUtil();
+}
+
 FdoInsertTest* MySqlConnectionUtil::GetInsertTest ()
 {
 	return new MySqlFdoInsertTest();

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlConnectionUtil.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -44,6 +44,7 @@
 
 	virtual void SetProvider( const char *providerName );
 	virtual StaticConnection* NewStaticConnection ();
+    virtual SchemaOverrideUtilP NewSchemaOverrideUtil();
 	virtual FdoInsertTest* GetInsertTest ();
 	virtual FdoStringP GetOutputFileName (FdoString* pBaseFileName);
 };

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -25,7 +25,12 @@
 
 void MySqlDescribeSchemaTest::set_provider()
 {
-    mInputSchema = mSchema;
     mInputData = mData;
     UnitTestUtil::SetProvider( "MySql" );
 }
+
+FdoInt32 MySqlDescribeSchemaTest::GetLockTypeCount()
+{
+    return 0;
+}
+

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlDescribeSchemaTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -27,6 +27,7 @@
     CPPUNIT_TEST_SUITE_END ();
 
     void  set_provider();
+    virtual FdoInt32 GetLockTypeCount();
 };
 
 #endif // MYSQL_DESCRIBESCHEMA_H

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -64,11 +64,6 @@
     }
 }
 
-void MySqlFdoApplySchemaTest::ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass)
-{
-    FdoMySQLOvClassesP(((FdoMySQLOvPhysicalSchemaMapping*)pSchema)->GetClasses())->Add((FdoMySQLOvClassDefinition*)pClass);
-}
-
 FdoRdbmsOvTable* MySqlFdoApplySchemaTest::CreateOvTable(FdoString* name)
 {
     FdoMySQLOvTable* table = FdoMySQLOvTable::Create(name);
@@ -103,82 +98,6 @@
     return table;
 }
 
-FdoRdbmsOvColumn* MySqlFdoApplySchemaTest::CreateOvColumn(FdoString* name)
-{
-    return FdoMySQLOvColumn::Create(name);
-}
-
-FdoRdbmsOvGeometricColumn* MySqlFdoApplySchemaTest::CreateOvGeometricColumn(FdoString* name)
-{
-    return FdoMySQLOvGeometricColumn::Create(name);
-}
-
-FdoRdbmsOvDataPropertyDefinition* MySqlFdoApplySchemaTest::CreateOvDataPropertyDefinition(FdoString *name)
-{
-    return FdoMySQLOvDataPropertyDefinition::Create(name);
-}
-
-FdoRdbmsOvGeometricPropertyDefinition* MySqlFdoApplySchemaTest::CreateOvGeometricPropertyDefinition(FdoString *name)
-{
-    return FdoMySQLOvGeometricPropertyDefinition::Create(name);
-}
-
-void MySqlFdoApplySchemaTest::PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp)
-{
-    FdoMySQLOvPropertiesP(((FdoMySQLOvClassDefinition*)pClass)->GetProperties())->Add(dynamic_cast<FdoMySQLOvPropertyDefinition*>(pProp));
-}
-
-void MySqlFdoApplySchemaTest::ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable)
-{
-    ((FdoMySQLOvClassDefinition*)pClass)->SetTable((FdoMySQLOvTable*)pTable);
-}
-
-void MySqlFdoApplySchemaTest::TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace)
-{
-    // do nothing (MySQL doesn't support tablespace per se)
-}
-
-void MySqlFdoApplySchemaTest::DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn)
-{
-    ((FdoMySQLOvDataPropertyDefinition*)pDataProp)->SetColumn((FdoMySQLOvColumn*)pDataColumn);
-}
-
-void MySqlFdoApplySchemaTest::GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn)
-{
-    ((FdoMySQLOvGeometricPropertyDefinition*)pGeomProp)->SetColumn((FdoMySQLOvGeometricColumn*)pGeometricColumn);
-}
-
-FdoRdbmsOvObjectPropertyDefinition* MySqlFdoApplySchemaTest::CreateOvObjectPropertyDefinition(FdoString *name)
-{
-    return FdoMySQLOvObjectPropertyDefinition::Create(name);
-}
-
-FdoRdbmsOvPropertyMappingSingle* MySqlFdoApplySchemaTest::CreateOvPropertyMappingSingle()
-{
-    return FdoMySQLOvPropertyMappingSingle::Create();
-}
-
-FdoRdbmsOvPropertyMappingConcrete* MySqlFdoApplySchemaTest::CreateOvPropertyMappingConcrete()
-{
-    return FdoMySQLOvPropertyMappingConcrete::Create();
-}
-
-void MySqlFdoApplySchemaTest::ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping)
-{
-    ((FdoMySQLOvObjectPropertyDefinition*)pObProp)->SetMappingDefinition(dynamic_cast<FdoMySQLOvPropertyMappingDefinition*>(mapping));
-}
-
-void MySqlFdoApplySchemaTest::PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass)
-{
-    (dynamic_cast<FdoMySQLOvPropertyMappingRelation*>(pMapping))->SetInternalClass((FdoMySQLOvClassDefinition*)pClass);
-}
-
-void MySqlFdoApplySchemaTest::ShemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner)
-{
-    //FDO owner corresponds to a MySQL database.
-    ((FdoMySQLOvPhysicalSchemaMapping*)mapping)->SetDatabase( owner );
-}
-
 void MySqlFdoApplySchemaTest::VldClassCapabilities( int ltMode, int lckMode, FdoClassDefinition* pClass )
 {
     // The following verifies that the AcDbEntity class capabilities are valid.

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlFdoApplySchemaTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -37,23 +37,7 @@
    	virtual FdoRdbmsOvPhysicalSchemaMapping* CreateOverrideDefaults( FdoIConnection* connection, int passNum );
     virtual void CreateRdbmsSpecificElements(FdoIConnection* connection, FdoString* wDatastore);
     virtual FdoRdbmsOvClassDefinition* CreateOvClassDefinition(FdoString *name = NULL);
-    virtual void ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass);
     virtual FdoRdbmsOvTable* CreateOvTable(FdoString* name);
-    virtual FdoRdbmsOvColumn* CreateOvColumn(FdoString* name);
-    virtual FdoRdbmsOvGeometricColumn* CreateOvGeometricColumn(FdoString* name);
-    virtual FdoRdbmsOvDataPropertyDefinition* CreateOvDataPropertyDefinition(FdoString *name);
-    virtual FdoRdbmsOvGeometricPropertyDefinition* CreateOvGeometricPropertyDefinition(FdoString *name);
-    virtual void PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp);
-    virtual void ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable);
-    virtual void TableOvSetTablespace(FdoRdbmsOvTable* pTable, FdoString *tablespace);
-    virtual void DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn);
-    virtual void GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn);
-    virtual FdoRdbmsOvObjectPropertyDefinition* CreateOvObjectPropertyDefinition(FdoString *name);
-    virtual FdoRdbmsOvPropertyMappingSingle* CreateOvPropertyMappingSingle();
-    virtual FdoRdbmsOvPropertyMappingConcrete* CreateOvPropertyMappingConcrete();
-    virtual void ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping);
-    virtual void PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass);
-    virtual void ShemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner);
 
     virtual void VldClassCapabilities( int ltMode, int lckMode, FdoClassDefinition* pClass );
 

Added: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.cpp	                        (rev 0)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2004-2006  Autodesk, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2.1 of the GNU Lesser
+ * General Public License as published by the Free Software Foundation.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include "Pch.h"
+#include "MySqlSchemaOverrideUtil.h"
+
+FdoRdbmsOvClassDefinition* MySqlSchemaOverrideUtil::CreateOvClassDefinition(FdoString *name)
+{
+    if (name == NULL)
+        return FdoMySQLOvClassDefinition::Create();
+    else
+        return FdoMySQLOvClassDefinition::Create(name);
+}
+
+void MySqlSchemaOverrideUtil::ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass)
+{
+    FdoMySQLOvClassesP(((FdoMySQLOvPhysicalSchemaMapping*)pSchema)->GetClasses())->Add((FdoMySQLOvClassDefinition*)pClass);
+}
+
+FdoRdbmsOvTable* MySqlSchemaOverrideUtil::CreateOvTable(FdoString* name)
+{
+    FdoPtr<FdoMySQLOvTable> ovTable = FdoMySQLOvTable::Create(name);
+
+    return FDO_SAFE_ADDREF(ovTable.p);
+}
+
+FdoRdbmsOvColumn* MySqlSchemaOverrideUtil::CreateOvColumn(FdoString* name)
+{
+    return FdoMySQLOvColumn::Create(name);
+}
+
+FdoRdbmsOvGeometricColumn* MySqlSchemaOverrideUtil::CreateOvGeometricColumn(FdoString* name)
+{
+    return FdoMySQLOvGeometricColumn::Create(name);
+}
+
+FdoRdbmsOvDataPropertyDefinition* MySqlSchemaOverrideUtil::CreateOvDataPropertyDefinition(FdoString *name)
+{
+    return FdoMySQLOvDataPropertyDefinition::Create(name);
+}
+
+FdoRdbmsOvGeometricPropertyDefinition* MySqlSchemaOverrideUtil::CreateOvGeometricPropertyDefinition(FdoString *name)
+{
+    return FdoMySQLOvGeometricPropertyDefinition::Create(name);
+}
+
+void MySqlSchemaOverrideUtil::PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp)
+{
+    FdoMySQLOvPropertiesP(((FdoMySQLOvClassDefinition*)pClass)->GetProperties())->Add(dynamic_cast<FdoMySQLOvPropertyDefinition*>(pProp));
+}
+
+void MySqlSchemaOverrideUtil::ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable)
+{
+    ((FdoMySQLOvClassDefinition*)pClass)->SetTable((FdoMySQLOvTable*)pTable);
+}
+
+void MySqlSchemaOverrideUtil::DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn)
+{
+    ((FdoMySQLOvDataPropertyDefinition*)pDataProp)->SetColumn((FdoMySQLOvColumn*)pDataColumn);
+}
+
+void MySqlSchemaOverrideUtil::GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn)
+{
+    ((FdoMySQLOvGeometricPropertyDefinition*)pGeomProp)->SetColumn((FdoMySQLOvGeometricColumn*)pGeometricColumn);
+}
+
+FdoRdbmsOvObjectPropertyDefinition* MySqlSchemaOverrideUtil::CreateOvObjectPropertyDefinition(FdoString *name)
+{
+    return FdoMySQLOvObjectPropertyDefinition::Create(name);
+}
+
+FdoRdbmsOvPropertyMappingSingle* MySqlSchemaOverrideUtil::CreateOvPropertyMappingSingle()
+{
+    return FdoMySQLOvPropertyMappingSingle::Create();
+}
+
+FdoRdbmsOvPropertyMappingConcrete* MySqlSchemaOverrideUtil::CreateOvPropertyMappingConcrete()
+{
+    return FdoMySQLOvPropertyMappingConcrete::Create();
+}
+
+void MySqlSchemaOverrideUtil::ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping)
+{
+    ((FdoMySQLOvObjectPropertyDefinition*)pObProp)->SetMappingDefinition(dynamic_cast<FdoMySQLOvPropertyMappingDefinition*>(mapping));
+}
+
+void MySqlSchemaOverrideUtil::PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass)
+{
+    (dynamic_cast<FdoMySQLOvPropertyMappingRelation*>(pMapping))->SetInternalClass((FdoMySQLOvClassDefinition*)pClass);
+}
+
+void MySqlSchemaOverrideUtil::SchemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner)
+{
+    ((FdoMySQLOvPhysicalSchemaMapping*)mapping)->SetDatabase( owner );
+}
+

Added: trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.h	                        (rev 0)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/MySql/MySqlSchemaOverrideUtil.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2004-2006  Autodesk, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2.1 of the GNU Lesser
+ * General Public License as published by the Free Software Foundation.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef MYSQL_SCHEMAOVERRIDEUTIL_H
+#define MYSQL_SCHEMAOVERRIDEUTIL_H
+
+#include "SchemaOverrideUtil.h"
+#include <Rdbms/Override/MySQL/MySqlOvPropertyMappingSingle.h>
+#include <Rdbms/Override/MySQL/MySqlOvPropertyMappingConcrete.h>
+#include <Rdbms/Override/MySQL/MySqlOvPhysicalSchemaMapping.h>
+
+class MySqlSchemaOverrideUtil : public SchemaOverrideUtil
+{
+    // Helper methods for overrides tests; overriden by each provider:
+    virtual FdoRdbmsOvClassDefinition* CreateOvClassDefinition(FdoString *name = NULL);
+    virtual void ClassesOvAdd(FdoRdbmsOvPhysicalSchemaMapping* pSchema, FdoRdbmsOvClassDefinition* pClass);
+    virtual FdoRdbmsOvTable* CreateOvTable(FdoString* name);
+    virtual FdoRdbmsOvColumn* CreateOvColumn(FdoString* name);
+    virtual FdoRdbmsOvGeometricColumn* CreateOvGeometricColumn(FdoString* name);
+    virtual FdoRdbmsOvDataPropertyDefinition* CreateOvDataPropertyDefinition(FdoString *name);
+    virtual FdoRdbmsOvGeometricPropertyDefinition* CreateOvGeometricPropertyDefinition(FdoString *name);
+    virtual void PropertiesOvAdd(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvPropertyDefinition *pProp);
+    virtual void ClassOvSetTable(FdoRdbmsOvClassDefinition* pClass, FdoRdbmsOvTable* pTable);
+    virtual void DataPropOvSetColumn(FdoRdbmsOvDataPropertyDefinition* pDataProp, FdoRdbmsOvColumn* pDataColumn);
+    virtual void GeometricPropOvSetColumn(FdoRdbmsOvGeometricPropertyDefinition* pGeomProp, FdoRdbmsOvGeometricColumn* pGeometricColumn);
+    virtual FdoRdbmsOvObjectPropertyDefinition* CreateOvObjectPropertyDefinition(FdoString *name);
+    virtual FdoRdbmsOvPropertyMappingSingle* CreateOvPropertyMappingSingle();
+    virtual FdoRdbmsOvPropertyMappingConcrete* CreateOvPropertyMappingConcrete();
+    virtual void ObjectPropertyOvSetMappingDefinition(FdoRdbmsOvObjectPropertyDefinition* pObProp, FdoRdbmsOvPropertyMappingDefinition* mapping);
+    virtual void PropertyMappingOvSetInternalClass(FdoRdbmsOvPropertyMappingRelation* pMapping, FdoRdbmsOvClassDefinition* pClass);
+    virtual void SchemaOvSetOwner(FdoRdbmsOvPhysicalSchemaMapping *mapping, FdoString* owner);
+};
+
+#endif // MySql_FDOAPPLYSCHEMATEST_H

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcDescribeSchemaTest.cpp
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcDescribeSchemaTest.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcDescribeSchemaTest.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -48,7 +48,7 @@
 
 void OdbcDescribeSchemaTest::LoadTestData(FdoIConnection* connection)
 {
-	UnitTestUtil::Sql2Db( (const wchar_t**) mInputSchema, connection );
+	UnitTestUtil::Sql2Db( GetSchema(), connection );
 }
 void OdbcDescribeSchemaTest::describe()
 {
@@ -106,7 +106,6 @@
 
 void OdbcMySqlDescribeSchemaTest::set_provider()
 {
-    mInputSchema = mSchema;
     mInputData = NULL;
     UnitTestUtil::SetProvider( "OdbcMySql" );
 }
@@ -114,7 +113,6 @@
 #ifdef _WIN32
 void OdbcSqlServerDescribeSchemaTest::set_provider()
 {
-    mInputSchema = mSchema;
     mInputData = NULL;
     UnitTestUtil::SetProvider( "OdbcSqlServer" );
 }

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoInsertTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoInsertTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoInsertTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -42,6 +42,7 @@
     virtual void smartPointerInsert() {};
     virtual void conditionalInsert() {};
 	virtual void insertAutoGen() {};
+	virtual void featureReaderTest() {};
 
     virtual bool isPkeyAutogeneratedCities()            { return false; }
     virtual bool isPkeyAutogeneratedTable1()            { return false; }

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoSelectTest.h
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoSelectTest.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/Odbc/OdbcFdoSelectTest.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -41,6 +41,9 @@
     virtual void feature_subset_query2() {};
     virtual void feature_select_obj_distinct() {};
     virtual void feature_geom_query () {};
+    virtual void spatial_query_defect792377() {};
+    virtual void spatial_query_defect813611() {};
+    virtual void spatial_query_defect880310() {};
 
     virtual FdoString * GetClassName()          { return mSetup.LikesUC() ? L"TESTCLASS" : L"testClass"; };
 

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestMySql.vcproj
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestMySql.vcproj	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestMySql.vcproj	2007-03-21 20:38:20 UTC (rev 2702)
@@ -65,7 +65,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="cppunitd.lib FDO.lib FDOCommon.lib FDOGeometry.lib FdoGeneric.lib libmySQL.lib Rdbi.lib gdbi.lib schemamgrnew.lib MySQLDriver.lib mysqloverrides.lib mysqlschemamgr.lib ProvidersCommon.lib rdbmsoverrides.lib mysql.lib schemamgr_lpnew.lib schemamgr_phnew.lib SchemaMgr_OVNew.lib grdschemamgr.lib util.lib Advapi32.lib TestCommon.lib"
+				AdditionalDependencies="cppunitd.lib FDO.lib FDOCommon.lib FDOGeometry.lib FDOSpatial.lib FdoGeneric.lib libmySQL.lib Rdbi.lib gdbi.lib schemamgrnew.lib MySQLDriver.lib mysqloverrides.lib mysqlschemamgr.lib ProvidersCommon.lib rdbmsoverrides.lib mysql.lib schemamgr_lpnew.lib schemamgr_phnew.lib SchemaMgr_OVNew.lib grdschemamgr.lib util.lib Advapi32.lib TestCommon.lib"
 				LinkIncremental="2"
 				AdditionalLibraryDirectories="..\..\Lib\Win32\Debug;$(FDO)\Unmanaged\Lib\Win32\Debug;&quot;$(FDOUTILITIES)\Common\Lib\Win32\Debug&quot;;$(FDOTHIRDPARTY)\cppunit\lib;$(FDOMYSQL)\lib\Debug;$(FDOUTILITIES)\SchemaMgr\Lib\Win32\Debug;&quot;$(FDOUTILITIES)\TestCommon\Lib\Win32\Debug&quot;"
 				IgnoreDefaultLibraryNames="libcmtd.lib"
@@ -145,7 +145,7 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="cppunit.lib FDO.lib FDOCommon.lib FDOGeometry.lib FdoGeneric.lib libmySQL.lib Rdbi.lib gdbi.lib schemamgrnew.lib MySQLDriver.lib mysqloverrides.lib mysqlschemamgr.lib ProvidersCommon.lib rdbmsoverrides.lib mysql.lib schemamgr_lpnew.lib schemamgr_phnew.lib SchemaMgr_OVNew.lib grdschemamgr.lib util.lib Advapi32.lib TestCommon.lib"
+				AdditionalDependencies="cppunit.lib FDO.lib FDOCommon.lib FDOGeometry.lib FDOSpatial.lib FdoGeneric.lib libmySQL.lib Rdbi.lib gdbi.lib schemamgrnew.lib MySQLDriver.lib mysqloverrides.lib mysqlschemamgr.lib ProvidersCommon.lib rdbmsoverrides.lib mysql.lib schemamgr_lpnew.lib schemamgr_phnew.lib SchemaMgr_OVNew.lib grdschemamgr.lib util.lib Advapi32.lib TestCommon.lib"
 				AdditionalLibraryDirectories="..\..\Lib\Win32\Release;$(FDO)\Unmanaged\Lib\Win32\Release;&quot;$(FDOUTILITIES)\Common\Lib\Win32\Release&quot;;$(FDOTHIRDPARTY)\cppunit\lib;$(FDOMYSQL)\lib\opt;$(FDOUTILITIES)\SchemaMgr\Lib\Win32\Release;&quot;$(FDOUTILITIES)\TestCommon\Lib\Win32\Release&quot;"
 				IgnoreDefaultLibraryNames="libc.lib"
 			/>
@@ -696,10 +696,26 @@
 				>
 			</File>
 			<File
+				RelativePath=".\MySql\MySqlSchemaOverrideUtil.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\MySql\MySqlSchemaOverrideUtil.h"
+				>
+			</File>
+			<File
 				RelativePath=".\MySQL\MySqlTestRegister.cpp"
 				>
 			</File>
 			<File
+				RelativePath=".\Common\SchemaOverrideUtil.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Common\SchemaOverrideUtil.h"
+				>
+			</File>
+			<File
 				RelativePath=".\Common\StringPropertiesDictionary.h"
 				>
 			</File>

Modified: trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestOdbc.vcproj
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestOdbc.vcproj	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/UnitTestOdbc.vcproj	2007-03-21 20:38:20 UTC (rev 2702)
@@ -588,6 +588,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\Common\SchemaOverrideUtil.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\Common\SchemaOverrideUtil.h"
+				>
+			</File>
+			<File
 				RelativePath=".\Common\StringPropertiesDictionary.h"
 				>
 			</File>

Added: trunk/Providers/GenericRdbms/Src/UnitTest/apply_schema_lt_err1_master.txt
===================================================================
--- trunk/Providers/GenericRdbms/Src/UnitTest/apply_schema_lt_err1_master.txt	                        (rev 0)
+++ trunk/Providers/GenericRdbms/Src/UnitTest/apply_schema_lt_err1_master.txt	2007-03-21 20:38:20 UTC (rev 2702)
@@ -0,0 +1,8 @@
+ Schema LT has errors; cannot apply it 
+ Table {USER_DS}_APPLY_LT.DELSTATUS1 has rows; cannot add non nullable column NEWNUMBER to it 
+ Column {USER_DS}_APPLY_LT.DELSTATUS1.LTLOCK1 has conditional rows or rows with non-null values, cannot delete its property 
+ Column {USER_DS}_APPLY_LT.CIRCLE_LT1.VERSION1 has conditional rows or rows with non-null values, cannot delete its property 
+ Column {USER_DS}_APPLY_LT.CIRCLE_LT1.NEXTVER1 has conditional rows or rows with non-null values, cannot delete its property 
+ Column {USER_DS}_APPLY_LT.CIRCLE_LT1.REVISIONNUMBER has conditional rows or rows with non-null values, cannot delete its property 
+ Column {USER_DS}_APPLY_LT.CIRCLE_LT1.CLASSID has conditional rows or rows with non-null values, cannot delete its property 
+ Cannot delete table "{USER_DS}_APPLY_LT"."CIRCLE_LT1" because it has rows 

Modified: trunk/Utilities/SchemaMgr/Inc/Sm/Ph/BaseObject.h
===================================================================
--- trunk/Utilities/SchemaMgr/Inc/Sm/Ph/BaseObject.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/SchemaMgr/Inc/Sm/Ph/BaseObject.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -55,12 +55,25 @@
     const FdoSmPhDbObject* RefDbObject() const;
     FdoPtr<FdoSmPhDbObject> GetDbObject();
 
+    /// Overridden to generate a unique name qualified by owner and database, since
+    /// a base object collection can contain objects from different owners and databases.
+    virtual FdoString* GetName() const;
+
+    /// Get the referenced object's unqualified name
+    FdoStringP GetObjectName() const;
+
     /// Get the referenced object's owner name
     FdoStringP GetOwnerName() const;
 
     /// Get the referenced object's database name
     FdoStringP GetDatabaseName() const;
 
+    // returns number of times this base is referenced by child.
+    FdoInt32 GetBaseRefCount() const;
+
+    // Increment number of times this base is referenced by child
+    void AddBaseRef();
+
 protected:
     /// unused constructor needed only to build on Linux
     FdoSmPhBaseObject();
@@ -73,11 +86,13 @@
     virtual bool Delete() {return true;}
 
 private:
+    mutable FdoStringP mQName;
     FdoStringP mOwnerName;
     FdoStringP mDatabaseName;
 
     FdoPtr<FdoSmPhDbObject> mDbObject;
 
+    FdoInt32 mBaseRefCount;
 };
 
 typedef FdoPtr<FdoSmPhBaseObject> FdoSmPhBaseObjectP;

Modified: trunk/Utilities/SchemaMgr/Inc/Sm/SchemaElement.h
===================================================================
--- trunk/Utilities/SchemaMgr/Inc/Sm/SchemaElement.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/SchemaMgr/Inc/Sm/SchemaElement.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -41,7 +41,7 @@
     const FdoSmSchemaElement* GetParent() const;
 
     /// Returns the name of the schema object.
-    FdoString* GetName() const;
+    virtual FdoString* GetName() const;
 
     /// Get the fully qualified name for this element.
     /// This varies between element type so some types override this

Modified: trunk/Utilities/SchemaMgr/Src/Sm/Ph/BaseObject.cpp
===================================================================
--- trunk/Utilities/SchemaMgr/Src/Sm/Ph/BaseObject.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/SchemaMgr/Src/Sm/Ph/BaseObject.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -28,7 +28,8 @@
 ) : 
     FdoSmPhDbElement(name, (FdoSmPhMgr*) NULL, parent, FdoSchemaElementState_Detached ),
     mOwnerName(ownerName),
-    mDatabaseName(databaseName)
+    mDatabaseName(databaseName),
+    mBaseRefCount(1)
 {
     if ( ownerName == L"" ) 
         mOwnerName = parent->GetParent()->GetName();
@@ -41,7 +42,8 @@
     FdoSmPhDbElement(dbObject->GetName(), (FdoSmPhMgr*) NULL, parent, FdoSchemaElementState_Detached ),
     mOwnerName(dbObject->GetParent()->GetName()),
     mDatabaseName(dbObject->GetParent()->GetParent()->GetName()),
-    mDbObject(dbObject)
+    mDbObject(dbObject),
+    mBaseRefCount(1)
 {
 }
 
@@ -64,11 +66,29 @@
 FdoSmPhDbObjectP FdoSmPhBaseObject::GetDbObject()
 {
     if ( (wcslen(GetName()) > 0) && (!mDbObject) ) 
-        mDbObject = GetManager()->FindDbObject( GetName(), GetOwnerName(), GetDatabaseName() );
+        mDbObject = GetManager()->FindDbObject( FdoSmPhDbElement::GetName(), GetOwnerName(), GetDatabaseName() );
 
     return mDbObject;
 }
 
+FdoString* FdoSmPhBaseObject::GetName() const
+{
+    if ( mQName == L"" ) {
+        mQName = FdoStringP(L"\"") + GetOwnerName() + L"\".\"" + FdoSmPhDbElement::GetName() + L"\"";
+
+        if ( GetDatabaseName() != L"" ) {
+            mQName = FdoStringP(L"\"") + GetDatabaseName() + L"\"." + mQName;
+        }
+    }
+
+    return mQName;
+}
+
+FdoStringP FdoSmPhBaseObject::GetObjectName() const
+{
+    return FdoSmPhDbElement::GetName();
+}
+
 FdoStringP FdoSmPhBaseObject::GetOwnerName() const
 {
     return mOwnerName;
@@ -79,3 +99,12 @@
     return mDatabaseName;
 }
 
+FdoInt32 FdoSmPhBaseObject::GetBaseRefCount() const
+{
+    return mBaseRefCount;
+}
+
+void FdoSmPhBaseObject::AddBaseRef()
+{
+    mBaseRefCount++;
+}

Modified: trunk/Utilities/SchemaMgr/Src/Sm/Ph/DbObject.cpp
===================================================================
--- trunk/Utilities/SchemaMgr/Src/Sm/Ph/DbObject.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/SchemaMgr/Src/Sm/Ph/DbObject.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -169,7 +169,8 @@
 
     if ( baseObjects->GetCount() == 1 ) {
         FdoSmPhBaseObjectP baseObject = baseObjects->GetItem(0);
-        rootObject = baseObject->GetDbObject();
+        if ( baseObject->GetBaseRefCount() < 2 ) 
+            rootObject = baseObject->GetDbObject();
     }
 
     return rootObject;
@@ -195,7 +196,8 @@
 
     if ( baseObjects->GetCount() == 1 ) {
         const FdoSmPhBaseObject* baseObject = baseObjects->RefItem(0);
-        rootObjectName = baseObject->GetName();
+        if ( baseObject->GetBaseRefCount() < 2 ) 
+            rootObjectName = baseObject->GetObjectName();
     }
 
     return rootObjectName;
@@ -209,7 +211,8 @@
 
     if ( baseObjects->GetCount() == 1 ) {
         const FdoSmPhBaseObject* baseObject = baseObjects->RefItem(0);
-        rootOwnerName = baseObject->GetOwnerName();
+        if ( baseObject->GetBaseRefCount() < 2 ) 
+            rootOwnerName = baseObject->GetOwnerName();
     }
 
     return rootOwnerName;
@@ -223,7 +226,8 @@
 
     if ( baseObjects->GetCount() == 1 ) {
         const FdoSmPhBaseObject* baseObject = baseObjects->RefItem(0);
-        rootDatabaseName = baseObject->GetDatabaseName();
+        if ( baseObject->GetBaseRefCount() < 2 ) 
+            rootDatabaseName = baseObject->GetDatabaseName();
     }
 
     return rootDatabaseName;
@@ -1101,8 +1105,16 @@
 {
     while ( baseObjRdr->ReadNext() ) {
         FdoSmPhBaseObjectP newBaseObject = NewBaseObject( baseObjRdr );
-        if ( newBaseObject ) 
-            mBaseObjects->Add( newBaseObject );
+
+        if ( newBaseObject ) {
+            FdoSmPhBaseObjectP currBaseObject = mBaseObjects->FindItem( newBaseObject->GetName() );
+            if ( currBaseObject ) 
+                // Base object already in collection, just add a base reference.
+                currBaseObject->AddBaseRef();
+            else
+                // Not in collection, add it.
+                mBaseObjects->Add( newBaseObject );
+        }
     }
 }
 

Modified: trunk/Utilities/SchemaMgr/Src/Sm/Ph/Field.cpp
===================================================================
--- trunk/Utilities/SchemaMgr/Src/Sm/Ph/Field.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/SchemaMgr/Src/Sm/Ph/Field.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -158,8 +158,9 @@
 {
     FdoStringP colSyntax;
 
-    if ( GetColumn() ) {
-        colSyntax = GetColumn()->GetName();
+    FdoSmPhColumnP column = GetColumn();
+    if ( column && column->GetExists() ) {
+        colSyntax = column->GetName();
     }
 
     return colSyntax;

Modified: trunk/Utilities/TestCommon/Inc/TestCommonConstraints.h
===================================================================
--- trunk/Utilities/TestCommon/Inc/TestCommonConstraints.h	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/TestCommon/Inc/TestCommonConstraints.h	2007-03-21 20:38:20 UTC (rev 2702)
@@ -32,10 +32,19 @@
     CPPUNIT_TEST( TestRestrictCheckConstraints );
 	CPPUNIT_TEST( TestDateTimeConstraints );
     CPPUNIT_TEST( TestBaseReferences );
+    CPPUNIT_TEST( TestCreateLTConstraints );
+    CPPUNIT_TEST( TestDescribeLTConstraints );
+    CPPUNIT_TEST( TestUpdateLTUniqueConstraints );
+    CPPUNIT_TEST( TestUpdateLTCheckConstraints );
+    CPPUNIT_TEST( TestDescribeLTUpdatedConstraints );
 
 	CPPUNIT_TEST_SUITE_END();
 
 public:
+	TestCommonConstraints(void);
+    virtual ~TestCommonConstraints(void);
+    virtual void setUp ();
+
     virtual void TestCreateConstraints(void);
 	virtual void TestDescribeConstraints(void);
 	virtual void TestUpdateUniqueConstraints(void);
@@ -43,27 +52,45 @@
 	virtual void TestDescribeUpdatedConstraints(void);
 	virtual void TestRestrictCheckConstraints(void);
 	virtual void TestDateTimeConstraints(void);
+    virtual void TestCreateLTConstraints(void);
+	virtual void TestDescribeLTConstraints(void);
+	virtual void TestUpdateLTUniqueConstraints(void);
+	virtual void TestUpdateLTCheckConstraints(void);
+	virtual void TestDescribeLTUpdatedConstraints(void);
 
+protected:
+
+    class Context 
+    {
+    public:
+        Context( FdoInt32 ltMethodIn = 0 );
+        virtual ~Context();
+
+        FdoPtr<FdoIConnection> connection;
+        FdoInt32 ltMethod;
+    };
+
+    void DoTestCreateConstraints(Context& context);
+	void DoTestDescribeConstraints(Context& context);
+	void DoTestUpdateUniqueConstraints(Context& context);
+	void DoTestUpdateCheckConstraints(Context& context);
+	void DoTestDescribeUpdatedConstraints(Context& context);
+
     // Tests unique constraints that reference base properties.
 	virtual void TestBaseReferences(void);
 
-    void CreateConstraintsSchema(FdoIConnection * connection);
-	void DescribeConstraintsSchema(FdoIConnection * connection, FdoString *className, int numUkeys, int numCkeys, bool afterUpdate);
-	void UpdateCheckConstraints(FdoIConnection * connection);
-	void UpdateUniqueConstraints(FdoIConnection * connection);
-	void RestrictCheckConstraints(FdoIConnection * connection);
-	void DateTimeConstraints(FdoIConnection * connection);
+    void CreateConstraintsSchema(Context& context);
+	void DescribeConstraintsSchema(Context& context, FdoString *className, int numUkeys, int numCkeys, bool afterUpdate);
+	void UpdateCheckConstraints(Context& context);
+	void UpdateUniqueConstraints(Context& context);
+	void RestrictCheckConstraints(Context& context);
+	void DateTimeConstraints(Context& context);
 
-	TestCommonConstraints(void);
-    virtual ~TestCommonConstraints(void);
-    virtual void setUp ();
-
-protected:
-
-    virtual FdoIConnection* CreateConnection( FdoBoolean recreateDb = false );
+    virtual void CreateConnection( Context& context, FdoBoolean recreateDb = false );
     virtual FdoBoolean CanRestrictCheckConstraint();
     virtual FdoDouble GetDoubleRounding(FdoDataType dataType);
     virtual FdoFloat GetSecondsIncrement();
+    virtual FdoInt32 GetLtMethod();
 
     virtual FdoInt32 GetExpectedCheckConstraintCount( FdoIConnection* connection );
 
@@ -142,6 +169,8 @@
         bool expectedSuccess
     );
 
+    FdoStringP	FixDatetimeFormat( FdoDataValue*  val );
+    
     template< class T> void CheckListConstraint(FdoString* pPropName, FdoPtr<FdoDataValueCollection> pList, T* pMaster, FdoInt32 masterCount )
     {
         CPPUNIT_ASSERT_MESSAGE( 
@@ -207,7 +236,7 @@
                 CPPUNIT_ASSERT_MESSAGE( "Wrong type for datetime constraint returned", false);
 
             for ( int k = 0; k < masterCount && !valMatched; k++ ) {
-		        valMatched = ( wcscmp(val->ToString(), pMaster[k]) == 0 );
+		        valMatched = ( FixDatetimeFormat(val) == pMaster[k] );
 	        }	
 
             CPPUNIT_ASSERT_MESSAGE( 

Modified: trunk/Utilities/TestCommon/Src/TestCommonConstraints.cpp
===================================================================
--- trunk/Utilities/TestCommon/Src/TestCommonConstraints.cpp	2007-03-20 21:37:53 UTC (rev 2701)
+++ trunk/Utilities/TestCommon/Src/TestCommonConstraints.cpp	2007-03-21 20:38:20 UTC (rev 2702)
@@ -34,6 +34,9 @@
 #define            PROP_UNIQUE1           L"unique1"
 #define            PROP_UNIQUE2_1         L"unique2_1"
 #define            PROP_UNIQUE2_2         L"unique2_2"
+#define			   PROP_UNIQUE3_1		  L"unique3_1"
+#define			   PROP_UNIQUE3_2		  L"unique3_2"
+#define			   PROP_UNIQUE3_3		  L"unique3_3"
 
 #define            PROP_BYTE_R            L"ByteRange"
 #define            PROP_DATE_R            L"DateRange"
@@ -55,7 +58,7 @@
 #define            PROP_STRING_L          L"StringList"
 #define            PROP_LSTR_L            L"LargeStringList"
 
-#define            NUM_UNIQUE_KEYS        3
+#define            NUM_UNIQUE_KEYS        6
 
 #define            MIN_INCLUSIVE          false
 #define            MAX_INCLUSIVE          true
@@ -71,21 +74,22 @@
 static FdoInt32   INT32_RANGE[2]          = {10, 20};
 static FdoInt64   INT64_RANGE[2]          = {100, 200};
 static FdoFloat   SINGLE_RANGE[1]         = { (float) 0.000001};
-static FdoString* STRING_RANGE[2]         = {L"MOM", L"PAPA"};
+static FdoString* STRING_RANGE[2]         = {L"MOM", L"PA'PA"};
+static FdoString* DATETIME_RANGE[2]       = { L"2005-05-15-00-02-01", L"2006-02-01-18-00-00"};
 
 static FdoByte    BYTE_LIST[3]            = {1, 2, 3};
-static FdoString* DATE_LIST[3]            = {L"TIMESTAMP '2003-10-31 03:02:01'", L"TIMESTAMP '2005-10-31 03:02:01'", L"TIMESTAMP '2005-10-31 15:02:01'"};
+static FdoString* DATETIME_LIST[3]        = {L"2003-10-31-03-02-01", L"2005-10-31-03-02-01", L"2005-10-31-15-02-01"};
 static FdoDouble  DOUBLE_LIST[3]          = {0.123456789012345678901234567890, 100, 0.123456789012345678901234567890};
 static FdoInt32   INT32_LIST[5]           = {10, 20, 30, LONG_MIN, LONG_MAX};
 static FdoInt64   INT64_LIST[4]           = {LLONG_MIN, 52, LLONG_MAX - 1, LLONG_MAX};
 static FdoFloat   SINGLE_LIST[3]          = { (float) 0.1234567, (float) 100, (float) 1.12345678};
-static FdoString* STRING_LIST[]           = { L"open", L"close" };
+static FdoString* STRING_LIST[]           = { L"op'en", L"close" };
 static wchar_t    LARGE_STRING_LIST[395][20];
 
 static FdoByte    UPD_BYTE_RANGE[2]       = {11, 23};
 static FdoInt32   UPD_INT32_RANGE[2]      = {10, 2001};
 static FdoInt32   UPD_INT32_LIST[6]       = {10, 20, 30, LONG_MIN, LONG_MAX, 77};
-static FdoString* UPD_STRING_LIST[]       = { L"semiclosed", L"close" };
+static FdoString* UPD_STRING_LIST[]       = { L"semiclosed", L"close", L"'enclosed'" };
 
 
 TestCommonConstraints::TestCommonConstraints(void)
@@ -102,278 +106,240 @@
 
 void TestCommonConstraints::TestCreateConstraints ()
 {
-    FdoPtr<FdoIConnection> connection;
+    Context context;
 
+    DoTestCreateConstraints( context );
+}
+
+void TestCommonConstraints::TestDescribeConstraints ()
+{
+    Context context;
+
+    DoTestDescribeConstraints( context );
+}
+
+void TestCommonConstraints::TestUpdateCheckConstraints ()
+{
+    Context context;
+
+    DoTestUpdateCheckConstraints( context );
+}
+
+void TestCommonConstraints::TestUpdateUniqueConstraints ()
+{
+    Context context;
+
+    DoTestUpdateUniqueConstraints( context );
+}
+
+void TestCommonConstraints::TestDescribeUpdatedConstraints ()
+{
+    Context context;
+
+    DoTestDescribeUpdatedConstraints( context );
+}
+
+void TestCommonConstraints::TestCreateLTConstraints ()
+{
+    Context context( GetLtMethod() );
+
+    if ( context.ltMethod > 0 ) 
+        DoTestCreateConstraints( context );
+}
+
+void TestCommonConstraints::TestDescribeLTConstraints ()
+{
+    Context context( GetLtMethod() );
+
+    if ( context.ltMethod > 0 ) 
+        DoTestDescribeConstraints( context );
+}
+
+void TestCommonConstraints::TestUpdateLTCheckConstraints ()
+{
+    Context context( GetLtMethod() );
+
+    if ( context.ltMethod > 0 ) 
+        DoTestUpdateCheckConstraints( context );
+}
+
+void TestCommonConstraints::TestUpdateLTUniqueConstraints ()
+{
+    Context context( GetLtMethod() );
+
+    if ( context.ltMethod > 0 ) 
+        DoTestUpdateUniqueConstraints( context );
+}
+
+void TestCommonConstraints::TestDescribeLTUpdatedConstraints ()
+{
+    Context context( GetLtMethod() );
+
+    if ( context.ltMethod > 0 ) 
+        DoTestDescribeUpdatedConstraints( context );
+}
+
+void TestCommonConstraints::DoTestCreateConstraints (Context& context)
+{
     try {
         // delete, re-create and open the datastore
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection( true );
+        CreateConnection( context, true );
 
-         printf( "Creating Constraints Schema ... \n" );
-        CreateConstraintsSchema( connection );
-
-        printf( "Closing Connection ... \n" );
-        connection->Close();
+        printf( "Creating Constraints Schema ... \n" );
+        CreateConstraintsSchema( context );
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        if (connection) connection->Close(); 
         throw;
     }
     catch (...)
     {
-        try {
-            if (connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
-           CPPUNIT_FAIL ("caught unexpected exception");
-       }
+        CPPUNIT_FAIL ("caught unexpected exception");
+    }
 }
 
-void TestCommonConstraints::TestDescribeConstraints ()
+void TestCommonConstraints::DoTestDescribeConstraints (Context& context)
 {
-    FdoPtr<FdoIConnection> connection;
-
     try
     {
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection();
+        CreateConnection( context );
 
         printf( "Describe Constraints Schema class %ls... \n", (FdoString *)CLASS_NAME_BASE );
-        DescribeConstraintsSchema( connection, CLASS_NAME_BASE, NUM_UNIQUE_KEYS, GetExpectedCheckConstraintCount(connection), false );
+        DescribeConstraintsSchema( context, CLASS_NAME_BASE, NUM_UNIQUE_KEYS, GetExpectedCheckConstraintCount(context.connection), false );
 
         printf( "Describe Constraints Schema class %ls... \n", (FdoString *)CLASS_NAME );
-        DescribeConstraintsSchema( connection, CLASS_NAME, 0, 0, false );
-
-        printf( "Closing Connection ... \n" );
-        connection->Close();
+        DescribeConstraintsSchema( context, CLASS_NAME, 0, 0, false );
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        if (connection) connection->Close(); 
         throw;
     }
     catch (...)
     {
-        try {
-            if (connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
-           CPPUNIT_FAIL ("caught unexpected exception");
-       }
+        CPPUNIT_FAIL ("caught unexpected exception");
+    }
 }
 
-void TestCommonConstraints::TestUpdateCheckConstraints ()
+void TestCommonConstraints::DoTestUpdateCheckConstraints (Context& context)
 {
-    FdoPtr<FdoIConnection> connection;
-
     try
     {
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection();
+        CreateConnection( context );
 
         printf( "Describe Constraints Schema ... \n" );
-        UpdateCheckConstraints( connection );
-
-        printf( "Closing Connection ... \n" );
-        connection->Close();
+        UpdateCheckConstraints( context );
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         throw;
     }
-       catch (...)
-       {
-           CPPUNIT_FAIL ("caught unexpected exception");
-       }
+    catch (...)
+    {
+        CPPUNIT_FAIL ("caught unexpected exception");
+    }
 }
 
-void TestCommonConstraints::TestUpdateUniqueConstraints ()
+void TestCommonConstraints::DoTestUpdateUniqueConstraints (Context& context)
 {
-    FdoPtr<FdoIConnection> connection;
-
     try
     {
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection();
+        CreateConnection( context );
 
         printf( "Updating Constraints Schema ... \n" );
-        UpdateUniqueConstraints( connection );
-
-        connection->Close();
+        UpdateUniqueConstraints( context );
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         throw;
     }
-       catch (...)
-       {
-           CPPUNIT_FAIL ("caught unexpected exception");
-       }
+    catch (...)
+    {
+        CPPUNIT_FAIL ("caught unexpected exception");
+    }
 }
 
-void TestCommonConstraints::TestDescribeUpdatedConstraints ()
+void TestCommonConstraints::DoTestDescribeUpdatedConstraints (Context& context)
 {
-    FdoPtr<FdoIConnection> connection;
-
     try
     {
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection();
+        CreateConnection( context );
 
         printf( "Describe Constraints Schema class %ls... \n", (FdoString *)CLASS_NAME_BASE );
 
-        FdoInt32 NumCheckConstraints = GetExpectedCheckConstraintCount(connection);
+        FdoInt32 NumCheckConstraints = GetExpectedCheckConstraintCount(context.connection);
 
         DescribeConstraintsSchema( 
-            connection, 
-            CLASS_NAME_BASE, NUM_UNIQUE_KEYS - 1, 
+            context, 
+            CLASS_NAME_BASE, NUM_UNIQUE_KEYS - 4, 
             CanRestrictCheckConstraint() ? NumCheckConstraints : NumCheckConstraints - 1, 
             true 
         );
 
         printf( "Describe Constraints Schema class %ls... \n", (FdoString *)CLASS_NAME );
-        DescribeConstraintsSchema( connection, CLASS_NAME, 0, 0, false );
-
-        printf( "Closing Connection ... \n" );
-        connection->Close();
+        DescribeConstraintsSchema( context, CLASS_NAME, 0, 0, false );
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         throw;
     }
-       catch (...)
-       {
-        try {
-            if (connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
-           CPPUNIT_FAIL ("caught unexpected exception");
-       }
+    catch (...)
+    {
+        CPPUNIT_FAIL ("caught unexpected exception");
+    }
 }
 
 void TestCommonConstraints::TestRestrictCheckConstraints ()
 {
-    FdoPtr<FdoIConnection> connection;
-
     if ( !CanRestrictCheckConstraint() ) {
         try
         {
+            Context context;
+
             // delete, re-create and open the datastore
             printf( "Initializing Connection ... \n" );
-            connection = CreateConnection( true );
+            CreateConnection( context, true );
 
              printf( "Creating Constraints Schema ... \n" );
-            CreateConstraintsSchema( connection );
+            CreateConstraintsSchema( context );
 
             printf( "Restrict Constraints  ... \n" );
-            RestrictCheckConstraints( connection );
-
-            printf( "Closing Connection ... \n" );
-            connection->Close();
+            RestrictCheckConstraints( context );
         }
         catch ( FdoException* e ) 
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             TestCommonFail( e );
         }
         catch ( CppUnit::Exception e ) 
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             throw;
         }
         catch (...)
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             CPPUNIT_FAIL ("caught unexpected exception");
         }
     }
@@ -381,52 +347,31 @@
 
 void TestCommonConstraints::TestDateTimeConstraints ()
 {
-    FdoPtr<FdoIConnection> connection;
-
     if ( !CanRestrictCheckConstraint() ) {
         try
         {
+            Context context;
+
             // delete, re-create and open the datastore
             printf( "Initializing Connection ... \n" );
-            connection = CreateConnection( true );
+            CreateConnection( context, true );
 
              printf( "Creating Constraints Schema ... \n" );
-            CreateConstraintsSchema( connection );
+            CreateConstraintsSchema( context );
 
             printf( "Testing DateTime Constraints  ... \n" );
-            DateTimeConstraints( connection );
-
-            printf( "Closing Connection ... \n" );
-            connection->Close();
+            DateTimeConstraints( context );
         }
         catch ( FdoException* e ) 
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             TestCommonFail( e );
         }
         catch ( CppUnit::Exception e ) 
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             throw;
         }
         catch (...)
         {
-            try {
-                if ( connection) connection->Close(); 
-            }
-            catch ( ... ) 
-            {
-            }
             CPPUNIT_FAIL ("caught unexpected exception");
         }
     }
@@ -434,20 +379,20 @@
 
 void TestCommonConstraints::TestBaseReferences ()
 {
-    FdoPtr<FdoIConnection> connection;
-
     try
     {
+        Context context;
+
         // delete, re-create and open the datastore
         printf( "Initializing Connection ... \n" );
-        connection = CreateConnection( true );
+        CreateConnection( context, true );
 
         printf( "Creating Constraints Schema ... \n" );
             
-        FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+        FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
 
         if ( schemaCap->SupportsUniqueValueConstraints() && schemaCap->SupportsCompositeUniqueValueConstraints() ) {
-            FdoPtr<FdoIApplySchema>            pCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+            FdoPtr<FdoIApplySchema>            pCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
 
             FdoFeatureSchemasP pSchemas = FdoFeatureSchemaCollection::Create(NULL);
 
@@ -536,33 +481,33 @@
 
             // This should succeed
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME_BASE,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection,CLASS_NAME_BASE),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection,CLASS_NAME_BASE),
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 (FdoString*) NULL
             );
 
             // Unique constraint not on base class so should succeed.
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME_BASE,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME_BASE),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME_BASE),
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 (FdoString*) NULL
             );
 
             // This should succeed
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 2000,
                 (FdoString*) NULL
             );
@@ -570,11 +515,11 @@
             bool    uniqueSuccess1 = true;
             try {
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 2000,
                     (FdoString*) NULL
                 );
@@ -587,33 +532,33 @@
 
             // This should succeed
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME_BASE,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME_BASE),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME_BASE),
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 (FdoString*) NULL
             );
 
             // Unique constraint not on base class so should succeed.
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME_BASE,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME_BASE),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME_BASE),
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 (FdoString*) NULL
                 );
 
             // This should succeed
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 2000,
                 (FdoString*) NULL
@@ -623,11 +568,11 @@
 
             try {
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                     PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 2000,
                     (FdoString*) NULL
@@ -644,11 +589,11 @@
             // This should succeed
 
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 3000,
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 2000,
                 PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 2000,
@@ -658,18 +603,18 @@
             // This should succeed
 
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 4000,
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 3000,
                 (FdoString*) NULL
                 );
             
-            FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+            FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
             pDescCmd->SetSchemaName( SCHEMA_NAME );
             FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -725,53 +670,30 @@
             CPPUNIT_ASSERT_MESSAGE("Sub class unique key does not have 1 property ", pProps->GetCount() == 1 );
             pProp = pProps->GetItem(0);
             CPPUNIT_ASSERT( wcscmp(pProp->GetName(), PROP_UNIQUE2_2) == 0);
-
-            printf( "Closing Connection ... \n" );
-            
-            connection->Close();
         }
     }
     catch ( FdoException* e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         TestCommonFail( e );
     }
     catch ( CppUnit::Exception e ) 
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
         throw;
     }
     catch (...)
     {
-        try {
-            if ( connection) connection->Close(); 
-        }
-        catch ( ... ) 
-        {
-        }
-
         CPPUNIT_FAIL ("caught unexpected exception");
     }
 }
 
-void TestCommonConstraints::CreateConstraintsSchema( FdoIConnection* connection )
+void TestCommonConstraints::CreateConstraintsSchema( Context& context )
 {
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
     FdoInt32                          typeCount;
     FdoInt32                          idx;
     FdoDataType*                      supportedTypes = schemaCap->GetDataTypes( typeCount );
 
-    FdoPtr<FdoIApplySchema>            pCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+    FdoPtr<FdoIApplySchema>            pCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
 
     FdoFeatureSchemasP pSchemas = FdoFeatureSchemaCollection::Create(NULL);
 
@@ -781,11 +703,11 @@
     FdoPtr<FdoFeatureClass> pCData = FdoFeatureClass::Create( CLASS_NAME_BASE, L"Constraints" );
     pCData->SetIsAbstract(true);
 
-    FdoPtr<FdoDataPropertyDefinition> pProp = FdoDataPropertyDefinition::Create( PROP_FEATID, L"" );
-    pProp->SetDataType( FdoDataType_Int32 );
-    pProp->SetNullable(false);
-    FdoPropertiesP(pCData->GetProperties())->Add( pProp );
-    FdoDataPropertiesP(pCData->GetIdentityProperties())->Add( pProp );
+    FdoPtr<FdoDataPropertyDefinition> pIdProp = FdoDataPropertyDefinition::Create( PROP_FEATID, L"" );
+    pIdProp->SetDataType( FdoDataType_Int32 );
+    pIdProp->SetNullable(false);
+    FdoPropertiesP(pCData->GetProperties())->Add( pIdProp );
+    FdoDataPropertiesP(pCData->GetIdentityProperties())->Add( pIdProp );
 
     for ( idx = 0; idx < typeCount; idx++ ) {
         switch ( supportedTypes[idx] ) {
@@ -1115,6 +1037,35 @@
         pDataPropColl->Add( pUnique21Int );
         pDataPropColl->Add( pUnique22Int );
         constraints->Add( newUniqueConstr2 );
+
+        //////////////  3rd unique property - Composite ///////////////
+	    FdoPtr<FdoDataPropertyDefinition> pUnique31Int = FdoDataPropertyDefinition::Create( PROP_UNIQUE3_1, L"" );
+	    pUnique31Int->SetDataType( FdoDataType_Int32 );
+	    pUnique31Int->SetNullable(true);
+	    FdoPropertiesP(pCData->GetProperties())->Add( pUnique31Int  );
+
+	    FdoPtr<FdoDataPropertyDefinition> pUnique32Int = FdoDataPropertyDefinition::Create( PROP_UNIQUE3_2, L"" );
+	    pUnique32Int->SetDataType( FdoDataType_Int32 );
+	    pUnique32Int->SetNullable(true);
+	    FdoPropertiesP(pCData->GetProperties())->Add( pUnique32Int  );
+
+	    FdoPtr<FdoDataPropertyDefinition> pUnique33Int = FdoDataPropertyDefinition::Create( PROP_UNIQUE3_3, L"" );
+	    pUnique33Int->SetDataType( FdoDataType_Int32 );
+	    pUnique33Int->SetNullable(true);
+	    FdoPropertiesP(pCData->GetProperties())->Add( pUnique33Int  );
+
+	    FdoPtr<FdoUniqueConstraint>  newUniqueConstr3 = FdoUniqueConstraint::Create();
+	    newUniqueConstr3->GetProperties()->Add( pUnique31Int );
+	    newUniqueConstr3->GetProperties()->Add( pUnique32Int );
+	    newUniqueConstr3->GetProperties()->Add( pUnique33Int );
+	    constraints->Add( newUniqueConstr3 );
+
+	    //////////////  4th unique constraint - on identity property ///////////////
+        //////////////  should be silently ignored                   ///////////////
+
+	    FdoPtr<FdoUniqueConstraint>  newUniqueConstr4 = FdoUniqueConstraint::Create();
+	    newUniqueConstr4->GetProperties()->Add( pIdProp );
+	    constraints->Add( newUniqueConstr4 );
     }
 
     // Create a new class based on the previous ...
@@ -1137,14 +1088,14 @@
     {
         // This should succeed
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-            PROP_STRING_L,  FdoDataType_String, L"open",
+            PROP_STRING_L,  FdoDataType_String, L"op'en",
             PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 1000,
             PROP_STRING_R, FdoDataType_String, L"PA",
             PROP_SINGLE_R, FdoDataType_Single, (FdoFloat) 0.000002,
@@ -1154,15 +1105,16 @@
         bool    uniqueSuccess1 = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 30,
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 40,
                 PROP_STRING_L,  FdoDataType_String, L"close",
                 PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 1000,
+               PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
@@ -1174,33 +1126,35 @@
 
         // This should succeed
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-            PROP_STRING_L,  FdoDataType_String, L"open",
+            PROP_STRING_L,  FdoDataType_String, L"op'en",
             PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
             PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 2000,
+            PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 1000,
             (FdoString*) NULL
         );
 
         bool    uniqueSuccess2 = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 30,
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 40,
                 PROP_STRING_L,  FdoDataType_String, L"close",
                 PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
                 PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 2000,
-                (FdoString*) NULL
+                PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 2000,
+                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
             DBG(printf("Expected unique constraint violationexception: %ls", (FdoString* )ex->GetExceptionMessage()));
@@ -1217,15 +1171,18 @@
         bool    checkSuccess = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  INT32_RANGE[1],
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                PROP_STRING_L,  FdoDataType_String, L"open",
-                (FdoString*) NULL
+                PROP_STRING_L,  FdoDataType_String, L"op'en",
+                PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 3000,
+                PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 3000,
+                PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 3000,
+                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
             DBG(printf("Expected RangeInt constraint exception: %ls", (FdoString* )ex->GetExceptionMessage()));
@@ -1237,14 +1194,17 @@
         checkSuccess = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  INT32_RANGE[0] - 1,
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                PROP_STRING_L,  FdoDataType_String, L"open",
+                PROP_STRING_L,  FdoDataType_String, L"op'en",
+                PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 4000,
+                PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 4000,
+                PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 4000,
                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
@@ -1258,14 +1218,17 @@
         checkSuccess = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 40,
-                PROP_STRING_L,  FdoDataType_String, L"open",
+                PROP_STRING_L,  FdoDataType_String, L"op'en",
+                PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 5000,
+                PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 5000,
+                PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 5000,
                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
@@ -1278,14 +1241,17 @@
         checkSuccess = true;
         try {
             TestCommonMiscUtil::InsertObject(
-                connection,
+                context.connection,
                 insertCmd,
                 SCHEMA_NAME,
                 CLASS_NAME,
-                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                 PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
                 PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
                 PROP_STRING_L,  FdoDataType_String, L"xxxxx",
+                PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6000,
+                PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 6000,
+                PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 6000,
                 (FdoString*) NULL
             );
         } catch (FdoException *ex) {
@@ -1297,23 +1263,24 @@
 
 
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
             PROP_FEATID, FdoDataType_Int32, 99999999,
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-            PROP_STRING_L,  FdoDataType_String, L"open",
+            PROP_STRING_L,  FdoDataType_String, L"op'en",
             PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 8000,
             PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 8000,
+            PROP_UNIQUE3_1,  FdoDataType_Int32,  (FdoInt32) 8000,
             (FdoString*) NULL
         );
 
-        UpdateAllValues( connection, CLASS_NAME, 99999999);
+        UpdateAllValues( context.connection, CLASS_NAME, 99999999);
 
         TestCommonMiscUtil::DeleteObjects( 
-            connection,
+            context.connection,
             SCHEMA_NAME,
             CLASS_NAME,
             PROP_FEATID,
@@ -1651,11 +1618,11 @@
     }
 }
 
-void TestCommonConstraints::DescribeConstraintsSchema( FdoIConnection* connection, FdoString* className, int numUkeys, int numCkeys, bool afterUpdate )
+void TestCommonConstraints::DescribeConstraintsSchema( Context& context, FdoString* className, int numUkeys, int numCkeys, bool afterUpdate )
 {
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
 
-    FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+    FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
     pDescCmd->SetSchemaName( SCHEMA_NAME );
     FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -1676,8 +1643,11 @@
 
         int        count = 0;
         bool    found_unique1 = false;
-        bool    found_unique2 = false;
-        bool    found_unique3 = false;
+        bool    found_unique2_1 = false;
+        bool    found_unique2_2 = false;
+        bool    found_unique3_1 = false;
+        bool    found_unique3_2 = false;
+        bool    found_unique3_3 = false;
 
         //if ( pUniqueCs->GetCount() == 0 )
         //    pUniqueCs = pClassBase2->GetUniqueConstraints();
@@ -1697,18 +1667,24 @@
                 if ( wcscmp(pProp->GetName(), PROP_UNIQUE1 ) == 0 )
                     found_unique1 = true;
                 else if ( wcscmp(pProp->GetName(), PROP_UNIQUE2_1 ) == 0 )
-                    found_unique2 = true;
+                    found_unique2_1 = true;
                 else if ( wcscmp(pProp->GetName(), PROP_UNIQUE2_2 ) == 0 )
-                    found_unique3 = true;
+                    found_unique2_2 = true;
+                else if ( wcscmp(pProp->GetName(), PROP_UNIQUE3_1 ) == 0 )
+                    found_unique3_1 = true;
+                else if ( wcscmp(pProp->GetName(), PROP_UNIQUE3_2 ) == 0 )
+                    found_unique3_2 = true;
+                else if ( wcscmp(pProp->GetName(), PROP_UNIQUE3_3 ) == 0 )
+                    found_unique3_3 = true;
             }    
         }
 
         CPPUNIT_ASSERT_MESSAGE("Wrong number of unique keys", count == numUkeys );
         if ( numUkeys != 0 ) {
             if ( afterUpdate ) 
-                CPPUNIT_ASSERT_MESSAGE("Unique keys properties not found", found_unique1 && found_unique3);
+                CPPUNIT_ASSERT_MESSAGE("Unique keys properties not found", found_unique1 && found_unique2_2);
             else
-                CPPUNIT_ASSERT_MESSAGE("Unique keys properties not found", found_unique1 && found_unique2 && found_unique3);
+                CPPUNIT_ASSERT_MESSAGE("Unique keys properties not found", found_unique1 && found_unique2_1 && found_unique2_2 && found_unique3_1 && found_unique3_2 && found_unique3_3);
         }
     }
 
@@ -1799,6 +1775,17 @@
                     CPPUNIT_ASSERT_MESSAGE("Wrong Min Value Prop4R",  wcscmp(valMin->ToString(), val1->ToString()) == 0 );
                     CPPUNIT_ASSERT_MESSAGE("Wrong Max Value Prop4R (not null)",  valMax == NULL );
                 }
+			    else if ( wcscmp( pProp->GetName(), PROP_DATE_R) == 0 ) 
+			    {
+				    CPPUNIT_ASSERT_MESSAGE("Wrong MinInclusive", pConstrR->GetMinInclusive() == true );
+				    CPPUNIT_ASSERT_MESSAGE("Wrong MaxInclusive", pConstrR->GetMaxInclusive() == true );
+
+				    FdoDataValue*	valMin = pConstrR->GetMinValue();
+				    FdoDataValue*	valMax = pConstrR->GetMaxValue();
+
+				    CPPUNIT_ASSERT_MESSAGE("Wrong Min Value PropDateR",  wcscmp(FixDatetimeFormat(valMin), DATETIME_RANGE[0]) == 0 );
+				    CPPUNIT_ASSERT_MESSAGE("Wrong Max Value PropDateR",  wcscmp(FixDatetimeFormat(valMax), DATETIME_RANGE[1]) == 0 );
+			    }
                 
                 count++;
             }
@@ -1841,7 +1828,7 @@
                 }
                 else if ( wcscmp( pProp->GetName(), PROP_DATE_L ) == 0) {
                     DBG(printf("Check List key #%d: (%ls in (", count, pProp->GetName()));
-                    CheckDateListConstraint( pProp->GetName(), pList, DATE_LIST, sizeof(DATE_LIST) / sizeof(wchar_t*) );
+                    CheckDateListConstraint( pProp->GetName(), pList, DATETIME_LIST, sizeof(DATETIME_LIST) / sizeof(wchar_t*) );
                     count++;
                 }
                 else if ( wcscmp( pProp->GetName(), PROP_INT64_L ) == 0) {
@@ -1871,20 +1858,20 @@
     }
 }
 
-void TestCommonConstraints::UpdateUniqueConstraints( FdoIConnection* connection )
+void TestCommonConstraints::UpdateUniqueConstraints( Context& context )
 {
     int        count = 0;
     bool    found_unique1 = false;
     bool    found_unique2 = false;
     bool    found_unique3 = false;
 
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
 
     if ( schemaCap->SupportsUniqueValueConstraints() && schemaCap->SupportsCompositeUniqueValueConstraints() )
     {
         printf(".UpdateUniqueConstraints ...\n");
 
-        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
         pDescCmd->SetSchemaName( SCHEMA_NAME );
         FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -1896,12 +1883,13 @@
         
         FdoPtr<FdoUniqueConstraintCollection> pUniqueCs = pClass2->GetUniqueConstraints();
 
-        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
         pApplyCmd->SetFeatureSchema(pSchema2);
 
         /// MySql reverses the order of the constraints and also the constrainted props in the list
         int        index1;
         int        index2 = -1;
+        int        index3 = -1;
 
         for ( index1 = 0; index1 < pUniqueCs->GetCount(); index1++ ) 
         {
@@ -1911,10 +1899,16 @@
             FdoDataPropertyP             pProp1 = pProps1->FindItem(PROP_UNIQUE1);
             if ( pProp1 ) 
                 index2 = index1;
+            pProp1 = pProps1->FindItem(PROP_UNIQUE3_1);
+            if ( pProp1 ) 
+                index3 = index1;
         }
 
         printf("Unique key on (%ls) removed\n", PROP_UNIQUE1);
         pUniqueCs->RemoveAt(index2);
+        if ( index3 > index2 ) 
+            index3--;
+        pUniqueCs->RemoveAt(index3);
         pApplyCmd->Execute();
 
         // Just one constraint left
@@ -1937,14 +1931,14 @@
 
         FdoPtr<FdoIInsert> insertCmd;
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-            PROP_STRING_L,  FdoDataType_String, L"open",
+            PROP_STRING_L,  FdoDataType_String, L"op'en",
             PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 1000,
             PROP_UNIQUE2_1,  FdoDataType_Int32,  (FdoInt32) 1000,
             PROP_UNIQUE2_2,  FdoDataType_Int32,  value,
@@ -1970,7 +1964,7 @@
 
         // Remove the offending row
         TestCommonMiscUtil::DeleteObjects( 
-            connection,
+            context.connection,
             SCHEMA_NAME,
             CLASS_NAME,
             PROP_UNIQUE2_2,
@@ -1989,6 +1983,20 @@
         pClass2 = pClasses2->GetItem( CLASS_NAME_BASE );
           pUniqueCs = pClass2->GetUniqueConstraints();
 
+	    // Add unique constraint on identity property. Should be ignored.
+	    FdoPtr<FdoDataPropertyDefinition> pUnique5 = FdoDataPropertiesP(pClass2->GetIdentityProperties())->GetItem(0);
+	    FdoPtr<FdoUniqueConstraint>  newUniqueConstr5 = FdoUniqueConstraint::Create();
+	    newUniqueConstr5->GetProperties()->Add( pUnique5 );
+	    pUniqueCs->Add( newUniqueConstr5 );
+
+	    pApplyCmd->Execute();
+
+	    pSchemas2 = pDescCmd->Execute();
+	    pSchema2 = pSchemas2->GetItem( SCHEMA_NAME );
+        pClasses2 = pSchema2->GetClasses();
+	    pClass2 = pClasses2->GetItem( CLASS_NAME_BASE );
+	    pUniqueCs = pClass2->GetUniqueConstraints();
+        
         // Check results
         for ( int i = 0; i < pUniqueCs->GetCount(); i++ ) {
             FdoPtr<FdoUniqueConstraint>  pUniqueC = pUniqueCs->GetItem(i);
@@ -2009,15 +2017,15 @@
             }    
         }
         
-        CPPUNIT_ASSERT_MESSAGE("Wrong number of unique keys", count == NUM_UNIQUE_KEYS - 1);
+        CPPUNIT_ASSERT_MESSAGE("Wrong number of unique keys", count == NUM_UNIQUE_KEYS - 4);
         CPPUNIT_ASSERT_MESSAGE("Unique keys properties not found", found_unique1 && !found_unique2 && found_unique3);
     }
 }
 
-void TestCommonConstraints::UpdateCheckConstraints( FdoIConnection* connection )
+void TestCommonConstraints::UpdateCheckConstraints( Context& context )
 {
 
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
     FdoPtr<FdoIInsert> insertCmd;
 
     // MySql doesn't have check constraints
@@ -2026,7 +2034,7 @@
 
     printf(".UpdateCheckConstraints ...\n");
 
-    FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+    FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
     pDescCmd->SetSchemaName( SCHEMA_NAME );
     FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -2034,7 +2042,7 @@
     FdoPtr<FdoClassCollection> pClasses2 = pSchema2->GetClasses();
     FdoPtr<FdoClassDefinition> pClass2 = pClasses2->GetItem( CLASS_NAME_BASE );
    
-    FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+    FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
     pApplyCmd->SetFeatureSchema(pSchema2);
 
     ///////////////// CHECK() CONSTRAINTS //////////////////////////////////////////
@@ -2064,14 +2072,14 @@
                 FdoInt32 value = 2000;
 
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_INT32_R , FdoDataType_Int32,  value,
                     PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                    PROP_STRING_L,  FdoDataType_String, L"open",
+                    PROP_STRING_L,  FdoDataType_String, L"op'en",
                     PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6666,
                     PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8888,
                     (FdoString*) NULL
@@ -2090,14 +2098,16 @@
                 pProp->SetValueConstraint(newRangeConstr1);
 
                 bool error = false;
-                try    {
-                    pApplyCmd->Execute();
-                } catch (FdoException *ex) {
-                    DBG(printf("Expected check constraint violation exception: %ls\n", (FdoString* )ex->GetExceptionMessage()));
-                    ex->Release();
-                    error = true;
+                if ( context.ltMethod != 2 ) {
+                    try    {
+                        pApplyCmd->Execute();
+                    } catch (FdoException *ex) {
+                        DBG(printf("Expected check constraint violation exception: %ls\n", (FdoString* )ex->GetExceptionMessage()));
+                        ex->Release();
+                        error = true;
+                    }
+                    CPPUNIT_ASSERT_MESSAGE("Expected check constraint violation exception on PROPERTY_1", error == true);
                 }
-                CPPUNIT_ASSERT_MESSAGE("Expected check constraint violation exception on PROPERTY_1", error == true);
 
                 // Enlarge the range CHECK constraint
                 newRangeConstr1->SetMaxInclusive(INT_MAX_INCLUSIVE);
@@ -2120,14 +2130,14 @@
 
                 // Try insert again. It should succeed.
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_INT32_R , FdoDataType_Int32,  value,
                     PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                    PROP_STRING_L,  FdoDataType_String, L"open",
+                    PROP_STRING_L,  FdoDataType_String, L"op'en",
                     PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6667,
                     PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8889,
                     (FdoString*) NULL
@@ -2141,15 +2151,15 @@
                 bool error = false;
                 try    {
                     TestCommonMiscUtil::InsertObject(
-                        connection,
+                        context.connection,
                         insertCmd,
                         SCHEMA_NAME,
                         CLASS_NAME,
-                        PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                        PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                         PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
                         PROP_BYTE_R, FdoDataType_Byte,  value,
                         PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                        PROP_STRING_L,  FdoDataType_String, L"open",
+                        PROP_STRING_L,  FdoDataType_String, L"op'en",
                         PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 8000,
                         PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 9000,
                         (FdoString*) NULL
@@ -2171,15 +2181,15 @@
 
                 // Try insert again. It should succeed.
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
                     PROP_BYTE_R, FdoDataType_Int32,  value,
                     PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
-                    PROP_STRING_L,  FdoDataType_String, L"open",
+                    PROP_STRING_L,  FdoDataType_String, L"op'en",
                     PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6677,
                     PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8899,
                     (FdoString*) NULL
@@ -2203,14 +2213,14 @@
 
                 // Now try to insert. It should succeed.
                 TestCommonMiscUtil::InsertObject(
-                    connection,
+                    context.connection,
                     insertCmd,
                     SCHEMA_NAME,
                     CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
                     PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
                     PROP_INT32_L,  FdoDataType_Int32,  newValue,
-                    PROP_STRING_L,  FdoDataType_String, L"open",
+                    PROP_STRING_L,  FdoDataType_String, L"op'en",
                     PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6668,
                     PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8890,
                     (FdoString*) NULL
@@ -2224,14 +2234,16 @@
 
                 // Note: SqlServer doesn't like constraints like "semi-close" or "semi_close"! 
                 // Getting "String or binary data would be truncated" error.
-                FdoString*                newValue = L"semiclosed";
-                FdoPtr<FdoDataValue>   newVal = FdoDataValue::Create( newValue );
+                FdoString*              newValue = L"semiclosed";
+                FdoPtr<FdoDataValue>    newVal = FdoDataValue::Create( newValue );
+				FdoString*				newValue2 = L"'enclosed'";
+				FdoPtr<FdoDataValue>    newVal2 = FdoDataValue::Create( newValue2 );
                
                 FdoInt32 i;
                 for ( i = 0; i < pList->GetCount(); i++ ) 
                 {
                     FdoPtr<FdoDataValue> val = pList->GetItem(i);
-                    if ( wcscmp(((FdoStringValue*)(FdoDataValue*)val)->GetString(),L"open") == 0 ) 
+                    if ( wcscmp(((FdoStringValue*)(FdoDataValue*)val)->GetString(),L"op'en") == 0 ) 
                     {
                         pList->RemoveAt(i);
                         break;
@@ -2239,6 +2251,7 @@
                 }
 
                 pList->Add( newVal );
+                pList->Add( newVal2 );
                 pProp->SetValueConstraint( pConstrList );
                 bool error = false;
 
@@ -2254,44 +2267,63 @@
 
                 // Now try to delete. It should succeed.
                 TestCommonMiscUtil::DeleteObjects( 
-                    connection,
+                    context.connection,
                     SCHEMA_NAME,
                     CLASS_NAME,
                     PROP_STRING_L,
                     FdoDataType_String,
-                    L"open",
+                    L"op'en",
                     NULL
                 );
 
-                // No "open" stringlist's, ApplySchema should succeed this time.
-                pApplyCmd->Execute();
-                
-                // Now try to insert. It should succeed.
-                TestCommonMiscUtil::InsertObject(
-                    connection,
-                    insertCmd,
-                    SCHEMA_NAME,
-                    CLASS_NAME,
-                    PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
-                    PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
-                    PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 10,
-                    PROP_STRING_L,  FdoDataType_String, newValue,
-                    PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6669,
-                    PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8891,
-                    (FdoString*) NULL
-                );
+                // For Oracle Workspace Manager, even deletes against the LIVE long transaction are done conditionally
+                // so adding the constraint still fails even if the violating rows are deleted. 
+                // Therefore, skip the rest of this test for OWM.
+                if ( context.ltMethod != 2 ) {
+                    // No "open" stringlist's, ApplySchema should succeed this time.
+                    pApplyCmd->Execute();
+                    
+                    // Now try to insert. It should succeed.
+                    TestCommonMiscUtil::InsertObject(
+                        context.connection,
+                        insertCmd,
+                        SCHEMA_NAME,
+                        CLASS_NAME,
+                        PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
+                        PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
+                        PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 10,
+                        PROP_STRING_L,  FdoDataType_String, newValue,
+                        PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6669,
+                        PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8891,
+                        (FdoString*) NULL
+                    );
+
+                    TestCommonMiscUtil::InsertObject(
+                        context.connection,
+                        insertCmd,
+                        SCHEMA_NAME,
+                        CLASS_NAME,
+                        PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
+                        PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
+                        PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 10,
+                        PROP_STRING_L,  FdoDataType_String, newValue,
+                        PROP_UNIQUE1,  FdoDataType_Int32,  (FdoInt32) 6670,
+                        PROP_UNIQUE2_2,  FdoDataType_Int32,  (FdoInt32) 8892,
+                        (FdoString*) NULL
+                    );
+                }
             }
         }
     }
 }
 
-void TestCommonConstraints::RestrictCheckConstraints( FdoIConnection* connection )
+void TestCommonConstraints::RestrictCheckConstraints( Context& context )
 {
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
 
     if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
     {
-        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
         pDescCmd->SetSchemaName( SCHEMA_NAME );
         FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -2299,16 +2331,16 @@
         FdoPtr<FdoClassCollection> pClasses2 = pSchema2->GetClasses();
         FdoPtr<FdoClassDefinition> pClass2 = pClasses2->GetItem( CLASS_NAME_BASE );
        
-        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
         pApplyCmd->SetFeatureSchema(pSchema2);
 
         FdoPtr<FdoIInsert> insertCmd;
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
             PROP_STRING_L,  FdoDataType_String, L"close",
@@ -3060,7 +3092,7 @@
             }
 
             TestCommonMiscUtil::DeleteObjects( 
-                connection,
+                context.connection,
                 SCHEMA_NAME,
                 CLASS_NAME_BASE,
                 NULL
@@ -3069,13 +3101,13 @@
     }
 }
 
-void TestCommonConstraints::DateTimeConstraints( FdoIConnection* connection )
+void TestCommonConstraints::DateTimeConstraints( Context& context )
 {
-    FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
+    FdoPtr<FdoISchemaCapabilities>    schemaCap = context.connection->GetSchemaCapabilities();
 
     if ( schemaCap->SupportsExclusiveValueRangeConstraints() && schemaCap->SupportsInclusiveValueRangeConstraints())
     {
-        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) connection->CreateCommand(FdoCommandType_DescribeSchema);
+        FdoPtr<FdoIDescribeSchema>  pDescCmd = (FdoIDescribeSchema*) context.connection->CreateCommand(FdoCommandType_DescribeSchema);
 
         pDescCmd->SetSchemaName( SCHEMA_NAME );
         FdoPtr<FdoFeatureSchemaCollection> pSchemas2 = pDescCmd->Execute();
@@ -3083,16 +3115,16 @@
         FdoPtr<FdoClassCollection> pClasses2 = pSchema2->GetClasses();
         FdoPtr<FdoClassDefinition> pClass2 = pClasses2->GetItem( CLASS_NAME_BASE );
        
-        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) connection->CreateCommand(FdoCommandType_ApplySchema);
+        FdoPtr<FdoIApplySchema>  pApplyCmd = (FdoIApplySchema*) context.connection->CreateCommand(FdoCommandType_ApplySchema);
         pApplyCmd->SetFeatureSchema(pSchema2);
 
         FdoPtr<FdoIInsert> insertCmd;
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
             PROP_STRING_L,  FdoDataType_String, L"close",
@@ -3263,7 +3295,7 @@
         }
 
         TestCommonMiscUtil::DeleteObjects( 
-            connection,
+            context.connection,
             SCHEMA_NAME,
             CLASS_NAME_BASE,
             NULL
@@ -3302,11 +3334,11 @@
         pApplyCmd->Execute();
 
         TestCommonMiscUtil::InsertObject(
-            connection,
+            context.connection,
             insertCmd,
             SCHEMA_NAME,
             CLASS_NAME,
-            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(connection, CLASS_NAME),
+            PROP_FEATID, FdoDataType_Int32, GetNextFeatId(context.connection, CLASS_NAME),
             PROP_INT32_R , FdoDataType_Int32,  (FdoInt32) 10,
             PROP_INT32_L,  FdoDataType_Int32,  (FdoInt32) 20,
             PROP_STRING_L,  FdoDataType_String, L"close",
@@ -3397,7 +3429,7 @@
     }
 }
 
-FdoIConnection* TestCommonConstraints::CreateConnection( FdoBoolean )
+void TestCommonConstraints::CreateConnection( Context&, FdoBoolean )
 {
     throw FdoException::Create( L"base TestCommonConstraints::CreateConnection called, need implementation on subclass" );
 }
@@ -3407,7 +3439,7 @@
     return true;
 }
 
-FdoDouble TestCommonConstraints::GetDoubleRounding(FdoDataType dataType)
+FdoDouble TestCommonConstraints::GetDoubleRounding(FdoDataType)
 {
     return (FdoDouble) 0.0;
 }
@@ -3417,6 +3449,11 @@
     return (FdoFloat) 0.001;
 }
 
+FdoInt32 TestCommonConstraints::GetLtMethod()
+{
+    return 0; // No long transactions by default
+}
+
 FdoInt32 TestCommonConstraints::GetExpectedCheckConstraintCount( FdoIConnection* connection )
 {
     FdoPtr<FdoISchemaCapabilities>    schemaCap = connection->GetSchemaCapabilities();
@@ -3485,3 +3522,32 @@
 
     return nextFeatId; 
 }
+
+FdoStringP	TestCommonConstraints::FixDatetimeFormat( FdoDataValue*  val )
+{
+	FdoStringP	val2 = val->ToString();
+
+	val2 = val2.Replace(L"'", L"");
+	val2 = val2.Replace(L"TIMESTAMP ", L"");
+	val2 = val2.Replace(L" ", L"-");
+	val2 = val2.Replace(L":", L"-");
+   
+	return val2;
+}
+
+TestCommonConstraints::Context::Context( FdoInt32 ltMethodIn ) 
+{
+    ltMethod = ltMethodIn;
+}
+
+TestCommonConstraints::Context::~Context() 
+{
+    if ( connection ) {
+        try {
+            connection->Close();
+        }
+        catch ( ... ) {
+        }
+    }
+}
+



More information about the fdo-commits mailing list