package org.teiid.systemmodel; import static org.junit.Assert.*; import java.util.ArrayList; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.teiid.adminapi.Model.Type; import org.teiid.adminapi.impl.ModelMetaData; import org.teiid.core.util.UnitTestUtil; import org.teiid.jdbc.AbstractMMQueryTestCase; import org.teiid.jdbc.FakeServer; import org.teiid.jdbc.TestMMDatabaseMetaData; @SuppressWarnings("nls") public class TestODBCSchema extends AbstractMMQueryTestCase { private static final String VDB = "PartsSupplier"; //$NON-NLS-1$ private static FakeServer server; public TestODBCSchema() { // this is needed because the result files are generated // with another tool which uses tab as delimiter super.DELIMITER = "\t"; //$NON-NLS-1$ } @BeforeClass public static void oneTimeSetUp() throws Exception { server = new FakeServer(true); server.deployVDB(VDB, UnitTestUtil.getTestDataPath() + "/PartsSupplier.vdb"); } @AfterClass public static void oneTimeTearDown() { server.stop(); } @Before public void setUp() throws Exception { this.internalConnection = server.createConnection("jdbc:teiid:" + VDB); //$NON-NLS-1$ //$NON-NLS-2$ } @After public void tearDown() throws Exception { if (this.internalConnection != null) { this.internalConnection.close(); } server.undeployVDB("x"); } @Test public void test_PG_AM() throws Exception { execute("select * FROM pg_am"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_ATTRDEF() throws Exception { execute("select * FROM pg_attrdef order by adrelid, adnum"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_ATTRIBUTE() throws Exception { execute("select * FROM pg_attribute order by oid"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_ATTRIBUTE_overflow() throws Exception { ModelMetaData mmd = new ModelMetaData(); mmd.setName("x"); mmd.setModelType(Type.VIRTUAL); mmd.addSourceMetadata("ddl", "create view t (c bigdecimal(2147483647,2147483647)) as select 1.0;"); server.deployVDB("overflow", mmd); this.internalConnection = server.createConnection("jdbc:teiid:overflow"); //$NON-NLS-1$ //$NON-NLS-2$ execute("select * FROM pg_attribute order by oid"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_CLASS() throws Exception { execute("select * FROM pg_class order by oid"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_INDEX() throws Exception { execute("select * FROM pg_index order by oid"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_NAMESPACE() throws Exception { execute("select * FROM pg_namespace"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_TRIGGER() throws Exception { execute("select * FROM pg_trigger"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_TYPE() throws Exception { execute("select * FROM pg_type"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_DATABASE() throws Exception { execute("select* FROM pg_database"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void test_PG_USER() throws Exception { execute("select * FROM pg_user"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void testOBIEEColumnQuery() throws Exception { execute("select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname from pg_catalog.pg_attribute ta, pg_catalog.pg_attribute ia, pg_catalog.pg_class tc, pg_catalog.pg_index i, pg_catalog.pg_namespace n, pg_catalog.pg_class ic where tc.oid = i.indrelid AND n.oid = tc.relnamespace AND i.indisprimary = 't' AND ia.attrelid = i.indexrelid AND ta.attrelid = i.indrelid AND ta.attnum = i.indkey[ia.attnum-1] AND (NOT ta.attisdropped) AND (NOT ia.attisdropped) AND ic.oid = i.indexrelid order by ia.attnum, ta.attname, ic.relname"); TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } @Test public void testOIDUniquness() throws Exception { for (String table : new String[] {"pg_type", "pg_attribute", "pg_namespace", "pg_index"}) { execute("select count(distinct oid), count(*) from "+table); internalResultSet.next(); assertEquals(internalResultSet.getInt(2), internalResultSet.getInt(1)); } } @Test public void testPGTableConflicts() throws Exception { execute("select name FROM tables where schemaname='pg_catalog'"); //$NON-NLS-1$ ArrayList<String> names = new ArrayList<String>(); while (internalResultSet.next()) { names.add(internalResultSet.getString(1)); } ModelMetaData mmd = new ModelMetaData(); mmd.setName("x"); mmd.setModelType(Type.VIRTUAL); mmd.setSchemaSourceType("ddl"); StringBuffer ddl = new StringBuffer(); for (String name : names) { ddl.append("create view "+name+" as select 1;\n"); } mmd.setSchemaText(ddl.toString()); server.deployVDB("x", mmd); this.internalConnection.close(); this.internalConnection = server.createConnection("jdbc:teiid:x"); //$NON-NLS-1$ //$NON-NLS-2$ for (String name : names) { execute("select * from pg_catalog." + name); } } @Test public void testTypes() throws Exception { ModelMetaData mmd = new ModelMetaData(); mmd.setName("x"); mmd.setModelType(Type.VIRTUAL); mmd.addSourceMetadata("ddl", "create view v as select null, cast(null as xml), cast(null as boolean), cast(null as byte), cast(null as short), cast(null as integer), cast(null as long)," + " cast(null as float), cast(null as double), cast(null as bigdecimal), cast(null as biginteger), cast(null as time), cast(null as date), cast(null as timestamp), cast(null as varbinary), " + " cast(null as char), cast(null as string), cast(null as clob), cast(null as blob), " + " cast(null as xml[]), cast(null as boolean[]), cast(null as byte[]), cast(null as short[]), cast(null as integer[]), cast(null as long[]), cast(null as bigdecimal[]), cast(null as biginteger[]), " + " cast(null as float[]), cast(null as double[]), cast(null as time[]), cast(null as date[]), cast(null as timestamp[]), cast(null as varbinary[]), " + " cast(null as char[]), cast(null as string[]), cast(null as clob[]), cast(null as blob[])"); server.deployVDB("x", mmd); this.internalConnection.close(); this.internalConnection = server.createConnection("jdbc:teiid:x"); //$NON-NLS-1$ //$NON-NLS-2$ execute("select oid from pg_class where relname = 'v'"); //$NON-NLS-1$ this.internalResultSet.next(); int val = this.internalResultSet.getInt(1); String sql = "select n.nspname, c.relname, a.attname, a.atttypid, t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull, c.relhasrules, c.relkind, c.oid, pg_get_expr(d.adbin, d.adrelid), case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod, c.relhasoids " + "from (((pg_catalog.pg_class c inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace and " + "c.oid = ?) inner join pg_catalog.pg_attribute a on (not a.attisdropped) and a.attnum > 0 and a.attrelid = c.oid) inner join pg_catalog.pg_type t on t.oid = a.atttypid) left outer join pg_attrdef d on a.atthasdef and d.adrelid = a.attrelid and d.adnum = a.attnum order by n.nspname, c.relname, attnum"; execute(sql, new Object[] {val}); TestMMDatabaseMetaData.compareResultSet(this.internalResultSet); } }