diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index 9e355d76bb..03321992a9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -67,6 +67,9 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen } public void setDefaultExpr(SQLExpr defaultExpr) { + if (defaultExpr != null) { + defaultExpr.setParent(this); + } this.defaultExpr = defaultExpr; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 1c3940bf54..b024c4a4c7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -30,10 +30,12 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.db2.visitor.DB2ParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleParameterizedOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGParameterizedOutputVisitor; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerParameterizedOutputVisitor; import com.alibaba.druid.sql.parser.SQLParserUtils; import com.alibaba.druid.sql.parser.SQLStatementParser; @@ -55,11 +57,11 @@ public class ParameterizedOutputVisitorUtils { StringBuilder out = new StringBuilder(); ParameterizedVisitor visitor = createParameterizedOutputVisitor(out, dbType); stmt.accept(visitor); - + if (visitor.getReplaceCount() == 0) { return sql; } - + return out.toString(); } @@ -120,11 +122,14 @@ public class ParameterizedOutputVisitorUtils { public static boolean visit(ParameterizedVisitor v, SQLIntegerExpr x) { SQLObject parent = x.getParent(); - - if (parent instanceof SQLDataType) { + + if (parent instanceof SQLDataType // + || parent instanceof SQLColumnDefinition // + || parent instanceof SQLServerTop // + ) { return SQLASTOutputVisitorUtils.visit(v, x); } - + v.print('?'); v.incrementReplaceCunt(); return false; @@ -132,11 +137,11 @@ public class ParameterizedOutputVisitorUtils { public static boolean visit(ParameterizedVisitor v, SQLNumberExpr x) { SQLObject parent = x.getParent(); - + if (parent instanceof SQLDataType) { return SQLASTOutputVisitorUtils.visit(v, x); } - + v.print('?'); v.incrementReplaceCunt(); return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_1.java new file mode 100644 index 0000000000..f221e8cbeb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_1.java @@ -0,0 +1,32 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.druid.bvt.sql.sqlserver; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerParameterizedOutputVisitorTest_1 extends TestCase { + + public void test_0() throws Exception { + String sql = "SELECT TOP 10 ID FROM dbo.jiraissue WHERE PROJECT IN (?) ORDER BY UPDATED DESC"; + Assert.assertSame(ParameterizedOutputVisitorUtils.parameterize(sql, JdbcConstants.SQL_SERVER), sql); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_2.java new file mode 100644 index 0000000000..3cb869b26b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerParameterizedOutputVisitorTest_2.java @@ -0,0 +1,32 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed 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 com.alibaba.druid.bvt.sql.sqlserver; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerParameterizedOutputVisitorTest_2 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE dbo.AO_B9A0F0_APPLIED_TEMPLATE ( ID INTEGER IDENTITY(1,1) NOT NULL, PROJECT_ID BIGINT CONSTRAINT df_AO_B9A0F0_APPLIED_TEMPLATE_PROJECT_ID DEFAULT 0, PROJECT_TEMPLATE_MODULE_KEY VARCHAR(255), PROJECT_TEMPLATE_WEB_ITEM_KEY VARCHAR(255), CONSTRAINT pk_AO_B9A0F0_APPLIED_TEMPLATE_ID PRIMARY KEY(ID) )"; + Assert.assertSame(ParameterizedOutputVisitorUtils.parameterize(sql, JdbcConstants.SQL_SERVER), sql); + } + +}