Repository: nifi Updated Branches: refs/heads/master aa99cc682 -> 9e884f612
NiFI-3064 Convert to Avro fails when a MySQL query returns two columns with the same name even with different aliases Signed-off-by: Matt Burgess <[email protected]> This closes #1251 Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/9e884f61 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/9e884f61 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/9e884f61 Branch: refs/heads/master Commit: 9e884f61208c2d732847007219d7da7f681a0888 Parents: aa99cc6 Author: Kathik Narayanan <[email protected]> Authored: Sun Nov 20 20:18:45 2016 -0500 Committer: Matt Burgess <[email protected]> Committed: Tue Nov 22 11:49:25 2016 -0500 ---------------------------------------------------------------------- .../processors/standard/util/JdbcCommon.java | 7 ++++- .../processors/standard/TestExecuteSQL.java | 29 ++++++++++++++++++++ .../standard/util/TestJdbcCommon.java | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/9e884f61/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java index bb058d4..22301b0 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JdbcCommon.java @@ -260,7 +260,12 @@ public class JdbcCommon { * Some missing Avro types - Decimal, Date types. May need some additional work. */ for (int i = 1; i <= nrOfColumns; i++) { - String nameOrLabel = StringUtils.isNotEmpty(meta.getColumnName(i)) ? meta.getColumnName(i) : meta.getColumnLabel(i); + /** + * as per jdbc 4 specs, getColumnLabel will have the alias for the column, if not it will have the column name. + * so it may be a better option to check for columnlabel first and if in case it is null is someimplementation, + * check for alias. Postgres is the one that has the null column names for calculated fields. + */ + String nameOrLabel = StringUtils.isNotEmpty(meta.getColumnLabel(i)) ? meta.getColumnLabel(i) :meta.getColumnName(i); String columnName = convertNames ? normalizeNameForAvro(nameOrLabel) : nameOrLabel; switch (meta.getColumnType(i)) { case CHAR: http://git-wip-us.apache.org/repos/asf/nifi/blob/9e884f61/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteSQL.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteSQL.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteSQL.java index ebca87e..5659e4a 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteSQL.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestExecuteSQL.java @@ -172,6 +172,35 @@ public class TestExecuteSQL { } @Test + public void testWithduplicateColumns() throws SQLException { + // remove previous test database, if any + final File dbLocation = new File(DB_LOCATION); + dbLocation.delete(); + + // load test data to database + final Connection con = ((DBCPService) runner.getControllerService("dbcp")).getConnection(); + Statement stmt = con.createStatement(); + + try { + stmt.execute("drop table host1"); + stmt.execute("drop table host2"); + } catch (final SQLException sqle) { + } + + stmt.execute("create table host1 (id integer not null, host varchar(45))"); + stmt.execute("create table host2 (id integer not null, host varchar(45))"); + stmt.execute("insert into host1 values(1,'host1')"); + stmt.execute("insert into host2 values(1,'host2')"); + stmt.execute("select a.host as hostA,b.host as hostB from host1 a join host2 b on b.id=a.id"); + runner.setIncomingConnection(false); + runner.setProperty(ExecuteSQL.SQL_SELECT_QUERY, "select a.host as hostA,b.host as hostB from host1 a join host2 b on b.id=a.id"); + runner.run(); + + runner.assertAllFlowFilesTransferred(ExecuteSQL.REL_SUCCESS, 1); + runner.getFlowFilesForRelationship(ExecuteSQL.REL_SUCCESS).get(0).assertAttributeEquals(ExecuteSQL.RESULT_ROW_COUNT, "1"); + } + + @Test public void testWithSqlException() throws SQLException { // remove previous test database, if any final File dbLocation = new File(DB_LOCATION); http://git-wip-us.apache.org/repos/asf/nifi/blob/9e884f61/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java index e05844f..18621d6 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestJdbcCommon.java @@ -169,7 +169,7 @@ public class TestJdbcCommon { assertNotNull(schema); assertNotNull(schema.getField("ID")); - assertNotNull(schema.getField("VCHARC")); + assertNotNull(schema.getField("NOT_VCHARC")); // records name, should be result set first column table name assertEquals("TEST", schema.getName());
