Author: tomdz Date: Wed Oct 11 12:52:26 2006 New Revision: 462920 URL: http://svn.apache.org/viewvc?view=rev&rev=462920 Log: Fixed SQL Server unit tests Fixed DDLUTILS-40
Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java db/ddlutils/trunk/src/test/org/apache/ddlutils/TestBase.java db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java?view=diff&rev=462920&r1=462919&r2=462920 ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Wed Oct 11 12:52:26 2006 @@ -264,20 +264,82 @@ locale = new Locale(language); } - _valueLocale = localeStr; - _valueDateFormat = DateFormat.getDateInstance(DateFormat.SHORT, locale); - _valueTimeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, locale); - _valueNumberFormat = NumberFormat.getNumberInstance(locale); + _valueLocale = localeStr; + setValueDateFormat(DateFormat.getDateInstance(DateFormat.SHORT, locale)); + setValueTimeFormat(DateFormat.getTimeInstance(DateFormat.SHORT, locale)); + setValueNumberFormat(NumberFormat.getNumberInstance(locale)); return; } } - _valueLocale = null; - _valueDateFormat = null; - _valueTimeFormat = null; - _valueNumberFormat = null; + _valueLocale = null; + setValueDateFormat(null); + setValueTimeFormat(null); + setValueNumberFormat(null); } /** + * Returns the format object for formatting dates in the specified locale. + * + * @return The date format object or null if no locale is set + */ + protected DateFormat getValueDateFormat() + { + return _valueDateFormat; + } + + /** + * Sets the format object for formatting dates in the specified locale. + * + * @param format The date format object + */ + protected void setValueDateFormat(DateFormat format) + { + _valueDateFormat = format; + } + + /** + * Returns the format object for formatting times in the specified locale. + * + * @return The time format object or null if no locale is set + */ + protected DateFormat getValueTimeFormat() + { + return _valueTimeFormat; + } + + /** + * Sets the date format object for formatting times in the specified locale. + * + * @param format The time format object + */ + protected void setValueTimeFormat(DateFormat format) + { + _valueTimeFormat = format; + } + + /** + * Returns the format object for formatting numbers in the specified locale. + * + * @return The number format object or null if no locale is set + */ + protected NumberFormat getValueNumberFormat() + { + return _valueNumberFormat; + } + + /** + * Returns a new date format object for formatting numbers in the specified locale. + * Platforms can override this if necessary. + * + * @param locale The locale + * @return The number format object + */ + protected void setValueNumberFormat(NumberFormat format) + { + _valueNumberFormat = format; + } + + /** * Adds a char sequence that needs escaping, and its escaped version. * * @param charSequence The char sequence @@ -1506,13 +1568,12 @@ // TODO: Handle binary types (BINARY, VARBINARY, LONGVARBINARY, BLOB) switch (column.getTypeCode()) { - // Note: TIMESTAMP (java.sql.Timestamp) is properly handled by its toString method case Types.DATE: result.append(getPlatformInfo().getValueQuoteToken()); - if (!(value instanceof String) && (_valueDateFormat != null)) + if (!(value instanceof String) && (getValueDateFormat() != null)) { // TODO: Can the format method handle java.sql.Date properly ? - result.append(_valueDateFormat.format(value)); + result.append(getValueDateFormat().format(value)); } else { @@ -1522,10 +1583,10 @@ break; case Types.TIME: result.append(getPlatformInfo().getValueQuoteToken()); - if (!(value instanceof String) && (_valueTimeFormat != null)) + if (!(value instanceof String) && (getValueTimeFormat() != null)) { // TODO: Can the format method handle java.sql.Date properly ? - result.append(_valueTimeFormat.format(value)); + result.append(getValueTimeFormat().format(value)); } else { @@ -1533,15 +1594,22 @@ } result.append(getPlatformInfo().getValueQuoteToken()); break; + case Types.TIMESTAMP: + result.append(getPlatformInfo().getValueQuoteToken()); + // TODO: SimpleDateFormat does not support nano seconds so we would + // need a custom date formatter for timestamps + result.append(value.toString()); + result.append(getPlatformInfo().getValueQuoteToken()); + break; case Types.REAL: case Types.NUMERIC: case Types.FLOAT: case Types.DOUBLE: case Types.DECIMAL: result.append(getPlatformInfo().getValueQuoteToken()); - if (!(value instanceof String) && (_valueNumberFormat != null)) + if (!(value instanceof String) && (getValueNumberFormat() != null)) { - result.append(_valueNumberFormat.format(value)); + result.append(getValueNumberFormat().format(value)); } else { Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java?view=diff&rev=462920&r1=462919&r2=462920 ============================================================================== --- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java (original) +++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/mssql/MSSqlBuilder.java Wed Oct 11 12:52:26 2006 @@ -18,6 +18,8 @@ import java.io.IOException; import java.sql.Types; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -51,6 +53,11 @@ */ public class MSSqlBuilder extends SqlBuilder { + /** We use a generic date format. */ + private DateFormat _genericDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + /** We use a generic date format. */ + private DateFormat _genericTimeFormat = new SimpleDateFormat("HH:mm:ss"); + /** * Creates a new builder instance. * @@ -113,6 +120,76 @@ { writeQuotationOnStatement(); super.dropExternalForeignKeys(table); + } + + /** + * [EMAIL PROTECTED] + */ + protected DateFormat getValueDateFormat() + { + return _genericDateFormat; + } + + /** + * [EMAIL PROTECTED] + */ + protected DateFormat getValueTimeFormat() + { + return _genericTimeFormat; + } + + /** + * [EMAIL PROTECTED] + */ + protected String getValueAsString(Column column, Object value) + { + if (value == null) + { + return "NULL"; + } + + StringBuffer result = new StringBuffer(); + + switch (column.getTypeCode()) + { + case Types.REAL: + case Types.NUMERIC: + case Types.FLOAT: + case Types.DOUBLE: + case Types.DECIMAL: + // SQL Server does not want quotes around the value + if (!(value instanceof String) && (getValueNumberFormat() != null)) + { + result.append(getValueNumberFormat().format(value)); + } + else + { + result.append(value.toString()); + } + break; + case Types.DATE: + result.append("CAST("); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(value instanceof String ? (String)value : getValueDateFormat().format(value)); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(" AS datetime)"); + break; + case Types.TIME: + result.append("CAST("); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(value instanceof String ? (String)value : getValueTimeFormat().format(value)); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(" AS datetime)"); + break; + case Types.TIMESTAMP: + result.append("CAST("); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(value.toString()); + result.append(getPlatformInfo().getValueQuoteToken()); + result.append(" AS datetime)"); + break; + } + return super.getValueAsString(column, value); } /** Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/TestBase.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/TestBase.java?view=diff&rev=462920&r1=462919&r2=462920 ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/TestBase.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/TestBase.java Wed Oct 11 12:52:26 2006 @@ -49,8 +49,7 @@ /** * Parses the database defined in the given XML definition. * - * @param dbDef - * The database XML definition + * @param dbDef The database XML definition * @return The database model */ protected Database parseDatabaseFromString(String dbDef) @@ -66,22 +65,22 @@ * Compares the two strings but ignores any whitespace differences. It also * recognizes special delimiter chars. * - * @param expected - * The expected string - * @param actual - * The actual string + * @param expected The expected string + * @param actual The actual string */ protected void assertEqualsIgnoringWhitespaces(String expected, String actual) { - assertEquals(compressWhitespaces(expected), compressWhitespaces(actual)); + String processedExpected = compressWhitespaces(expected); + String processedActual = compressWhitespaces(actual); + + assertEquals(processedExpected, processedActual); } /** * Compresses the whitespaces in the given string to a single space. Also * recognizes special delimiter chars and removes whitespaces before them. * - * @param original - * The original string + * @param original The original string * @return The resulting string */ private String compressWhitespaces(String original) Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java?view=diff&rev=462920&r1=462919&r2=462920 ============================================================================== --- db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java (original) +++ db/ddlutils/trunk/src/test/org/apache/ddlutils/platform/TestMSSqlPlatform.java Wed Oct 11 12:52:26 2006 @@ -18,6 +18,12 @@ import org.apache.ddlutils.TestPlatformBase; import org.apache.ddlutils.platform.mssql.MSSqlPlatform; +import org.apache.oro.text.regex.MatchResult; +import org.apache.oro.text.regex.Pattern; +import org.apache.oro.text.regex.PatternMatcher; +import org.apache.oro.text.regex.PatternMatcherInput; +import org.apache.oro.text.regex.Perl5Compiler; +import org.apache.oro.text.regex.Perl5Matcher; /** * Tests the Microsoft SQL Server platform. @@ -50,21 +56,35 @@ */ public void testColumnTypes() throws Exception { + String sql = createTestDatabase(COLUMN_TEST_SCHEMA); + + // Since we have no way of knowing the auto-generated variables in the SQL, + // we simply try to extract it from the SQL + Pattern declarePattern = new Perl5Compiler().compile("DECLARE @([\\S]+) [EMAIL PROTECTED]@([\\S]+)"); + PatternMatcher matcher = new Perl5Matcher(); + String tableNameVar = "tablename"; + String constraintNameVar = "constraintname"; + + if (matcher.contains(sql, declarePattern)) + { + tableNameVar = matcher.getMatch().group(1); + constraintNameVar = matcher.getMatch().group(2); + } assertEqualsIgnoringWhitespaces( "SET quoted_identifier on;\n"+ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'coltype')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'coltype' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -105,7 +125,7 @@ " \"COL_VARBINARY\" VARBINARY(15),\n"+ " \"COL_VARCHAR\" VARCHAR(15)\n"+ ");\n", - createTestDatabase(COLUMN_TEST_SCHEMA)); + sql); } @@ -114,22 +134,36 @@ */ public void testColumnConstraints() throws Exception { - // this is not valid sql as a table can have only one identity column at most + String sql = createTestDatabase(COLUMN_CONSTRAINT_TEST_SCHEMA); + + // Since we have no way of knowing the auto-generated variables in the SQL, + // we simply try to extract it from the SQL + Pattern declarePattern = new Perl5Compiler().compile("DECLARE @([\\S]+) [EMAIL PROTECTED]@([\\S]+)"); + PatternMatcher matcher = new Perl5Matcher(); + String tableNameVar = "tablename"; + String constraintNameVar = "constraintname"; + + if (matcher.contains(sql, declarePattern)) + { + tableNameVar = matcher.getMatch().group(1); + constraintNameVar = matcher.getMatch().group(2); + } + // Note that this is not valid SQL as a table can have only one identity column at most assertEqualsIgnoringWhitespaces( "SET quoted_identifier on;\n"+ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'constraints')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'constraints' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -146,7 +180,7 @@ " \"COL_AUTO_INCR\" DECIMAL(19,0) IDENTITY(1,1),\n"+ " PRIMARY KEY (\"COL_PK\", \"COL_PK_AUTO_INCR\")\n"+ ");\n", - createTestDatabase(COLUMN_CONSTRAINT_TEST_SCHEMA)); + sql); } /** @@ -154,6 +188,24 @@ */ public void testTableConstraints() throws Exception { + String sql = createTestDatabase(TABLE_CONSTRAINT_TEST_SCHEMA); + + // Since we have no way of knowing the auto-generated variables in the SQL, + // we simply try to extract it from the SQL + Pattern declarePattern = new Perl5Compiler().compile("DECLARE @([\\S]+) [EMAIL PROTECTED]@([\\S]+)"); + PatternMatcherInput input = new PatternMatcherInput(sql); + PatternMatcher matcher = new Perl5Matcher(); + String[] tableNameVars = { "tablename", "tablename", "tablename" }; + String[] constraintNameVars = { "constraintname", "constraintname", "constraintname" }; + + for (int idx = 0; (idx < 3) && matcher.contains(input, declarePattern); idx++) + { + MatchResult result = matcher.getMatch(); + + tableNameVars[idx] = result.group(1); + constraintNameVars[idx] = result.group(2); + input.setCurrentOffset(result.endOffset(2)); + } assertEqualsIgnoringWhitespaces( "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'F' AND name = 'testfk')\n"+ @@ -165,16 +217,16 @@ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'table3')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVars[0] + " nvarchar(256), @" + constraintNameVars[0] + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'table3' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[0] + ", @" + constraintNameVars[0] + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVars[0] + "+' DROP CONSTRAINT '+@" + constraintNameVars[0] + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[0] + ", @" + constraintNameVars[0] + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -183,16 +235,16 @@ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'table2')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVars[1] + " nvarchar(256), @" + constraintNameVars[1] + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'table2' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[1] + ", @" + constraintNameVars[1] + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVars[1] + "+' DROP CONSTRAINT '+@" + constraintNameVars[1] + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[1] + ", @" + constraintNameVars[1] + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -201,16 +253,16 @@ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'table1')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVars[2] + " nvarchar(256), @" + constraintNameVars[2] + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'table1' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[2] + ", @" + constraintNameVars[2] + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVars[2] + "+' DROP CONSTRAINT '+@" + constraintNameVars[2] + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVars[2] + ", @" + constraintNameVars[2] + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -245,7 +297,7 @@ ");\n"+ "ALTER TABLE \"table2\" ADD CONSTRAINT \"table2_FK_COL_FK_1_COL_FK_2_table1\" FOREIGN KEY (\"COL_FK_1\", \"COL_FK_2\") REFERENCES \"table1\" (\"COL_PK_2\", \"COL_PK_1\");\n"+ "ALTER TABLE \"table3\" ADD CONSTRAINT \"testfk\" FOREIGN KEY (\"COL_FK\") REFERENCES \"table2\" (\"COL_PK\");\n", - createTestDatabase(TABLE_CONSTRAINT_TEST_SCHEMA)); + sql); } /** @@ -253,21 +305,35 @@ */ public void testCharacterEscaping() throws Exception { + String sql = createTestDatabase(COLUMN_CHAR_SEQUENCES_TO_ESCAPE); + + // Since we have no way of knowing the auto-generated variables in the SQL, + // we simply try to extract it from the SQL + Pattern declarePattern = new Perl5Compiler().compile("DECLARE @([\\S]+) [EMAIL PROTECTED]@([\\S]+)"); + PatternMatcher matcher = new Perl5Matcher(); + String tableNameVar = "tablename"; + String constraintNameVar = "constraintname"; + + if (matcher.contains(sql, declarePattern)) + { + tableNameVar = matcher.getMatch().group(1); + constraintNameVar = matcher.getMatch().group(2); + } assertEqualsIgnoringWhitespaces( "SET quoted_identifier on;\n"+ "SET quoted_identifier on;\n"+ "IF EXISTS (SELECT 1 FROM sysobjects WHERE type = 'U' AND name = 'escapedcharacters')\n"+ "BEGIN\n"+ - " DECLARE @tablename nvarchar(256), @constraintname nvarchar(256)\n"+ + " DECLARE @" + tableNameVar + " nvarchar(256), @" + constraintNameVar + " nvarchar(256)\n"+ " DECLARE refcursor CURSOR FOR\n"+ " SELECT object_name(objs.parent_obj) tablename, objs.name constraintname\n"+ " FROM sysobjects objs JOIN sysconstraints cons ON objs.id = cons.constid\n"+ " WHERE objs.xtype != 'PK' AND object_name(objs.parent_obj) = 'escapedcharacters' OPEN refcursor\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " WHILE @@FETCH_STATUS = 0\n"+ " BEGIN\n"+ - " EXEC ('ALTER TABLE '[EMAIL PROTECTED]' DROP CONSTRAINT '[EMAIL PROTECTED])\n"+ - " FETCH NEXT FROM refcursor INTO @tablename, @constraintname\n"+ + " EXEC ('ALTER TABLE '+@" + tableNameVar + "+' DROP CONSTRAINT '+@" + constraintNameVar + ")\n"+ + " FETCH NEXT FROM refcursor INTO @" + tableNameVar + ", @" + constraintNameVar + "\n"+ " END\n"+ " CLOSE refcursor\n"+ " DEALLOCATE refcursor\n"+ @@ -280,6 +346,6 @@ " \"COL_TEXT\" VARCHAR(128) DEFAULT '\'\'',\n"+ " PRIMARY KEY (\"COL_PK\")\n"+ ");\n", - createTestDatabase(COLUMN_CHAR_SEQUENCES_TO_ESCAPE)); + sql); } }