2626import com .google .cloud .spanner .Type .StructField ;
2727import com .google .cloud .spanner .connection .Connection .InternalMetadataQuery ;
2828import com .google .common .annotations .VisibleForTesting ;
29+ import com .google .common .base .Preconditions ;
2930import com .google .common .collect .ImmutableSet ;
3031import java .io .BufferedReader ;
3132import java .io .InputStream ;
3233import java .io .InputStreamReader ;
34+ import java .nio .charset .StandardCharsets ;
3335import java .sql .Connection ;
3436import java .sql .DatabaseMetaData ;
3537import java .sql .ResultSet ;
4042import java .util .Collections ;
4143import java .util .Properties ;
4244import java .util .Scanner ;
45+ import java .util .concurrent .ConcurrentHashMap ;
46+ import java .util .concurrent .ConcurrentMap ;
4347
4448/** {@link DatabaseMetaData} implementation for Cloud Spanner */
4549class JdbcDatabaseMetaData extends AbstractJdbcWrapper implements DatabaseMetaData {
@@ -50,18 +54,19 @@ class JdbcDatabaseMetaData extends AbstractJdbcWrapper implements DatabaseMetaDa
5054 private static final String PRODUCT_NAME = "Google Cloud Spanner" ;
5155 private static final String POSTGRESQL_PRODUCT_NAME = PRODUCT_NAME + " PostgreSQL" ;
5256
57+ private static final ConcurrentMap <String , String > SQL_CACHE = new ConcurrentHashMap <>();
58+
5359 @ VisibleForTesting
5460 static String readSqlFromFile (String filename , Dialect dialect ) {
55- InputStream in ;
56- switch (dialect ) {
57- case POSTGRESQL :
58- in = JdbcDatabaseMetaData .class .getResourceAsStream ("postgresql/" + filename );
59- break ;
60- case GOOGLE_STANDARD_SQL :
61- default :
62- in = JdbcDatabaseMetaData .class .getResourceAsStream (filename );
63- }
64- BufferedReader reader = new BufferedReader (new InputStreamReader (in ));
61+ return SQL_CACHE .computeIfAbsent (
62+ filename + "/" + dialect , (key ) -> loadSqlFromFile (filename , dialect ));
63+ }
64+
65+ private static String loadSqlFromFile (String filename , Dialect dialect ) {
66+ String resourcePath = dialect == Dialect .POSTGRESQL ? "postgresql/" + filename : filename ;
67+ InputStream in = JdbcDatabaseMetaData .class .getResourceAsStream (resourcePath );
68+ Preconditions .checkNotNull (in , "Resource not found: " + resourcePath );
69+ BufferedReader reader = new BufferedReader (new InputStreamReader (in , StandardCharsets .UTF_8 ));
6570 StringBuilder builder = new StringBuilder ();
6671 try (Scanner scanner = new Scanner (reader )) {
6772 while (scanner .hasNextLine ()) {
0 commit comments