You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2014/05/31 14:13:28 UTC

[3/4] METAMODEL-45: Made JDBC integration tests part of regular test suite, and added properties in .properties file to configure them.

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/276c173a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
new file mode 100644
index 0000000..76b4d20
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/MysqlTest.java
@@ -0,0 +1,389 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.integrationtests;
+
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.table.TableModel;
+
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.UpdateCallback;
+import org.apache.metamodel.UpdateScript;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.data.DataSetTableModel;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.JdbcTestTemplates;
+import org.apache.metamodel.jdbc.QuerySplitter;
+import org.apache.metamodel.jdbc.dialects.MysqlQueryRewriter;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.OperatorType;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.schema.TableType;
+
+/**
+ * Test case that tests mysql interaction. The test requires the "sakila" sample
+ * database that can be found at dev.mysql.com.
+ * 
+ * @see http://dev.mysql.com/doc/sakila/en/sakila.html#sakila-installation
+ */
+public class MysqlTest extends AbstractJdbIntegrationTest {
+
+    @Override
+    protected String getPropertyPrefix() {
+        return "mysql";
+    }
+    
+    public void testInterpretationOfNull() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcTestTemplates.interpretationOfNulls(getConnection());
+    }
+
+	public void testDatabaseProductName() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		String databaseProductName = getConnection().getMetaData().getDatabaseProductName();
+		assertEquals(JdbcDataContext.DATABASE_PRODUCT_MYSQL, databaseProductName);
+	}
+
+	public void testAutomaticConversionWhenInsertingString() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		assertNotNull(getConnection());
+
+		Statement st = getConnection().createStatement();
+		try {
+			// clean up, if nescesary
+			st.execute("DROP TABLE test_table");
+			st.close();
+		} catch (SQLException e) {
+			// do nothing
+		}
+
+		assertFalse(getConnection().isReadOnly());
+
+		JdbcDataContext dc = new JdbcDataContext(getConnection());
+		final Schema schema = dc.getDefaultSchema();
+		assertEquals("sakila", schema.getName());
+
+		dc.executeUpdate(new UpdateScript() {
+			@Override
+			public void run(UpdateCallback cb) {
+				Table table = cb.createTable(schema, "test_table").withColumn("id").ofType(ColumnType.INTEGER)
+						.asPrimaryKey().withColumn("birthdate").ofType(ColumnType.DATE).execute();
+
+				cb.insertInto(table).value("id", "1").execute();
+				cb.insertInto(table).value("id", 2).value("birthdate", "2011-12-21").execute();
+			}
+		});
+
+		assertTrue(dc.getColumnByQualifiedLabel("test_table.id").isPrimaryKey());
+		assertFalse(dc.getColumnByQualifiedLabel("test_table.birthdate").isPrimaryKey());
+
+		DataSet ds = dc.query().from("test_table").select("id").and("birthdate").execute();
+		assertTrue(ds.next());
+		assertEquals("Row[values=[1, null]]", ds.getRow().toString());
+		assertEquals("java.lang.Integer", ds.getRow().getValue(0).getClass().getName());
+		assertTrue(ds.next());
+		assertEquals("Row[values=[2, 2011-12-21]]", ds.getRow().toString());
+		assertEquals("java.sql.Date", ds.getRow().getValue(1).getClass().getName());
+		assertFalse(ds.next());
+		ds.close();
+
+		dc.executeUpdate(new UpdateScript() {
+			@Override
+			public void run(UpdateCallback callback) {
+				callback.dropTable("test_table").execute();
+			}
+		});
+	}
+	
+	public void testCharOfSizeOne() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		JdbcTestTemplates.meaningOfOneSizeChar(getConnection());
+	}
+
+	public void testAlternativeConnectionString() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, "sakila");
+		Schema[] schemas = dc.getSchemas();
+		assertEquals("[Schema[name=mysql], Schema[name=performance_schema], Schema[name=portal], "
+				+ "Schema[name=sakila], Schema[name=world]]", Arrays.toString(schemas));
+
+		Table table = dc.getSchemaByName("sakila").getTableByName("film");
+		Query q = new Query().from(table).select(table.getColumns());
+		DataSet data = dc.executeQuery(q);
+		TableModel tableModel = new DataSetTableModel(data);
+		assertEquals(13, tableModel.getColumnCount());
+		assertEquals(1000, tableModel.getRowCount());
+	}
+
+	public void testGetCatalogNames() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		JdbcDataContext dataContext = new JdbcDataContext(getConnection());
+		assertTrue(dataContext.getQueryRewriter() instanceof MysqlQueryRewriter);
+		String[] catalogNames = dataContext.getCatalogNames();
+		assertEquals("[information_schema, mysql, performance_schema, portal, sakila, world]",
+				Arrays.toString(catalogNames));
+	}
+
+	public void testGetDefaultSchema() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection());
+		Schema schema = dc.getDefaultSchema();
+		assertEquals("sakila", schema.getName());
+	}
+
+	public void testExecuteQuery() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection());
+		Schema schema = dc.getDefaultSchema();
+		Table actorTable = schema.getTableByName("actor");
+		assertEquals(
+				"[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=first_name,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_name,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_update,columnNumber=3,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+				Arrays.toString(actorTable.getColumns()));
+		Table filmTable = schema.getTableByName("film");
+		assertEquals(
+				"[Column[name=film_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=title,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=255], Column[name=description,columnNumber=2,type=LONGVARCHAR,nullable=true,nativeType=TEXT,columnSize=65535], Column[name=release_year,columnNumber=3,type=DATE,nullable=true,nativeType=YEAR,columnSize=0], Column[name=language_id,columnNumber=4,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=original_language_id,columnNumber=5,type=TINYINT,nullable=true,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_duration,columnNumber=6,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_rate,columnNumber=7,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=4], Column[name=length,columnNumber=8,type=SMALLINT,nullable=true,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=replacement_cost,columnNu
 mber=9,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=5], Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+				Arrays.toString(filmTable.getColumns()));
