@@ -125,12 +125,6 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
125125 } else {
126126 object = "NO" ;
127127 }
128- } else if (column .getColumnName ().equals (NULLABLE_COLUMN .getColumnName ())) {
129- if (object == null || object .equals ("true" )) {
130- object = 1 ;
131- } else {
132- object = 0 ;
133- }
134128 } else if (column .getColumnName ().equals (DECIMAL_DIGITS_COLUMN .getColumnName ())
135129 || column .getColumnName ().equals (NUM_PREC_RADIX_COLUMN .getColumnName ())) {
136130 if (object == null ) {
@@ -156,25 +150,33 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
156150 object = null ;
157151 }
158152 }
159-
153+ if (column .getColumnName ().equals (NULLABLE_COLUMN .getColumnName ())) {
154+ object = resultSet .getObject (IS_NULLABLE_COLUMN .getResultSetColumnName ());
155+ if (object == null || object .equals ("true" )) {
156+ object = 1 ;
157+ } else {
158+ object = 0 ;
159+ }
160+ }
160161 if (column .getColumnName ().equals (TABLE_TYPE_COLUMN .getColumnName ())
161162 && (object == null || object .equals ("" ))) {
162163 object = "TABLE" ;
163164 }
164165
165166 // Handle TYPE_NAME separately for potential modifications
166- if (column .getColumnName ().equals (TYPE_NAME_COLUMN .getColumnName ())) {
167+ if (column .getColumnName ().equals (COLUMN_TYPE_COLUMN .getColumnName ())) {
167168 object = stripTypeName ((String ) object );
168169 }
169170 // Set COLUMN_SIZE to 255 if it's not present
170171 if (column .getColumnName ().equals (COLUMN_SIZE_COLUMN .getColumnName ())
171172 && object == null ) {
172173 // check if typeVal is a text related field
173174 String typeVal = resultSet .getString (COLUMN_TYPE_COLUMN .getResultSetColumnName ());
174- if (typeVal != null && isTextType (typeVal )) {
175- object = 255 ;
176- } else {
175+ if (typeVal == null ) {
177176 object = 0 ;
177+ } else {
178+ int columnSize = getSizeFromTypeVal (typeVal );
179+ object = (columnSize != -1 ) ? columnSize : (isTextType (typeVal ) ? 255 : 0 );
178180 }
179181 }
180182
@@ -189,6 +191,34 @@ static List<List<Object>> getRows(ResultSet resultSet, List<ResultColumn> column
189191 return rows ;
190192 }
191193
194+ /**
195+ * Extracts the size from a SQL type definition in the format DATA_TYPE(size).
196+ *
197+ * @param typeVal The SQL type string (e.g., "VARCHAR(5000)", "CHAR(100)").
198+ * @return The size as an integer, or -1 if the size cannot be determined.
199+ */
200+ static int getSizeFromTypeVal (String typeVal ) {
201+ if (typeVal .isEmpty ()) {
202+ return -1 ; // Return -1 for invalid input
203+ }
204+
205+ // Regular expression to match DATA_TYPE(size) and extract the size
206+ String regex = "\\ w+\\ ((\\ d+)\\ )" ;
207+ java .util .regex .Pattern pattern =
208+ java .util .regex .Pattern .compile (regex , java .util .regex .Pattern .CASE_INSENSITIVE );
209+ java .util .regex .Matcher matcher = pattern .matcher (typeVal );
210+
211+ if (matcher .find ()) {
212+ try {
213+ return Integer .parseInt (matcher .group (1 ));
214+ } catch (NumberFormatException e ) {
215+ return -1 ;
216+ }
217+ }
218+
219+ return -1 ;
220+ }
221+
192222 static int getBufferLength (String typeVal , int columnSize ) {
193223 if (typeVal == null || typeVal .isEmpty ()) {
194224 return 0 ;
0 commit comments