Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: allow DatabaseMetaData.getColumns to describe an unset scale (#1716
) getColumns returns a 0 for the scale of a Decimal or Numeric column when the scale is 0, and when the scale is null. The caller can then not differentiate between a 0 or a null without another query. This change replaces the 0 in the ResultSet for scale with a null when describing an unscaled Decimal or Numeric column. getInt will still convert the null to a 0, but the caller can then use wasNull() to find out if the underlying value was 0 or null. This addresses Issue 1712. It is a breaking change, but if the correct getter (getInt) is used for the column, there is no difference. Other getters may behave differently. Signed-off-by: crwr45 <charlie.wheelerrobinson@gmail.com>
- Loading branch information
Showing
2 changed files
with
61 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
55 changes: 55 additions & 0 deletions
55
pgjdbc/src/test/java/org/postgresql/test/jdbc42/DatabaseMetaDataTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
/* | ||
* Copyright (c) 2007, PostgreSQL Global Development Group | ||
* See the LICENSE file in the project root for more information. | ||
*/ | ||
|
||
package org.postgresql.test.jdbc42; | ||
|
||
import static org.junit.Assert.assertEquals; | ||
import static org.junit.Assert.assertFalse; | ||
import static org.junit.Assert.assertTrue; | ||
|
||
import org.postgresql.test.TestUtil; | ||
|
||
import org.junit.After; | ||
import org.junit.Before; | ||
import org.junit.Test; | ||
|
||
import java.sql.Connection; | ||
import java.sql.DatabaseMetaData; | ||
import java.sql.ResultSet; | ||
|
||
public class DatabaseMetaDataTest { | ||
|
||
private Connection conn; | ||
|
||
@Before | ||
public void setUp() throws Exception { | ||
conn = TestUtil.openDB(); | ||
TestUtil.createTable(conn, "decimaltest", "a decimal, b decimal(10, 5)"); | ||
} | ||
|
||
@After | ||
public void tearDown() throws Exception { | ||
TestUtil.dropTable(conn, "decimaltest"); | ||
TestUtil.closeDB(conn); | ||
} | ||
|
||
@Test | ||
public void testGetColumnsForNullScale() throws Exception { | ||
DatabaseMetaData dbmd = conn.getMetaData(); | ||
|
||
ResultSet rs = dbmd.getColumns("%", "%", "decimaltest", "%"); | ||
assertTrue(rs.next()); | ||
assertEquals("a", rs.getString("COLUMN_NAME")); | ||
assertEquals(0, rs.getInt("DECIMAL_DIGITS")); | ||
assertTrue(rs.wasNull()); | ||
|
||
assertTrue(rs.next()); | ||
assertEquals("b", rs.getString("COLUMN_NAME")); | ||
assertEquals(5, rs.getInt("DECIMAL_DIGITS")); | ||
assertFalse(rs.wasNull()); | ||
|
||
assertTrue(!rs.next()); | ||
} | ||
} |