From b03b54daa94ce3accd0e1d3b6b9b782b7265e732 Mon Sep 17 00:00:00 2001 From: Tanish Grover Date: Thu, 8 Feb 2024 02:17:56 +0530 Subject: [PATCH 1/2] fix: Fixes parsing failing for ALTER MODIFY queries not containing datatype --- .../statement/alter/AlterExpression.java | 3 +- .../create/table/ColumnDefinition.java | 2 +- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 13 +++++---- .../jsqlparser/statement/alter/AlterTest.java | 28 +++++++++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java index 744d967a4..e8c5fa7e3 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -773,7 +773,8 @@ public ColumnDataType( @Override public String toString() { - return getColumnName() + (withType ? " TYPE " : " ") + toStringDataTypeAndSpec(); + return getColumnName() + (withType ? " TYPE " : getColDataType() == null ? "" : " ") + + toStringDataTypeAndSpec(); } @Override diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java index f19962d8e..dfe03fcec 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java @@ -69,7 +69,7 @@ public String toString() { } public String toStringDataTypeAndSpec() { - return colDataType + (columnSpecs != null && !columnSpecs.isEmpty() + return (colDataType == null ? "" : colDataType) + (columnSpecs != null && !columnSpecs.isEmpty() ? " " + PlainSelect.getStringList(columnSpecs, false, false) : ""); } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 40f393769..58df264c2 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -6144,9 +6144,9 @@ AlterExpression.ColumnDataType AlterExpressionColumnDataType(): List parameter = null; } { - columnName = RelObjectName() + columnName = RelObjectName() { columnSpecs = new ArrayList(); } ( LOOKAHEAD(2) { withType = true; } )? - dataType = ColDataType() { columnSpecs = new ArrayList(); } + ( LOOKAHEAD(2) dataType = ColDataType() )? ( parameter = CreateParameter() { columnSpecs.addAll(parameter); } )* { return new AlterExpression.ColumnDataType(columnName, withType, dataType, columnSpecs); @@ -6273,7 +6273,8 @@ AlterExpression AlterExpression(): ) ( - LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }) + LOOKAHEAD(2) + ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] @@ -6291,6 +6292,10 @@ AlterExpression AlterExpression(): [ index = IndexWithComment(index) { alterExp.setIndex(index); } ] ) | + LOOKAHEAD(2) ( + sk3=RelObjectName() tk= { alterExp.withColumnName(sk3).withCommentText(tk.image); } + ) + | LOOKAHEAD(3) ( ( LOOKAHEAD(2) { alterExp.hasColumn(true); } )? [ { alterExp.setUseIfNotExists(true); } ] @@ -6433,8 +6438,6 @@ AlterExpression AlterExpression(): ) ) ) - | - ( sk3=RelObjectName() tk= { alterExp.withColumnName(sk3).withCommentText(tk.image); } ) ) ) | diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java index 86962ae0f..1b1a93ad6 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -360,6 +360,34 @@ public void testAlterTableModifyColumn2() throws JSQLParserException { assertFalse(alterExpression.hasColumn()); } + @Test + public void testAlterTableModifyColumn3() throws JSQLParserException { + Alter alter = + (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 NULL"); + AlterExpression alterExpression = alter.getAlterExpressions().get(0); + + // COLUMN keyword DOES NOT appear in deparsed statement, modify becomes all caps + assertStatementCanBeDeparsedAs(alter, "ALTER TABLE mytable MODIFY col1 NULL"); + + assertEquals(AlterOperation.MODIFY, alterExpression.getOperation()); + + assertFalse(alterExpression.hasColumn()); + } + + @Test + public void testAlterTableModifyColumn4() throws JSQLParserException { + Alter alter = + (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 DEFAULT 0"); + AlterExpression alterExpression = alter.getAlterExpressions().get(0); + + // COLUMN keyword DOES NOT appear in deparsed statement, modify becomes all caps + assertStatementCanBeDeparsedAs(alter, "ALTER TABLE mytable MODIFY col1 DEFAULT 0"); + + assertEquals(AlterOperation.MODIFY, alterExpression.getOperation()); + + assertFalse(alterExpression.hasColumn()); + } + @Test public void testAlterTableAlterColumn() throws JSQLParserException { // http://www.postgresqltutorial.com/postgresql-change-column-type/ From 4f10cf56e5127239495b99071aa436e7e97a9a9f Mon Sep 17 00:00:00 2001 From: Tanish Grover Date: Thu, 8 Feb 2024 10:24:43 +0530 Subject: [PATCH 2/2] fixed spotcheck formatting issues --- .../net/sf/jsqlparser/statement/alter/AlterExpression.java | 2 +- .../statement/create/table/ColumnDefinition.java | 7 ++++--- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 +-- .../java/net/sf/jsqlparser/statement/alter/AlterTest.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java index e8c5fa7e3..0a99c97d5 100644 --- a/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java +++ b/src/main/java/net/sf/jsqlparser/statement/alter/AlterExpression.java @@ -774,7 +774,7 @@ public ColumnDataType( @Override public String toString() { return getColumnName() + (withType ? " TYPE " : getColDataType() == null ? "" : " ") - + toStringDataTypeAndSpec(); + + toStringDataTypeAndSpec(); } @Override diff --git a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java index dfe03fcec..90a0e0e40 100644 --- a/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java +++ b/src/main/java/net/sf/jsqlparser/statement/create/table/ColumnDefinition.java @@ -69,9 +69,10 @@ public String toString() { } public String toStringDataTypeAndSpec() { - return (colDataType == null ? "" : colDataType) + (columnSpecs != null && !columnSpecs.isEmpty() - ? " " + PlainSelect.getStringList(columnSpecs, false, false) - : ""); + return (colDataType == null ? "" : colDataType) + + (columnSpecs != null && !columnSpecs.isEmpty() + ? " " + PlainSelect.getStringList(columnSpecs, false, false) + : ""); } public ColumnDefinition withColumnName(String columnName) { diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 58df264c2..7c01cb12d 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -6273,8 +6273,7 @@ AlterExpression AlterExpression(): ) ( - LOOKAHEAD(2) - ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }) + LOOKAHEAD(2) ( columnNames=ColumnsNamesList() { alterExp.setPkColumns(columnNames); }) constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); } [ sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }] diff --git a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java index 1b1a93ad6..24995bc3e 100644 --- a/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/alter/AlterTest.java @@ -363,7 +363,7 @@ public void testAlterTableModifyColumn2() throws JSQLParserException { @Test public void testAlterTableModifyColumn3() throws JSQLParserException { Alter alter = - (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 NULL"); + (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 NULL"); AlterExpression alterExpression = alter.getAlterExpressions().get(0); // COLUMN keyword DOES NOT appear in deparsed statement, modify becomes all caps @@ -377,7 +377,7 @@ public void testAlterTableModifyColumn3() throws JSQLParserException { @Test public void testAlterTableModifyColumn4() throws JSQLParserException { Alter alter = - (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 DEFAULT 0"); + (Alter) CCJSqlParserUtil.parse("ALTER TABLE mytable modify col1 DEFAULT 0"); AlterExpression alterExpression = alter.getAlterExpressions().get(0); // COLUMN keyword DOES NOT appear in deparsed statement, modify becomes all caps