From 0fc7ff56eece8979585f874dd66c9a4b7fb7740f Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 12 Dec 2012 20:43:32 +0100 Subject: [PATCH] [#1993] Bad code generated when the same table name exists in multiple schemas in SQL Server --- .../sqlserver/SQLServerTableDefinition.java | 21 ++++++++++++------- .../src/org/jooq/test/sqlserver/create.sql | 16 ++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/util/sqlserver/SQLServerTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/util/sqlserver/SQLServerTableDefinition.java index 89d2a8f352..6696daadf2 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/sqlserver/SQLServerTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/sqlserver/SQLServerTableDefinition.java @@ -66,7 +66,8 @@ public class SQLServerTableDefinition extends AbstractTableDefinition { List result = new ArrayList(); Field identity = field("c.is_identity", Integer.class); - for (Record record : create().select( + for (Record record : create() + .select( COLUMNS.COLUMN_NAME, COLUMNS.ORDINAL_POSITION, COLUMNS.DATA_TYPE, @@ -76,14 +77,18 @@ public class SQLServerTableDefinition extends AbstractTableDefinition { COLUMNS.NUMERIC_SCALE, identity) .from(COLUMNS) - .join("sys.objects o") - .on("o.type in ('U', 'V')") - .and(COLUMNS.TABLE_NAME.equal(field("o.name", String.class))) - .join("sys.columns c") - .on("c.object_id = o.object_id") - .and(COLUMNS.COLUMN_NAME.equal(field("c.name", String.class))) + .join("sys.schemas s") + .on(COLUMNS.TABLE_SCHEMA.equal(field("s.name", String.class))) + // sys.objects is used rather than sys.tables, to include tables AND views + .join("sys.objects t") + .on("t.type in ('U', 'V')") + .and("t.schema_id = s.schema_id") + .and(COLUMNS.TABLE_NAME.equal(field("t.name", String.class))) + .join("sys.columns c") + .on("c.object_id = t.object_id") + .and(COLUMNS.COLUMN_NAME.equal(field("c.name", String.class))) .where(COLUMNS.TABLE_SCHEMA.equal(getSchema().getName())) - .and(COLUMNS.TABLE_NAME.equal(getName())) + .and(COLUMNS.TABLE_NAME.equal(getName())) .orderBy(COLUMNS.ORDINAL_POSITION) .fetch()) { diff --git a/jOOQ-test/src/org/jooq/test/sqlserver/create.sql b/jOOQ-test/src/org/jooq/test/sqlserver/create.sql index d3903bd71b..e53ace6db6 100644 --- a/jOOQ-test/src/org/jooq/test/sqlserver/create.sql +++ b/jOOQ-test/src/org/jooq/test/sqlserver/create.sql @@ -28,6 +28,10 @@ DROP FUNCTION f378/ DROP TRIGGER t_triggers_trigger/ +DROP TABLE multi_schema.t_book_sale/ +DROP TABLE multi_schema.t_book/ +DROP TABLE multi_schema.t_author/ + DROP TABLE t_dates/ DROP TABLE t_triggers/ DROP TABLE t_arrays/ @@ -205,6 +209,18 @@ CREATE TABLE t_book_to_book_store ( ) / +CREATE TABLE MULTI_SCHEMA.t_author ( + ID int NOT NULL, + FIRST_NAME VARCHAR(50), + LAST_NAME VARCHAR(50) NOT NULL, + DATE_OF_BIRTH DATE, + YEAR_OF_BIRTH int, + ADDRESS VARCHAR(50), + + CONSTRAINT pk_t_author PRIMARY KEY (ID) +) +/ + CREATE TABLE x_unused ( id int NOT NULL,