@@ -29,6 +29,14 @@ public static DatabendDataType getRandomWithoutNull() {
2929 return dt ;
3030 }
3131
32+ public static DatabendDataType getRandomWithoutNullAndVarchar () {
33+ DatabendDataType dt ;
34+ do {
35+ dt = Randomly .fromOptions (values ());
36+ } while (dt == DatabendDataType .NULL || dt == DatabendDataType .VARCHAR );
37+ return dt ;
38+ }
39+
3240 }
3341
3442 public static class DatabendCompositeDataType {
@@ -82,24 +90,24 @@ public String toString() {
8290 case INT :
8391 switch (size ) {
8492 case 8 :
85- return Randomly .fromOptions ("BIGINT" , "INT8 " );
93+ return Randomly .fromOptions ("BIGINT" , "INT64 " );
8694 case 4 :
87- return Randomly .fromOptions ("INTEGER" , " INT" , "INT4" , "SIGNED " );
95+ return Randomly .fromOptions ("INT" , "INT32 " );
8896 case 2 :
89- return Randomly .fromOptions ("SMALLINT" , "INT2 " );
97+ return Randomly .fromOptions ("SMALLINT" , "INT16 " );
9098 case 1 :
91- return Randomly .fromOptions ("TINYINT" , "INT1 " );
99+ return Randomly .fromOptions ("TINYINT" , "INT8 " );
92100 default :
93101 throw new AssertionError (size );
94102 }
95103 case VARCHAR :
96- return "VARCHAR" ;
104+ return Randomly . fromOptions ( "VARCHAR" ) ;
97105 case FLOAT :
98106 switch (size ) {
99107 case 8 :
100108 return Randomly .fromOptions ("DOUBLE" );
101109 case 4 :
102- return Randomly .fromOptions ("REAL" , "FLOAT4 " );
110+ return Randomly .fromOptions ("FLOAT " );
103111 default :
104112 throw new AssertionError (size );
105113 }
@@ -162,7 +170,7 @@ private static DatabendCompositeDataType getColumnType(String typeString) {
162170 return new DatabendCompositeDataType (DatabendDataType .FLOAT , 8 );
163171 }
164172 switch (typeString ) {
165- case "INTEGER " :
173+ case "INT " :
166174 primitiveType = DatabendDataType .INT ;
167175 size = 4 ;
168176 break ;
@@ -171,7 +179,6 @@ private static DatabendCompositeDataType getColumnType(String typeString) {
171179 size = 2 ;
172180 break ;
173181 case "BIGINT" :
174- case "HUGEINT" : // TODO: 16-bit int
175182 primitiveType = DatabendDataType .INT ;
176183 size = 8 ;
177184 break ;
@@ -222,12 +229,12 @@ public DatabendTable(String tableName, List<DatabendColumn> columns, boolean isV
222229
223230 public static DatabendSchema fromConnection (SQLConnection con , String databaseName ) throws SQLException {
224231 List <DatabendTable > databaseTables = new ArrayList <>();
225- List <String > tableNames = getTableNames (con );
232+ List <String > tableNames = getTableNames (con , databaseName );
226233 for (String tableName : tableNames ) {
227234 if (DBMSCommon .matchesIndexName (tableName )) {
228235 continue ; // TODO: unexpected?
229236 }
230- List <DatabendColumn > databaseColumns = getTableColumns (con , tableName );
237+ List <DatabendColumn > databaseColumns = getTableColumns (con , tableName , databaseName );
231238 boolean isView = tableName .startsWith ("v" );
232239 DatabendTable t = new DatabendTable (tableName , databaseColumns , isView );
233240 for (DatabendColumn c : databaseColumns ) {
@@ -239,37 +246,52 @@ public static DatabendSchema fromConnection(SQLConnection con, String databaseNa
239246 return new DatabendSchema (databaseTables );
240247 }
241248
242- private static List <String > getTableNames (SQLConnection con ) throws SQLException {
243- List <String > tableNames = new ArrayList <>();
249+ private static List <String > getTableNames (SQLConnection con , String databaseName ) throws SQLException {
250+ List <String > tableNames = null ;
251+ tableNames = new ArrayList <>();
252+ //SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema != 'system' and table_schema != 'INFORMATION_SCHEMA' and table_type='BASE TABLE'
253+ //"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '%s' and table_type='BASE TABLE' ",databaseName
254+ final String sqlStatement = String .format (
255+ "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '%s' and table_type='BASE TABLE' " ,databaseName );
244256 try (Statement s = con .createStatement ()) {
245- try (ResultSet rs = s .executeQuery ("SELECT * FROM sqlite_master WHERE type='table' or type='view'" )) {
246- while (rs .next ()) {
247- tableNames .add (rs .getString ("name" ));
257+ try (ResultSet rs = s .executeQuery (sqlStatement )) {
258+ try { //没有catch的话rs.next()会报SQLException:Not a navigable ResultSet
259+ while (rs .next ()) {
260+ tableNames .add (rs .getString ("table_name" ));
261+ }
262+ } catch (Exception e ){
263+ // e.printStackTrace();
264+ System .out .println ("TableNames->SQLException:Not a navigable ResultSet" );
248265 }
249266 }
250267 }
251268 return tableNames ;
252269 }
253270
254- private static List <DatabendColumn > getTableColumns (SQLConnection con , String tableName ) throws SQLException {
271+ private static List <DatabendColumn > getTableColumns (SQLConnection con , String tableName , String databaseName ) throws SQLException {
255272 List <DatabendColumn > columns = new ArrayList <>();
256273 try (Statement s = con .createStatement ()) {
257- try (ResultSet rs = s .executeQuery (String .format ("SELECT * FROM pragma_table_info('%s');" , tableName ))) {
258- while (rs .next ()) {
259- String columnName = rs .getString ("name" );
260- String dataType = rs .getString ("type" );
261- boolean isNullable = rs .getString ("notnull" ).contentEquals ("false" );
262- boolean isPrimaryKey = rs .getString ("pk" ).contains ("true" );
263- DatabendColumn c = new DatabendColumn (columnName , getColumnType (dataType ), isPrimaryKey , isNullable );
264- columns .add (c );
274+ try (ResultSet rs = s .executeQuery (String .format (
275+ "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = '%s' and table_name ='%s'" ,
276+ databaseName ,tableName ))) {
277+ try { //没有catch的话rs.next()会报SQLException:Not a navigable ResultSet
278+ while (rs .next ()) {
279+ String columnName = rs .getString ("column_name" );
280+ String dataType = rs .getString ("data_type" );
281+ boolean isNullable = rs .getBoolean ("is_nullable" );
282+ // boolean isPrimaryKey = rs.getString("pk").contains("true");
283+ boolean isPrimaryKey = false ; //没找到主键元数据
284+ DatabendColumn c = new DatabendColumn (columnName , getColumnType (dataType ), isPrimaryKey , isNullable );
285+ columns .add (c );
286+ }
287+ } catch (Exception e ) {
288+ System .out .println ("TableColumns->SQLException:Not a navigable ResultSet" );
265289 }
266290 }
267291 }
268292 if (columns .stream ().noneMatch (c -> c .isPrimaryKey ())) {
269- // https://github.com/cwida/Databend/issues/589
270- // https://github.com/cwida/Databend/issues/588
271293 // TODO: implement an option to enable/disable rowids
272- columns .add (new DatabendColumn ("rowid" , new DatabendCompositeDataType (DatabendDataType .INT , 4 ), false , false ));
294+ // columns.add(new DatabendColumn("rowid", new DatabendCompositeDataType(DatabendDataType.INT, 4), false, false));
273295 }
274296 return columns ;
275297 }
0 commit comments