+		Table filmActorJoinTable = schema.getTableByName("film_actor");
+		assertEquals(
+				"[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+						+ "Column[name=film_id,columnNumber=1,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+						+ "Column[name=last_update,columnNumber=2,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+				Arrays.toString(filmActorJoinTable.getColumns()));
+
+		Query q = new Query();
+		q.from(new FromItem(actorTable).setAlias("a"));
+		q.select(actorTable.getColumns());
+		q.getSelectClause().getItem(0).setAlias("foo-bar");
+		assertEquals(
+				"SELECT a.`actor_id` AS foo-bar, a.`first_name`, a.`last_name`, a.`last_update` FROM sakila.`actor` a",
+				q.toString());
+		FilterItem f1 = new FilterItem(q.getSelectClause().getItem(0), OperatorType.EQUALS_TO, 5);
+		FilterItem f2 = new FilterItem(q.getSelectClause().getItem(0), OperatorType.EQUALS_TO, 8);
+		q.where(new FilterItem(f1, f2));
+
+		DataSet dataSet = dc.executeQuery(q);
+		TableModel tableModel = new DataSetTableModel(dataSet);
+		assertEquals(4, tableModel.getColumnCount());
+		assertEquals(2, tableModel.getRowCount());
+		assertEquals("LOLLOBRIGIDA", tableModel.getValueAt(0, 2));
+
+		q.setMaxRows(1);
+		dataSet = dc.executeQuery(q);
+		tableModel = new DataSetTableModel(dataSet);
+		assertEquals(4, tableModel.getColumnCount());
+		assertEquals(1, tableModel.getRowCount());
+		assertEquals("LOLLOBRIGIDA", tableModel.getValueAt(0, 2));
+		
+		q.setMaxRows(1);
+		q.setFirstRow(2);
+        dataSet = dc.executeQuery(q);
+        tableModel = new DataSetTableModel(dataSet);
+        assertEquals(4, tableModel.getColumnCount());
+        assertEquals(1, tableModel.getRowCount());
+        assertEquals("JOHANSSON", tableModel.getValueAt(0, 2));
+
+		q.getWhereClause().removeItems();
+		q.setMaxRows(25);
+		q.setFirstRow(1);
+		dataSet = dc.executeQuery(q);
+		tableModel = new DataSetTableModel(dataSet);
+		assertEquals(4, tableModel.getColumnCount());
+		assertEquals(25, tableModel.getRowCount());
+		assertEquals("GUINESS", tableModel.getValueAt(0, 2).toString());
+	}
+
+	// Test to query the film table (caused troubles in DataCleaner)
+	public void testFilmQuery() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection());
+		Table table = dc.getDefaultSchema().getTableByName("film");
+		Query q = new Query().select(table.getColumns()).from(table).setMaxRows(400);
+		dc.executeQuery(q);
+	}
+
+	public void testGetSchema() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection());
+		Schema[] schemas = dc.getSchemas();
+		assertEquals(5, schemas.length);
+		Schema schema = dc.getDefaultSchema();
+
+		assertEquals("[Table[name=actor,type=TABLE,remarks=], " + "Table[name=address,type=TABLE,remarks=], "
+				+ "Table[name=category,type=TABLE,remarks=], " + "Table[name=city,type=TABLE,remarks=], "
+				+ "Table[name=country,type=TABLE,remarks=], " + "Table[name=customer,type=TABLE,remarks=], "
+				+ "Table[name=film,type=TABLE,remarks=], " + "Table[name=film_actor,type=TABLE,remarks=], "
+				+ "Table[name=film_category,type=TABLE,remarks=], " + "Table[name=film_text,type=TABLE,remarks=], "
+				+ "Table[name=inventory,type=TABLE,remarks=], " + "Table[name=language,type=TABLE,remarks=], "
+				+ "Table[name=payment,type=TABLE,remarks=], " + "Table[name=rental,type=TABLE,remarks=], "
+				+ "Table[name=staff,type=TABLE,remarks=], " + "Table[name=store,type=TABLE,remarks=], "
+				+ "Table[name=actor_info,type=VIEW,remarks=], " + "Table[name=customer_list,type=VIEW,remarks=], "
+				+ "Table[name=film_list,type=VIEW,remarks=], "
+				+ "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
+				+ "Table[name=sales_by_film_category,type=VIEW,remarks=], "
+				+ "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
+				Arrays.toString(schema.getTables()));
+
+		Table filmTable = schema.getTableByName("film");
+		assertEquals(
+				"[Column[name=film_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+						+ "Column[name=title,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=255], "
+						+ "Column[name=description,columnNumber=2,type=LONGVARCHAR,nullable=true,nativeType=TEXT,columnSize=65535], "
+						+ "Column[name=release_year,columnNumber=3,type=DATE,nullable=true,nativeType=YEAR,columnSize=0], "
+						+ "Column[name=language_id,columnNumber=4,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+						+ "Column[name=original_language_id,columnNumber=5,type=TINYINT,nullable=true,nativeType=TINYINT UNSIGNED,columnSize=3], "
+						+ "Column[name=rental_duration,columnNumber=6,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+						+ "Column[name=rental_rate,columnNumber=7,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=4], "
+						+ "Column[name=length,columnNumber=8,type=SMALLINT,nullable=true,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+						+ "Column[name=replacement_cost,columnNumber=9,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=5], "
+						+ "Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], "
+						+ "Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], "
+						+ "Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+				Arrays.toString(filmTable.getColumns()));
+		assertEquals(
+				"[Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[language_id]], Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[original_language_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_actor,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_category,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=inventory,foreignColumns=[film_id]]]",
+				Arrays.toString(filmTable.getRelationships()));
+
+		dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, "sakila");
+		schemas = dc.getSchemas();
+		assertEquals(6, schemas.length);
+		assertEquals("[Table[name=actor,type=TABLE,remarks=], " + "Table[name=address,type=TABLE,remarks=], "
+				+ "Table[name=category,type=TABLE,remarks=], " + "Table[name=city,type=TABLE,remarks=], "
+				+ "Table[name=country,type=TABLE,remarks=], " + "Table[name=customer,type=TABLE,remarks=], "
+				+ "Table[name=film,type=TABLE,remarks=], " + "Table[name=film_actor,type=TABLE,remarks=], "
+				+ "Table[name=film_category,type=TABLE,remarks=], " + "Table[name=film_text,type=TABLE,remarks=], "
+				+ "Table[name=inventory,type=TABLE,remarks=], " + "Table[name=language,type=TABLE,remarks=], "
+				+ "Table[name=payment,type=TABLE,remarks=], " + "Table[name=rental,type=TABLE,remarks=], "
+				+ "Table[name=staff,type=TABLE,remarks=], " + "Table[name=store,type=TABLE,remarks=], "
+				+ "Table[name=actor_info,type=VIEW,remarks=], " + "Table[name=customer_list,type=VIEW,remarks=], "
+				+ "Table[name=film_list,type=VIEW,remarks=], "
+				+ "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
+				+ "Table[name=sales_by_film_category,type=VIEW,remarks=], "
+				+ "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
+				Arrays.toString(schema.getTables()));
+
+		Table staffView = schema.getTableByName("staff_list");
+		assertEquals(
+				"[Column[name=ID,columnNumber=0,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+						+ "Column[name=name,columnNumber=1,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=91], "
+						+ "Column[name=address,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+						+ "Column[name=zip code,columnNumber=3,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=10], "
+						+ "Column[name=phone,columnNumber=4,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=20], "
+						+ "Column[name=city,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+						+ "Column[name=country,columnNumber=6,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+						+ "Column[name=SID,columnNumber=7,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3]]",
+				Arrays.toString(staffView.getColumns()));
+	}
+
+	public void testSplitQuery() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, "sakila");
+		Schema schema = dc.getSchemaByName("sakila");
+		Table staffListTable = schema.getTableByName("staff_list");
+		assertNotNull(staffListTable);
+		Table paymentTable = schema.getTableByName("payment");
+		assertNotNull(paymentTable);
+		Column countryColumn = staffListTable.getColumnByName("country");
+		assertNotNull(countryColumn);
+		Column paymentColumn = paymentTable.getColumns()[0];
+		assertNotNull(paymentColumn);
+		Query q = new Query().from(staffListTable, "sl").from(paymentTable, "e").select(countryColumn, paymentColumn);
+		assertEquals("SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e",
+				q.toString());
+
+		QuerySplitter qs = new QuerySplitter(dc, q);
+		assertEquals(32098, qs.getRowCount());
+		List<Query> splitQueries = qs.setMaxRows(8000).splitQuery();
+		assertEquals(7, splitQueries.size());
+		assertEquals(
+				"[SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` < 4013 OR e.`rental_id` IS NULL) AND (e.`customer_id` < 300 OR e.`customer_id` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` < 4013 OR e.`rental_id` IS NULL) AND (e.`customer_id` > 300 OR e.`customer_id` = 300), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 4013 OR e.`rental_id` = 4013) AND (e.`rental_id` < 8025 OR e.`rental_id` = 4013) AND (e.`payment_id` < 8025 OR e.`payment_id` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 4013 OR e.`rental_id` = 4013) AND (e.`rental_id` < 8025 OR e.`rental_id` = 4013) AND (e.`payment_id` > 8025 OR e.`payment_id` = 8025), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 8025 OR e.`re
 ntal_id` = 8025) AND (e.`rental_id` < 12037 OR e.`rental_id` = 8025) AND (e.`amount` < 6 OR e.`amount` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 8025 OR e.`rental_id` = 8025) AND (e.`rental_id` < 12037 OR e.`rental_id` = 8025) AND (e.`amount` > 6 OR e.`amount` = 6), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 12037 OR e.`rental_id` = 12037)]",
+				Arrays.toString(splitQueries.toArray()));
+
+		DataSet data = qs.executeQueries();
+		int count = 0;
+		while (data.next()) {
+			count++;
+		}
+		data.close();
+		assertEquals(32098, count);
+	}
+
+	public void testQueryWithSingleQuote() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, "sakila");
+		Query q = dc.query().from("category").selectCount().where("name").eq("kasper's horror movies").toQuery();
+		DataSet ds = dc.executeQuery(q);
+		assertTrue(ds.next());
+		assertEquals(0, ((Number) ds.getRow().getValue(0)).intValue());
+		assertFalse(ds.next());
+	}
+
+	public void testWhiteSpaceColumns() throws Exception {
+	    if (!isConfigured()) {
+            return;
+        }
+        
+		DatabaseMetaData metaData = getConnection().getMetaData();
+		assertEquals("`", metaData.getIdentifierQuoteString());
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/276c173a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
new file mode 100644
index 0000000..a8f8f10
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/OracleTest.java
@@ -0,0 +1,224 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.integrationtests;
+
+import java.sql.ResultSet;
+import java.util.Arrays;
+
+import javax.swing.table.TableModel;
+
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.data.DataSetTableModel;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.JoinType;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.schema.Relationship;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.schema.TableType;
+
+/**
+ * Test case that tests oracle interaction. An express edition of the oracle
+ * database can be used to run these tests.
+ * 
+ * The test requires the "human resources" schema that is provided ass a sample
+ * schema for Oracle default installations.
+ * 
+ * The script for installing it can be found in:
+ * 
+ * <pre>
+ * $ORACLE_HOME / demo / schema / human_resources / hr_main.sql
+ * </pre>
+ * 
+ * Install with something like:
+ * 
+ * <pre>
+ * $ORACLE_HOME/bin/sqlplus -S &quot;/ as sysdba&quot; @hr_main.sql
+ * </pre>
+ * 
+ * The JDBC driver is not available in the Maven repository so you will have to
+ * download and attach it to the eclipse project yourself.
+ * 
+ * @see http://www.oracle.com/technology/products/bi/samples
+ * @see http
+ *      ://www.oracle.com/technology/software/products/database/xe/index.html
+ */
+public class OracleTest extends AbstractJdbIntegrationTest {
+
+    @Override
+    protected String getPropertyPrefix() {
+        return "oracle";
+    }
+
+    /**
+     * Ticket #170: getIndexInfo causes SQLException. We test that resultsets
+     * are closed properly.
+     */
+    public void testIndexInfo() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+
+        Schema schema = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE }, null)
+                .getSchemaByName("SYS");
+        assertEquals(12, schema.getTableCount());
+    }
+
+    public void testGetSchemaNames() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        DataContext dc = new JdbcDataContext(getConnection());
+        String[] schemaNames = dc.getSchemaNames();
+
+        String concatSchemas = Arrays.toString(schemaNames);
+
+        // In order to allow the database to be used for other purposes than
+        // this integration test, we will not make an exact assertion as to
+        // which schema names exist, but just assert that HR and the default
+        // oracle schemas exist.
+        assertTrue(concatSchemas.indexOf("foobar_schema_that_does_not_exist") == -1);
+        assertTrue(concatSchemas.indexOf("HR") != -1);
+        assertTrue(concatSchemas.indexOf("SYSTEM") != -1);
+        assertTrue(concatSchemas.indexOf("XDB") != -1);
+        assertTrue(schemaNames.length > 8);
+
+        Schema schema = dc.getDefaultSchema();
+        assertEquals("HR", schema.getName());
+    }
+
+    /**
+     * Really only tests the JDBC implementation, used to help localize the
+     * cause for Ticket #144
+     */
+    public void testGetImportedKeys() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        ResultSet rs = getConnection().getMetaData().getImportedKeys(null, "HR", "EMPLOYEES");
+        int count = 0;
+        while (rs.next()) {
+            count++;
+            assertEquals("HR", rs.getString(2));
+            String pkTableName = rs.getString(3);
+            String pkColumnName = rs.getString(4);
+            String fkTableName = rs.getString(7);
+            assertEquals("EMPLOYEES", fkTableName);
+            String fkColumnName = rs.getString(8);
+            System.out.println("Found primary key relation: pkTableName=" + pkTableName + ",pkColumnName="
+                    + pkColumnName + ",fkTableName=" + fkTableName + ",fkColumnName=" + fkColumnName);
+        }
+        rs.close();
+        assertEquals(3, count);
+
+        rs = getConnection().getMetaData().getImportedKeys(null, "HR", "DEPARTMENTS");
+        count = 0;
+        while (rs.next()) {
+            count++;
+            assertEquals("HR", rs.getString(2));
+            String pkTableName = rs.getString(3);
+            String pkColumnName = rs.getString(4);
+            String fkTableName = rs.getString(7);
+            assertEquals("DEPARTMENTS", fkTableName);
+            String fkColumnName = rs.getString(8);
+            System.out.println("Found primary key relation: pkTableName=" + pkTableName + ",pkColumnName="
+                    + pkColumnName + ",fkTableName=" + fkTableName + ",fkColumnName=" + fkColumnName);
+        }
+        rs.close();
+        assertEquals(2, count);
+    }
+
+    public void testGetSchema() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        Schema schema = getDataContext().getSchemaByName("HR");
+        assertNotNull(schema);
+        assertEquals("{JdbcTable[name=COUNTRIES,type=TABLE,remarks=<null>],"
+                + "JdbcTable[name=DEPARTMENTS,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=EMPLOYEES,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=JOBS,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=JOB_HISTORY,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=LOCATIONS,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=REGIONS,type=TABLE,remarks=<null>]"
+                + ",JdbcTable[name=EMP_DETAILS_VIEW,type=VIEW,remarks=<null>]}", Arrays.toString(schema.getTables()));
+
+        Relationship[] employeeRelationships = schema.getTableByName("EMPLOYEES").getRelationships();
+        assertEquals(
+                "{Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}],"
+                        + "Relationship[primaryTable=DEPARTMENTS,primaryColumns={DEPARTMENT_ID},foreignTable=EMPLOYEES,foreignColumns={DEPARTMENT_ID}],"
+                        + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=EMPLOYEES,foreignColumns={MANAGER_ID}],"
+                        + "Relationship[primaryTable=JOBS,primaryColumns={JOB_ID},foreignTable=EMPLOYEES,foreignColumns={JOB_ID}],"
+                        + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=JOB_HISTORY,foreignColumns={EMPLOYEE_ID}]}",
+                Arrays.toString(employeeRelationships));
+
+        assertEquals(
+                "{JdbcColumn[name=EMPLOYEE_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=6],"
+                        + "JdbcColumn[name=FIRST_NAME,columnNumber=1,type=VARCHAR,nullable=true,nativeType=VARCHAR2,columnSize=20],"
+                        + "JdbcColumn[name=LAST_NAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=25],"
+                        + "JdbcColumn[name=EMAIL,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=25],"
+                        + "JdbcColumn[name=PHONE_NUMBER,columnNumber=4,type=VARCHAR,nullable=true,nativeType=VARCHAR2,columnSize=20],"
+                        + "JdbcColumn[name=HIRE_DATE,columnNumber=5,type=DATE,nullable=false,nativeType=DATE,columnSize=7],"
+                        + "JdbcColumn[name=JOB_ID,columnNumber=6,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=10],"
+                        + "JdbcColumn[name=SALARY,columnNumber=7,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=8],"
+                        + "JdbcColumn[name=COMMISSION_PCT,columnNumber=8,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=2],"
+                        + "JdbcColumn[name=MANAGER_ID,columnNumber=9,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
+                        + "JdbcColumn[name=DEPARTMENT_ID,columnNumber=10,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
+                Arrays.toString(schema.getTableByName("EMPLOYEES").getColumns()));
+
+        assertEquals(
+                "{JdbcColumn[name=DEPARTMENT_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=4],"
+                        + "JdbcColumn[name=DEPARTMENT_NAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=30],"
+                        + "JdbcColumn[name=MANAGER_ID,columnNumber=2,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
+                        + "JdbcColumn[name=LOCATION_ID,columnNumber=3,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
+                Arrays.toString(schema.getTableByName("DEPARTMENTS").getColumns()));
+    }
+
+    public void testExecuteQuery() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        Schema schema = getDataContext().getSchemaByName("HR");
+        Table employeeTable = schema.getTableByName("EMPLOYEES");
+        Table departmentsTable = schema.getTableByName("DEPARTMENTS");
+        Relationship relationship = employeeTable.getRelationships(departmentsTable)[0];
+        assertEquals(
+                "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}]",
+                relationship.toString());
+
+        Query q = new Query().from(new FromItem(JoinType.INNER, relationship)).select(
+                employeeTable.getColumnByName("EMAIL"), departmentsTable.getColumnByName("DEPARTMENT_NAME"));
+        q.getSelectClause().getItem(0).setAlias("e-mail");
+
+        assertEquals(
+                "SELECT \"EMPLOYEES\".\"EMAIL\" AS e-mail, \"DEPARTMENTS\".\"DEPARTMENT_NAME\" FROM HR.\"EMPLOYEES\" INNER JOIN HR.\"DEPARTMENTS\" ON \"EMPLOYEES\".\"EMPLOYEE_ID\" = \"DEPARTMENTS\".\"MANAGER_ID\"",
+                q.toString());
+
+        DataSet data = getDataContext().executeQuery(q);
+        assertNotNull(data);
+        TableModel tableModel = new DataSetTableModel(data);
+        assertEquals(2, tableModel.getColumnCount());
+        assertEquals(11, tableModel.getRowCount());
+        assertEquals("JWHALEN", tableModel.getValueAt(0, 0).toString());
+        assertEquals("Administration", tableModel.getValueAt(0, 1).toString());
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/276c173a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
new file mode 100644
index 0000000..1ad6a85
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerJtdsDriverTest.java
@@ -0,0 +1,236 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.integrationtests;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+
+import org.apache.metamodel.UpdateCallback;
+import org.apache.metamodel.UpdateScript;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.JdbcTestTemplates;
+import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
+import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.schema.TableType;
+
+/**
+ * Test case that tests MS SQL Server interaction. The test uses the
+ * "AdventureWorks" sample database which can be downloaded from codeplex.
+ * 
+ * This testcase uses the JTDS driver.
+ * 
+ * @link{http://www.codeplex.com/MSFTDBProdSamples
+ * */
+public class SQLServerJtdsDriverTest extends AbstractJdbIntegrationTest {
+
+    private static final String DATABASE_NAME = "AdventureWorks";
+
+    @Override
+    protected String getPropertyPrefix() {
+        return "sqlserver.jtds_driver";
+    }
+
+    public void testWorkingWithDates() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        final Connection connection = getConnection();
+        assertFalse(connection.isReadOnly());
+
+        JdbcDataContext dc = new JdbcDataContext(connection);
+        final Schema schema = dc.getSchemaByName("Person");
+
+        JdbcTestTemplates.createInsertAndUpdateDateTypes(dc, schema, "test_table");
+    }
+
+    public void testAutomaticConversionWhenInsertingString() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        final Connection connection = getConnection();
+        assertNotNull(connection);
+
+        try {
+            // clean up, if nescesary
+            connection.createStatement().execute("DROP TABLE Person.test_table");
+        } catch (SQLException e) {
+            // do nothing
+        }
+
+        assertFalse(connection.isReadOnly());
+
+        JdbcDataContext dc = new JdbcDataContext(connection);
+        final Schema schema = dc.getSchemaByName("Person");
+        assertEquals("Person", schema.getName());
+
+        dc.executeUpdate(new UpdateScript() {
+            @Override
+            public void run(UpdateCallback cb) {
+                Table table = cb.createTable(schema, "test_table").withColumn("id").asPrimaryKey()
+                        .ofType(ColumnType.INTEGER).withColumn("birthdate").ofType(ColumnType.DATE).execute();
+
+                cb.insertInto(table).value("id", "1").execute();
+                cb.insertInto(table).value("id", 2).value("birthdate", "2011-12-21").execute();
+            }
+        });
+
+        Table table = schema.getTableByName("test_table");
+
+        assertTrue(table.getColumnByName("id").isPrimaryKey());
+        assertFalse(table.getColumnByName("birthdate").isPrimaryKey());
+
+        // the jdbc driver represents the date as a VARCHAR
+        assertEquals("[Column[name=id,columnNumber=0,type=INTEGER,nullable=false,nativeType=int,columnSize=10], "
+                + "Column[name=birthdate,columnNumber=1,type=VARCHAR,nullable=true,nativeType=date,columnSize=10]]",
+                Arrays.toString(table.getColumns()));
+
+        DataSet ds = dc.query().from(table).select("id").and("birthdate").execute();
+        assertTrue(ds.next());
+        assertEquals("Row[values=[1, null]]", ds.getRow().toString());
+        assertEquals("java.lang.Integer", ds.getRow().getValue(0).getClass().getName());
+        assertTrue(ds.next());
+        assertEquals("Row[values=[2, 2011-12-21]]", ds.getRow().toString());
+        assertEquals("java.lang.String", ds.getRow().getValue(1).getClass().getName());
+        assertFalse(ds.next());
+        ds.close();
+
+        connection.createStatement().execute("DROP TABLE Person.test_table");
+    }
+
+    public void testQueryUsingExpressions() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        JdbcDataContext strategy = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE,
+                TableType.VIEW }, DATABASE_NAME);
+        Query q = new Query().select("Name").from("Production.Product").where("COlor IS NOT NULL").setMaxRows(5);
+        DataSet dataSet = strategy.executeQuery(q);
+        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems()));
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[LL Crankarm]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertFalse(dataSet.next());
+    }
+
+    public void testGetSchemaNormalTableTypes() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        JdbcDataContext dc = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE, TableType.VIEW },
+                DATABASE_NAME);
+        Schema[] schemas = dc.getSchemas();
+
+        assertEquals(8, schemas.length);
+        assertEquals("Schema[name=HumanResources]", schemas[0].toString());
+        assertEquals(13, schemas[0].getTableCount());
+        assertEquals("Schema[name=INFORMATION_SCHEMA]", schemas[1].toString());
+        assertEquals(20, schemas[1].getTableCount());
+        assertEquals("Schema[name=Person]", schemas[2].toString());
+        assertEquals(8, schemas[2].getTableCount());
+        assertEquals("Schema[name=Production]", schemas[3].toString());
+        assertEquals(28, schemas[3].getTableCount());
+        assertEquals("Schema[name=Purchasing]", schemas[4].toString());
+        assertEquals(8, schemas[4].getTableCount());
+        assertEquals("Schema[name=Sales]", schemas[5].toString());
+        assertEquals(27, schemas[5].getTableCount());
+
+    }
+
+    public void testGetSchemaAllTableTypes() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        JdbcDataContext strategy = new JdbcDataContext(getConnection(), new TableType[] { TableType.OTHER,
+                TableType.GLOBAL_TEMPORARY }, DATABASE_NAME);
+        Schema schema = strategy.getDefaultSchema();
+        assertEquals("dbo", schema.getName());
+
+        assertEquals("[Sales, HumanResources, dbo, Purchasing, sys, Production, INFORMATION_SCHEMA, Person]",
+                Arrays.toString(strategy.getSchemaNames()));
+    }
+
+    public void testQueryRewriterQuoteAliases() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        JdbcDataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, DATABASE_NAME);
+        IQueryRewriter queryRewriter = dc.getQueryRewriter();
+        assertSame(SQLServerQueryRewriter.class, queryRewriter.getClass());
+
+        Schema schema = dc.getSchemaByName("Sales");
+        Table customersTable = schema.getTableByName("CUSTOMER");
+
+        Query q = new Query().from(customersTable, "cus-tomers").select(
+                new SelectItem(customersTable.getColumnByName("AccountNumber")).setAlias("c|o|d|e"));
+        q.setMaxRows(5);
+
+        assertEquals("SELECT cus-tomers.\"AccountNumber\" AS c|o|d|e FROM Sales.\"Customer\" cus-tomers", q.toString());
+
+        String queryString = queryRewriter.rewriteQuery(q);
+        assertEquals(
+                "SELECT TOP 5 \"cus-tomers\".\"AccountNumber\" AS \"c|o|d|e\" FROM Sales.\"Customer\" \"cus-tomers\"",
+                queryString);
+
+        // We have to test that no additional quoting characters are added every
+        // time we run the rewriting
+        queryString = queryRewriter.rewriteQuery(q);
+        queryString = queryRewriter.rewriteQuery(q);
+        assertEquals(
+                "SELECT TOP 5 \"cus-tomers\".\"AccountNumber\" AS \"c|o|d|e\" FROM Sales.\"Customer\" \"cus-tomers\"",
+                queryString);
+
+        // Test that the original query is still the same (ie. it has been
+        // cloned for execution)
+        assertEquals("SELECT cus-tomers.\"AccountNumber\" AS c|o|d|e FROM Sales.\"Customer\" cus-tomers", q.toString());
+
+        DataSet data = dc.executeQuery(q);
+        assertNotNull(data);
+        data.close();
+    }
+
+    public void testQuotedString() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        JdbcDataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, DATABASE_NAME);
+        IQueryRewriter queryRewriter = dc.getQueryRewriter();
+        assertSame(SQLServerQueryRewriter.class, queryRewriter.getClass());
+
+        Query q = dc.query().from("Production", "Product").select("Name").where("Color").eq("R'ed").toQuery();
+
+        DataSet ds = dc.executeQuery(q);
+        assertNotNull(ds);
+        assertFalse(ds.next());
+        ds.close();
+
+        assertEquals(
+                "SELECT Production.\"Product\".\"Name\" FROM Production.\"Product\" WHERE Production.\"Product\".\"Color\" = 'R''ed'",
+                queryRewriter.rewriteQuery(q));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/276c173a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
new file mode 100644
index 0000000..2fcd0ff
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/SQLServerMicrosoftDriverTest.java
@@ -0,0 +1,163 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.integrationtests;
+
+import java.util.Arrays;
+
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
+import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.schema.TableType;
+
+/**
+ * Test case that tests MS SQL Server interaction. The test uses the
+ * "AdventureWorks" sample database which can be downloaded from codeplex.
+ * 
+ * This testcase uses the official MS SQL Server driver.
+ * 
+ * @link{http://www.codeplex.com/MSFTDBProdSamples
+ * */
+public class SQLServerMicrosoftDriverTest extends AbstractJdbIntegrationTest {
+
+    private static final String DATABASE_NAME = "AdventureWorks";
+
+    @Override
+    protected String getPropertyPrefix() {
+        return "sqlserver.microsoft_driver";
+    }
+
+    public void testQueryUsingExpressions() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcDataContext strategy = new JdbcDataContext(getConnection(),
+                new TableType[] { TableType.TABLE, TableType.VIEW }, DATABASE_NAME);
+        Query q = new Query().select("Name").from("Production.Product").where("COlor IS NOT NULL").setMaxRows(5);
+        DataSet dataSet = strategy.executeQuery(q);
+        assertEquals("[Name]", Arrays.toString(dataSet.getSelectItems()));
+        assertTrue(dataSet.next());
+        assertEquals("Row[values=[LL Crankarm]]", dataSet.getRow().toString());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertTrue(dataSet.next());
+        assertFalse(dataSet.next());
+    }
+
+    public void testGetSchemaNormalTableTypes() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcDataContext dc = new JdbcDataContext(getConnection(), new TableType[] { TableType.TABLE, TableType.VIEW },
+                DATABASE_NAME);
+        Schema[] schemas = dc.getSchemas();
+
+        assertEquals(8, schemas.length);
+        assertEquals("Schema[name=HumanResources]", schemas[0].toString());
+        assertEquals(13, schemas[0].getTableCount());
+        assertEquals("Schema[name=INFORMATION_SCHEMA]", schemas[1].toString());
+        assertEquals(20, schemas[1].getTableCount());
+        assertEquals("Schema[name=Person]", schemas[2].toString());
+        assertEquals(8, schemas[2].getTableCount());
+        assertEquals("Schema[name=Production]", schemas[3].toString());
+        assertEquals(28, schemas[3].getTableCount());
+        assertEquals("Schema[name=Purchasing]", schemas[4].toString());
+        assertEquals(8, schemas[4].getTableCount());
+        assertEquals("Schema[name=Sales]", schemas[5].toString());
+        assertEquals(27, schemas[5].getTableCount());
+
+    }
+
+    public void testGetSchemaAllTableTypes() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcDataContext strategy = new JdbcDataContext(getConnection(), new TableType[] { TableType.OTHER,
+                TableType.GLOBAL_TEMPORARY }, DATABASE_NAME);
+
+        assertEquals("[Sales, HumanResources, dbo, Purchasing, sys, Production, INFORMATION_SCHEMA, Person]",
+                Arrays.toString(strategy.getSchemaNames()));
+
+        assertEquals("Schema[name=dbo]", strategy.getDefaultSchema().toString());
+    }
+
+    public void testQueryRewriterQuoteAliases() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcDataContext strategy = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, DATABASE_NAME);
+        IQueryRewriter queryRewriter = strategy.getQueryRewriter();
+        assertSame(SQLServerQueryRewriter.class, queryRewriter.getClass());
+
+        Schema schema = strategy.getSchemaByName("Sales");
+        Table customersTable = schema.getTableByName("CUSTOMER");
+
+        Query q = new Query().from(customersTable, "cus-tomers").select(
+                new SelectItem(customersTable.getColumnByName("AccountNumber")).setAlias("c|o|d|e"));
+        q.setMaxRows(5);
+
+        assertEquals("SELECT cus-tomers.\"AccountNumber\" AS c|o|d|e FROM Sales.\"Customer\" cus-tomers", q.toString());
+
+        String queryString = queryRewriter.rewriteQuery(q);
+        assertEquals(
+                "SELECT TOP 5 \"cus-tomers\".\"AccountNumber\" AS \"c|o|d|e\" FROM Sales.\"Customer\" \"cus-tomers\"",
+                queryString);
+
+        // We have to test that no additional quoting characters are added every
+        // time we run the rewriting
+        queryString = queryRewriter.rewriteQuery(q);
+        queryString = queryRewriter.rewriteQuery(q);
+        assertEquals(
+                "SELECT TOP 5 \"cus-tomers\".\"AccountNumber\" AS \"c|o|d|e\" FROM Sales.\"Customer\" \"cus-tomers\"",
+                queryString);
+
+        // Test that the original query is still the same (ie. it has been
+        // cloned for execution)
+        assertEquals("SELECT cus-tomers.\"AccountNumber\" AS c|o|d|e FROM Sales.\"Customer\" cus-tomers", q.toString());
+
+        DataSet data = strategy.executeQuery(q);
+        assertNotNull(data);
+        data.close();
+    }
+
+    public void testQuotedString() throws Exception {
+        if (!isConfigured()) {
+            return;
+        }
+        
+        JdbcDataContext dc = new JdbcDataContext(getConnection(), TableType.DEFAULT_TABLE_TYPES, DATABASE_NAME);
+        IQueryRewriter queryRewriter = dc.getQueryRewriter();
+        assertSame(SQLServerQueryRewriter.class, queryRewriter.getClass());
+
+        Query q = dc.query().from("Production", "Product").select("Name").where("Color").eq("R'ed").toQuery();
+
+        assertEquals(
+                "SELECT \"Product\".\"Name\" FROM Production.\"Product\" Product WHERE Product.\"Color\" = 'R''ed'",
+                queryRewriter.rewriteQuery(q));
+    }
+}
\ No newline at end of file