Index: Driver/Source/ISSchemaProvider.cs =================================================================== --- Driver/Source/ISSchemaProvider.cs (revision 1297) +++ Driver/Source/ISSchemaProvider.cs (working copy) @@ -87,7 +87,7 @@ { string[] keys = new string[1]; keys[0] = "SCHEMA_NAME"; - DataTable dt = Query("SCHEMATA", "", keys, restrictions); + DataTable dt = Query("INFORMATION_SCHEMA", "SCHEMATA", "", keys, restrictions); dt.Columns[1].ColumnName = "database_name"; dt.TableName = "Databases"; return dt; @@ -100,7 +100,7 @@ keys[1] = "TABLE_SCHEMA"; keys[2] = "TABLE_NAME"; keys[3] = "TABLE_TYPE"; - DataTable dt = Query("TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions); + DataTable dt = Query("INFORMATION_SCHEMA", "TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions); dt.TableName = "Tables"; return dt; } @@ -112,7 +112,7 @@ keys[1] = "TABLE_SCHEMA"; keys[2] = "TABLE_NAME"; keys[3] = "COLUMN_NAME"; - DataTable dt = Query("COLUMNS", null, keys, restrictions); + DataTable dt = Query("INFORMATION_SCHEMA", "COLUMNS", null, keys, restrictions); dt.Columns.Remove("CHARACTER_OCTET_LENGTH"); dt.TableName = "Columns"; return dt; @@ -124,7 +124,7 @@ keys[0] = "TABLE_CATALOG"; keys[1] = "TABLE_SCHEMA"; keys[2] = "TABLE_NAME"; - DataTable dt = Query("VIEWS", null, keys, restrictions); + DataTable dt = Query("INFORMATION_SCHEMA", "VIEWS", null, keys, restrictions); dt.TableName = "Views"; return dt; } @@ -170,12 +170,39 @@ keys[1] = "TRIGGER_SCHEMA"; keys[2] = "EVENT_OBJECT_TABLE"; keys[3] = "TRIGGER_NAME"; - DataTable dt = Query("TRIGGERS", null, keys, restrictions); + DataTable dt = Query("INFORMATION_SCHEMA", "TRIGGERS", null, keys, restrictions); dt.TableName = "Triggers"; return dt; } /// + /// Return column names from mysql.proc that + /// correspond to information_schema colulmns + /// + /// + /// + private string GetRoutineColName(string name) + { + if (connection.Settings.UseProcedureBodies) + { + switch (name) + { + case "ROUTINE_CATALOG": + return "NULL"; + case "ROUTINE_SCHEMA": + return "db"; + case "ROUTINE_NAME": + return "name"; + case "ROUTINE_TYPE": + return "type"; + default: + return name; + } + } + return name; + } + + /// /// Return schema information about procedures and functions /// Restrictions supported are: /// schema, name, type @@ -185,12 +212,19 @@ private DataTable GetProcedures(string[] restrictions) { string[] keys = new string[4]; + string schema = "INFORMATION_SCHEMA"; + string table = "ROUTINES"; + if (connection.Settings.UseProcedureBodies) + { + schema = "mysql"; + table = "proc"; + } keys[0] = "ROUTINE_CATALOG"; keys[1] = "ROUTINE_SCHEMA"; keys[2] = "ROUTINE_NAME"; keys[3] = "ROUTINE_TYPE"; - DataTable dt = Query("ROUTINES", null, keys, restrictions); + DataTable dt = Query(schema, table, null, keys, restrictions); dt.TableName = "Procedures"; return dt; } @@ -303,11 +337,16 @@ return null; } - private DataTable Query(string table_name, string initial_where, + private DataTable Query(string schema, string table_name, string initial_where, string[] keys, string[] values) { StringBuilder where = new StringBuilder(initial_where); - StringBuilder query = new StringBuilder("SELECT * FROM INFORMATION_SCHEMA."); + + string field_list = ""; + if (schema.Equals("mysql")) + field_list = ", specific_name as SPECIFIC_NAME, NULL as ROUTINE_CATALOG, db as ROUTINE_SCHEMA, name as ROUTINE_NAME, type as ROUTINE_TYPE, sql_mode as SQL_MODE "; + + StringBuilder query = new StringBuilder("SELECT * " + field_list + " FROM " + schema + "."); query.Append(table_name); if (values != null) @@ -317,7 +356,7 @@ if (values[i] == null || values[i] == String.Empty) continue; if (where.Length > 0) where.Append(" AND "); - where.AppendFormat(CultureInfo.InvariantCulture, "{0}='{1}'", keys[i], values[i]); + where.AppendFormat(CultureInfo.InvariantCulture, "{0}='{1}'", GetRoutineColName(keys[i]), values[i]); } if (where.Length > 0)