From 7ac7002d1276f01bb2beb1880c5b87a4f8444e34 Mon Sep 17 00:00:00 2001 From: LionelNirva Date: Fri, 3 Oct 2014 18:34:49 +0200 Subject: [PATCH 1/2] Fix Bug when Deparsing SQL Server request having TOP and DISTINCT clauses. SQL Server requires the DISTINCT clause to be the first. --- .../net/sf/jsqlparser/util/deparser/SelectDeParser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java index 6e9902035..cf2355a55 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java @@ -53,10 +53,6 @@ public SelectDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) @Override public void visit(PlainSelect plainSelect) { buffer.append("SELECT "); - Top top = plainSelect.getTop(); - if (top != null) { - buffer.append(top).append(" "); - } if (plainSelect.getDistinct() != null) { buffer.append("DISTINCT "); if (plainSelect.getDistinct().getOnSelectItems() != null) { @@ -72,6 +68,10 @@ public void visit(PlainSelect plainSelect) { } } + Top top = plainSelect.getTop(); + if (top != null) { + buffer.append(top).append(" "); + } for (Iterator iter = plainSelect.getSelectItems().iterator(); iter.hasNext();) { SelectItem selectItem = iter.next(); From c2ad9d2b2c2ee9f0a8bda5b700f85d6bbb37a2d8 Mon Sep 17 00:00:00 2001 From: LionelNirva Date: Tue, 7 Oct 2014 16:31:43 +0200 Subject: [PATCH 2/2] Unit test for the fix Bug when Deparsing SQL Server request having TOP and DISTINCT clauses. --- .../net/sf/jsqlparser/test/select/SelectTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java index 2fd3f198f..bd99b205b 100644 --- a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java @@ -408,6 +408,19 @@ public void testDistinct() throws JSQLParserException { assertStatementCanBeDeparsedAs(select, statement); } + public void testDistinctTop() throws JSQLParserException { + String statement = "SELECT DISTINCT TOP 5 myid, mycol FROM mytable WHERE mytable.col = 9"; + Select select = (Select) parserManager.parse(new StringReader(statement)); + PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); + assertEquals("myid", + ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getExpression()) + .getColumnName()); + assertEquals("mycol", + ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression()).getColumnName()); + assertNotNull(plainSelect.getTop()); + assertStatementCanBeDeparsedAs(select, statement); + } + public void testFrom() throws JSQLParserException { String statement = "SELECT * FROM mytable as mytable0, mytable1 alias_tab1, mytable2 as alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9"; String statementToString = "SELECT * FROM mytable AS mytable0, mytable1 alias_tab1, mytable2 AS alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9";