@@ -23,8 +23,8 @@ public class CachedResultSetTest {
2323 @ Mock ResultSet mockResultSet ;
2424 @ Mock ResultSetMetaData mockResultSetMetadata ;
2525 private AutoCloseable closeable ;
26- private static Calendar estCal = Calendar .getInstance (TimeZone .getTimeZone ("America/New_York" ));
27- private TimeZone defaultTimeZone = TimeZone .getDefault ();
26+ private static final Calendar estCal = Calendar .getInstance (TimeZone .getTimeZone ("America/New_York" ));
27+ private final TimeZone defaultTimeZone = TimeZone .getDefault ();
2828
2929 // Column values: label, name, typeName, type, displaySize, precision, tableName,
3030 // scale, schemaName, isAutoIncrement, isCaseSensitive, isCurrency, isDefinitelyWritable,
@@ -42,7 +42,8 @@ public class CachedResultSetTest {
4242 {"fieldBigDecimal" , "fieldBigDecimal" , "BigDecimal" , Types .DECIMAL , 10 , 2 , "table" , 1 , "public" , false , false , false , false , 0 , true , true , false , false },
4343 {"fieldDate" , "fieldDate" , "Date" , Types .DATE , 10 , 2 , "table" , 1 , "public" , false , false , false , false , 1 , true , true , false , false },
4444 {"fieldTime" , "fieldTime" , "Time" , Types .TIME , 10 , 2 , "table" , 1 , "public" , false , false , false , false , 1 , true , true , false , false },
45- {"fieldDateTime" , "fieldDateTime" , "Timestamp" , Types .TIMESTAMP , 10 , 2 , "table" , 1 , "public" , false , false , false , false , 0 , true , true , false , false }
45+ {"fieldDateTime" , "fieldDateTime" , "Timestamp" , Types .TIMESTAMP , 10 , 2 , "table" , 1 , "public" , false , false , false , false , 0 , true , true , false , false },
46+ {"fieldSqlXml" , "fieldSqlXml" , "SqlXml" , Types .SQLXML , 100 , 1 , "table" , 1 , "public" , false , false , false , false , 0 , true , true , false , false }
4647 };
4748
4849 private static final Object [][] testColumnValues = {
@@ -58,7 +59,8 @@ public class CachedResultSetTest {
5859 {new BigDecimal ("15.33" ), new BigDecimal ("-12.45" )},
5960 {Date .valueOf ("2025-03-15" ), Date .valueOf ("1102-01-15" )},
6061 {Time .valueOf ("22:54:00" ), Time .valueOf ("01:10:00" )},
61- {Timestamp .valueOf ("2025-03-15 22:54:00" ), Timestamp .valueOf ("1950-01-18 21:50:05" )}
62+ {Timestamp .valueOf ("2025-03-15 22:54:00" ), Timestamp .valueOf ("1950-01-18 21:50:05" )},
63+ {new CachedSQLXML ("<root><item>A</item></root>" ), new CachedSQLXML ("<root><element1>Value A</element1><element2>Value B</element2></root>" )}
6264 };
6365
6466 private void mockGetMetadataFields (int column , int testMetadataCol ) throws SQLException {
@@ -202,6 +204,12 @@ private void verifyDefaultRow(ResultSet rs, int row) throws SQLException {
202204 assertEquals (testColumnValues [12 ][row ], rs .getTimestamp ("fieldDateTime" ));
203205 assertEquals (13 , rs .findColumn ("fieldDateTime" ));
204206 assertFalse (rs .wasNull ());
207+ String sqlXmlString = ((SQLXML )testColumnValues [13 ][row ]).getString ();
208+ assertEquals (sqlXmlString , rs .getSQLXML (14 ).getString ()); // fieldSqlXml
209+ assertFalse (rs .wasNull ());
210+ assertEquals (sqlXmlString , rs .getSQLXML ("fieldSqlXml" ).getString ());
211+ assertEquals (14 , rs .findColumn ("fieldSqlXml" ));
212+ assertFalse (rs .wasNull ());
205213 verifyNonexistingField (rs );
206214 }
207215
@@ -672,6 +680,61 @@ void test_get_URL() throws SQLException {
672680 assertTrue (cachedRs .wasNull ());
673681 }
674682
683+ @ Test
684+ void test_get_sql_xml () throws SQLException {
685+ String longXml =
686+ "<product>\n " +
687+ " <manufacturer>TechCorp</manufacturer>\n " +
688+ "<specs>\n " +
689+ " <cpu>Intel i7</cpu>\n " +
690+ " <ram>16GB</ram>\n " +
691+ " <storage>512GB SSD</storage>\n " +
692+ "</specs>\n " +
693+ " <price>1200.00</price>\n " +
694+ "</product>" ;
695+ SQLXML testXml = new CachedSQLXML ("<book><title>PostgreSQL Guide</title><author>John Doe</author></book>" );
696+ SQLXML testXml2 = new CachedSQLXML (longXml );
697+ SQLXML invalidXml = new CachedSQLXML ("<root>A<blah>" );
698+ // Setup single column with string metadata (URLs stored as strings)
699+ when (mockResultSet .getMetaData ()).thenReturn (mockResultSetMetadata );
700+ when (mockResultSetMetadata .getColumnCount ()).thenReturn (1 );
701+ mockGetMetadataFields (1 , 13 );
702+ when (mockResultSet .getObject (1 )).thenReturn (testXml , testXml2 , invalidXml , "invalid-xml" , null );
703+ when (mockResultSet .next ()).thenReturn (true , true , true , true , true , false );
704+
705+ CachedResultSet cachedRs = new CachedResultSet (mockResultSet );
706+
707+ // Test actual SQLXML objects - both index and label versions
708+ assertTrue (cachedRs .next ());
709+ assertEquals (testXml .getString (), cachedRs .getSQLXML (1 ).getString ());
710+ assertFalse (cachedRs .wasNull ());
711+ assertEquals (testXml .getString (), cachedRs .getSQLXML ("fieldSqlXml" ).getString ());
712+
713+ assertTrue (cachedRs .next ());
714+ assertEquals (testXml2 .getString (), cachedRs .getSQLXML (1 ).getString ());
715+ assertFalse (cachedRs .wasNull ());
716+ assertEquals (testXml2 .getString (), cachedRs .getSQLXML ("fieldSqlXml" ).getString ());
717+
718+ assertTrue (cachedRs .next ());
719+ assertEquals (invalidXml .getString (), cachedRs .getSQLXML (1 ).getString ());
720+ assertFalse (cachedRs .wasNull ());
721+ assertEquals (invalidXml .getString (), cachedRs .getSQLXML ("fieldSqlXml" ).getString ());
722+
723+ assertTrue (cachedRs .next ());
724+ assertEquals ("invalid-xml" , cachedRs .getSQLXML (1 ).getString ());
725+ assertEquals ("invalid-xml" , cachedRs .getSQLXML ("fieldSqlXml" ).getString ());
726+ assertFalse (cachedRs .wasNull ());
727+
728+ assertTrue (cachedRs .next ());
729+ assertNull (cachedRs .getSQLXML (1 ));
730+ assertTrue (cachedRs .wasNull ());
731+ assertNull (cachedRs .getSQLXML ("fieldSqlXml" ));
732+ assertTrue (cachedRs .wasNull ());
733+
734+ assertFalse (cachedRs .next ());
735+ }
736+
737+
675738 @ Test
676739 void test_get_object_with_index_and_type () throws SQLException {
677740 // Setup single column with string metadata (mixed data types)
0 commit comments