55import java .util .*;
66import org .postgresql .core .BaseStatement ;
77import org .postgresql .core .Field ;
8+ import org .postgresql .core .Encoding ;
89import org .postgresql .util .PSQLException ;
910import org .postgresql .util .PSQLState ;
1011import org .postgresql .Driver ;
@@ -22,6 +23,7 @@ public abstract class AbstractJdbc1DatabaseMetaData
2223"vacuum,verbose,version" ;
2324
2425protected AbstractJdbc1Connection connection ;// The connection association
26+ protected Encoding encoding ;
2527
2628// These define various OID's. Hopefully they will stay constant.
2729protected static final int iVarcharOid =1043 ;// OID for varchar
@@ -73,6 +75,13 @@ protected int getMaxNameLength() throws SQLException {
7375public AbstractJdbc1DatabaseMetaData (AbstractJdbc1Connection conn )
7476{
7577this .connection =conn ;
78+ try {
79+ this .encoding =conn .getEncoding ();
80+ }
81+ catch (SQLException sqle ) {
82+ this .encoding =Encoding .defaultEncoding ();
83+ }
84+
7685}
7786
7887/*
@@ -1858,15 +1867,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
18581867tuple [0 ] =null ;
18591868tuple [1 ] =schema ;
18601869tuple [2 ] =procedureName ;
1861- tuple [3 ] ="returnValue" . getBytes ( );
1862- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnReturn ). getBytes ( );
1863- tuple [5 ] =Integer .toString (connection .getSQLType (returnType )). getBytes ( );
1864- tuple [6 ] =connection .getPGType (returnType ). getBytes ( );
1870+ tuple [3 ] =encoding . encode ( "returnValue" );
1871+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnReturn ));
1872+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (returnType )));
1873+ tuple [6 ] =encoding . encode ( connection .getPGType (returnType ));
18651874tuple [7 ] =null ;
18661875tuple [8 ] =null ;
18671876tuple [9 ] =null ;
18681877tuple [10 ] =null ;
1869- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1878+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
18701879tuple [12 ] =null ;
18711880v .addElement (tuple );
18721881}
@@ -1878,15 +1887,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
18781887tuple [0 ] =null ;
18791888tuple [1 ] =schema ;
18801889tuple [2 ] =procedureName ;
1881- tuple [3 ] = ("$" +(i +1 )). getBytes ( );
1882- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnIn ). getBytes ( );
1883- tuple [5 ] =Integer .toString (connection .getSQLType (argOid )). getBytes ( );
1884- tuple [6 ] =connection .getPGType (argOid ). getBytes ( );
1890+ tuple [3 ] =encoding . encode ("$" +(i +1 ));
1891+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnIn ));
1892+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (argOid )));
1893+ tuple [6 ] =encoding . encode ( connection .getPGType (argOid ));
18851894tuple [7 ] =null ;
18861895tuple [8 ] =null ;
18871896tuple [9 ] =null ;
18881897tuple [10 ] =null ;
1889- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1898+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
18901899tuple [12 ] =null ;
18911900v .addElement (tuple );
18921901}
@@ -1901,15 +1910,15 @@ public java.sql.ResultSet getProcedureColumns(String catalog, String schemaPatte
19011910tuple [0 ] =null ;
19021911tuple [1 ] =schema ;
19031912tuple [2 ] =procedureName ;
1904- tuple [3 ] =columnrs .getString ("attname" ). getBytes ( );
1905- tuple [4 ] =Integer .toString (java .sql .DatabaseMetaData .procedureColumnResult ). getBytes ( );
1906- tuple [5 ] =Integer .toString (connection .getSQLType (columnTypeOid )). getBytes ( );
1907- tuple [6 ] =connection .getPGType (columnTypeOid ). getBytes ( );
1913+ tuple [3 ] =columnrs .getBytes ("attname" );
1914+ tuple [4 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureColumnResult ));
1915+ tuple [5 ] =encoding . encode ( Integer .toString (connection .getSQLType (columnTypeOid )));
1916+ tuple [6 ] =encoding . encode ( connection .getPGType (columnTypeOid ));
19081917tuple [7 ] =null ;
19091918tuple [8 ] =null ;
19101919tuple [9 ] =null ;
19111920tuple [10 ] =null ;
1912- tuple [11 ] =Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ). getBytes ( );
1921+ tuple [11 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .procedureNullableUnknown ));
19131922tuple [12 ] =null ;
19141923v .addElement (tuple );
19151924}
@@ -2205,7 +2214,7 @@ public java.sql.ResultSet getTableTypes() throws SQLException
22052214for (i =0 ;i <types .length ;i ++)
22062215{
22072216byte [][]tuple =new byte [1 ][];
2208- tuple [0 ] =types [i ]. getBytes ( );
2217+ tuple [0 ] =encoding . encode ( types [i ]);
22092218v .addElement (tuple );
22102219}
22112220
@@ -2338,46 +2347,46 @@ public java.sql.ResultSet getColumns(String catalog, String schemaPattern, Strin
23382347tuple [1 ] =rs .getBytes ("nspname" );// Schema
23392348tuple [2 ] =rs .getBytes ("relname" );// Table name
23402349tuple [3 ] =rs .getBytes ("attname" );// Column name
2341- tuple [4 ] =Integer .toString (connection .getSQLType (typeOid )). getBytes ( );
2350+ tuple [4 ] =encoding . encode ( Integer .toString (connection .getSQLType (typeOid )));
23422351String pgType =connection .getPGType (typeOid );
2343- tuple [5 ] =pgType . getBytes (); // Type name
2352+ tuple [5 ] =encoding . encode ( pgType ); // Type name
23442353
23452354// by default no decimal_digits
23462355// if the type is numeric or decimal we will
23472356// overwrite later.
2348- tuple [8 ] ="0" . getBytes ( );
2357+ tuple [8 ] =encoding . encode ( "0" );
23492358
23502359if (pgType .equals ("bpchar" ) ||pgType .equals ("varchar" ))
23512360{
23522361int atttypmod =rs .getInt ("atttypmod" );
2353- tuple [6 ] =Integer .toString (atttypmod != -1 ?atttypmod -VARHDRSZ :0 ). getBytes ( );
2362+ tuple [6 ] =encoding . encode ( Integer .toString (atttypmod != -1 ?atttypmod -VARHDRSZ :0 ));
23542363}
23552364else if (pgType .equals ("numeric" ) ||pgType .equals ("decimal" ))
23562365{
23572366int attypmod =rs .getInt ("atttypmod" ) -VARHDRSZ ;
2358- tuple [6 ] =Integer .toString ( (attypmod >>16 ) &0xffff ). getBytes ( );
2359- tuple [8 ] =Integer .toString (attypmod &0xffff ). getBytes ( );
2360- tuple [9 ] ="10" . getBytes ( );
2367+ tuple [6 ] =encoding . encode ( Integer .toString ( (attypmod >>16 ) &0xffff ));
2368+ tuple [8 ] =encoding . encode ( Integer .toString (attypmod &0xffff ));
2369+ tuple [9 ] =encoding . encode ( "10" );
23612370}
23622371else if (pgType .equals ("bit" ) ||pgType .equals ("varbit" )) {
23632372tuple [6 ] =rs .getBytes ("atttypmod" );
2364- tuple [9 ] ="2" . getBytes ( );
2373+ tuple [9 ] =encoding . encode ( "2" );
23652374}
23662375else {
23672376tuple [6 ] =rs .getBytes ("attlen" );
2368- tuple [9 ] ="10" . getBytes ( );
2377+ tuple [9 ] =encoding . encode ( "10" );
23692378}
23702379
23712380tuple [7 ] =null ;// Buffer length
23722381
2373- tuple [10 ] =Integer .toString (rs .getBoolean ("attnotnull" ) ?java .sql .DatabaseMetaData .columnNoNulls :java .sql .DatabaseMetaData .columnNullable ). getBytes ( );// Nullable
2382+ tuple [10 ] =encoding . encode ( Integer .toString (rs .getBoolean ("attnotnull" ) ?java .sql .DatabaseMetaData .columnNoNulls :java .sql .DatabaseMetaData .columnNullable ));// Nullable
23742383tuple [11 ] =rs .getBytes ("description" );// Description (if any)
23752384tuple [12 ] =rs .getBytes ("adsrc" );// Column default
23762385tuple [13 ] =null ;// sql data type (unused)
23772386tuple [14 ] =null ;// sql datetime sub (unused)
23782387tuple [15 ] =tuple [6 ];// char octet length
23792388tuple [16 ] =rs .getBytes ("attnum" );// ordinal position
2380- tuple [17 ] = (rs .getBoolean ("attnotnull" ) ?"NO" :"YES" ). getBytes ( );// Is nullable
2389+ tuple [17 ] =encoding . encode (rs .getBoolean ("attnotnull" ) ?"NO" :"YES" );// Is nullable
23812390
23822391v .addElement (tuple );
23832392}
@@ -2476,7 +2485,7 @@ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, Str
24762485}
24772486sortStringArray (permNames );
24782487for (i =0 ;i <permNames .length ;i ++) {
2479- byte []privilege =permNames [i ]. getBytes ( );
2488+ byte []privilege =encoding . encode ( permNames [i ]);
24802489Vector grantees = (Vector )permissions .get (permNames [i ]);
24812490for (int j =0 ;j <grantees .size ();j ++) {
24822491String grantee = (String )grantees .elementAt (j );
@@ -2486,10 +2495,10 @@ public java.sql.ResultSet getColumnPrivileges(String catalog, String schema, Str
24862495tuple [1 ] =schemaName ;
24872496tuple [2 ] =tableName ;
24882497tuple [3 ] =column ;
2489- tuple [4 ] =owner . getBytes ( );
2490- tuple [5 ] =grantee . getBytes ( );
2498+ tuple [4 ] =encoding . encode ( owner );
2499+ tuple [5 ] =encoding . encode ( grantee );
24912500tuple [6 ] =privilege ;
2492- tuple [7 ] =grantable . getBytes ( );
2501+ tuple [7 ] =encoding . encode ( grantable );
24932502v .addElement (tuple );
24942503}
24952504}
@@ -2579,7 +2588,7 @@ public java.sql.ResultSet getTablePrivileges(String catalog, String schemaPatter
25792588}
25802589sortStringArray (permNames );
25812590for (i =0 ;i <permNames .length ;i ++) {
2582- byte []privilege =permNames [i ]. getBytes ( );
2591+ byte []privilege =encoding . encode ( permNames [i ]);
25832592Vector grantees = (Vector )permissions .get (permNames [i ]);
25842593for (int j =0 ;j <grantees .size ();j ++) {
25852594String grantee = (String )grantees .elementAt (j );
@@ -2588,10 +2597,10 @@ public java.sql.ResultSet getTablePrivileges(String catalog, String schemaPatter
25882597tuple [0 ] =null ;
25892598tuple [1 ] =schema ;
25902599tuple [2 ] =table ;
2591- tuple [3 ] =owner . getBytes ( );
2592- tuple [4 ] =grantee . getBytes ( );
2600+ tuple [3 ] =encoding . encode ( owner );
2601+ tuple [4 ] =encoding . encode ( grantee );
25932602tuple [5 ] =privilege ;
2594- tuple [6 ] =grantable . getBytes ( );
2603+ tuple [6 ] =encoding . encode ( grantable );
25952604v .addElement (tuple );
25962605}
25972606}
@@ -2785,14 +2794,14 @@ public java.sql.ResultSet getBestRowIdentifier(String catalog, String schema, St
27852794while (rs .next ()) {
27862795byte tuple [][] =new byte [8 ][];
27872796int columnTypeOid =rs .getInt ("atttypid" );
2788- tuple [0 ] =Integer .toString (scope ). getBytes ( );
2797+ tuple [0 ] =encoding . encode ( Integer .toString (scope ));
27892798tuple [1 ] =rs .getBytes ("attname" );
2790- tuple [2 ] =Integer .toString (connection .getSQLType (columnTypeOid )). getBytes ( );
2791- tuple [3 ] =connection .getPGType (columnTypeOid ). getBytes ( );
2799+ tuple [2 ] =encoding . encode ( Integer .toString (connection .getSQLType (columnTypeOid )));
2800+ tuple [3 ] =encoding . encode ( connection .getPGType (columnTypeOid ));
27922801tuple [4 ] =null ;
27932802tuple [5 ] =null ;
27942803tuple [6 ] =null ;
2795- tuple [7 ] =Integer .toString (java .sql .DatabaseMetaData .bestRowNotPseudo ). getBytes ( );
2804+ tuple [7 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .bestRowNotPseudo ));
27962805v .addElement (tuple );
27972806}
27982807
@@ -2854,13 +2863,13 @@ public java.sql.ResultSet getVersionColumns(String catalog, String schema, Strin
28542863 */
28552864
28562865tuple [0 ] =null ;
2857- tuple [1 ] ="ctid" . getBytes ( );
2858- tuple [2 ] =Integer .toString (connection .getSQLType ("tid" )). getBytes ( );
2859- tuple [3 ] ="tid" . getBytes ( );
2866+ tuple [1 ] =encoding . encode ( "ctid" );
2867+ tuple [2 ] =encoding . encode ( Integer .toString (connection .getSQLType ("tid" )));
2868+ tuple [3 ] =encoding . encode ( "tid" );
28602869tuple [4 ] =null ;
28612870tuple [5 ] =null ;
28622871tuple [6 ] =null ;
2863- tuple [7 ] =Integer .toString (java .sql .DatabaseMetaData .versionColumnPseudo ). getBytes ( );
2872+ tuple [7 ] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .versionColumnPseudo ));
28642873v .addElement (tuple );
28652874
28662875/* Perhaps we should check that the given
@@ -3157,7 +3166,7 @@ else if ("setdefault".equals(rule))
31573166else if ("restrict" .equals (rule ))
31583167action =java .sql .DatabaseMetaData .importedKeyRestrict ;
31593168
3160- tuple [9 ] =Integer .toString (action ). getBytes ( );
3169+ tuple [9 ] =encoding . encode ( Integer .toString (action ));
31613170
31623171}
31633172
@@ -3177,7 +3186,7 @@ else if ("setdefault".equals(rule))
31773186action =java .sql .DatabaseMetaData .importedKeySetDefault ;
31783187else if ("restrict" .equals (rule ))
31793188action =java .sql .DatabaseMetaData .importedKeyRestrict ;
3180- tuple [10 ] =Integer .toString (action ). getBytes ( );
3189+ tuple [10 ] =encoding . encode ( Integer .toString (action ));
31813190}
31823191
31833192
@@ -3217,11 +3226,11 @@ else if ("restrict".equals(rule))
32173226pkeyColumn = (String )tokens .elementAt (element );
32183227}
32193228
3220- tuple [3 ] =pkeyColumn . getBytes ( );//PKCOLUMN_NAME
3221- tuple [7 ] =fkeyColumn . getBytes ( );//FKCOLUMN_NAME
3229+ tuple [3 ] =encoding . encode ( pkeyColumn );//PKCOLUMN_NAME
3230+ tuple [7 ] =encoding . encode ( fkeyColumn );//FKCOLUMN_NAME
32223231
32233232tuple [8 ] =rs .getBytes (6 );//KEY_SEQ
3224- tuple [11 ] =fkName . getBytes ( );//FK_NAME this will give us a unique name for the foreign key
3233+ tuple [11 ] =encoding . encode ( fkName );//FK_NAME this will give us a unique name for the foreign key
32253234tuple [12 ] =rs .getBytes (7 );//PK_NAME
32263235
32273236// DEFERRABILITY
@@ -3235,7 +3244,7 @@ else if ("restrict".equals(rule))
32353244else
32363245deferrability =java .sql .DatabaseMetaData .importedKeyInitiallyImmediate ;
32373246}
3238- tuple [13 ] =Integer .toString (deferrability ). getBytes ( );
3247+ tuple [13 ] =encoding . encode ( Integer .toString (deferrability ));
32393248
32403249tuples .addElement (tuple );
32413250}
@@ -3498,18 +3507,18 @@ public java.sql.ResultSet getTypeInfo() throws SQLException
34983507ResultSet rs =connection .createStatement ().executeQuery (sql );
34993508// cache some results, this will keep memory useage down, and speed
35003509// things up a little.
3501- byte b9 [] ="9" . getBytes ( );
3502- byte b10 [] ="10" . getBytes ( );
3503- byte bf [] ="f" . getBytes ( );
3504- byte bnn [] =Integer .toString (java .sql .DatabaseMetaData .typeNoNulls ). getBytes ( );
3505- byte bts [] =Integer .toString (java .sql .DatabaseMetaData .typeSearchable ). getBytes ( );
3510+ byte b9 [] =encoding . encode ( "9" );
3511+ byte b10 [] =encoding . encode ( "10" );
3512+ byte bf [] =encoding . encode ( "f" );
3513+ byte bnn [] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .typeNoNulls ));
3514+ byte bts [] =encoding . encode ( Integer .toString (java .sql .DatabaseMetaData .typeSearchable ));
35063515
35073516while (rs .next ())
35083517{
35093518byte [][]tuple =new byte [18 ][];
35103519String typname =rs .getString (1 );
3511- tuple [0 ] =typname . getBytes ( );
3512- tuple [1 ] =Integer .toString (connection .getSQLType (typname )). getBytes ( );
3520+ tuple [0 ] =encoding . encode ( typname );
3521+ tuple [1 ] =encoding . encode ( Integer .toString (connection .getSQLType (typname )));
35133522tuple [2 ] =b9 ;// for now
35143523tuple [6 ] =bnn ;// for now
35153524tuple [7 ] =bf ;// false for now - not case sensitive