Index: driver/catalog.c
===================================================================
--- driver/catalog.c    (Revision 488)
+++ driver/catalog.c    (Arbeitskopie)
@@ -2123,6 +2123,7 @@
   SQLRETURN rc;
   STMT *stmt= (STMT *)hstmt;

+
   MYODBCDbgEnter;

   CLEAR_STMT_ERROR(hstmt);
@@ -2155,7 +2156,7 @@
     look up procedures from the current database. (This is not standard
     behavior, but seems useful.)
   */
-  if (szCatalogName)
+  if (szCatalogName && szProcName)
     rc= my_SQLPrepare(hstmt, (SQLCHAR *)
                       "SELECT ROUTINE_SCHEMA AS PROCEDURE_CAT,"
                       "NULL AS PROCEDURE_SCHEM,"
@@ -2166,10 +2167,10 @@
                       "ROUTINE_COMMENT AS REMARKS,"
                       "IF(ROUTINE_TYPE = 'FUNCTION', 2,"
                         "IF(ROUTINE_TYPE= 'PROCEDURE', 1, 0)) AS PROCEDURE_TYPE"
-                      "  FROM INFORMATION_SCHEMA.ROUTINES"
+                      " FROM INFORMATION_SCHEMA.ROUTINES"
                       " WHERE ROUTINE_NAME LIKE ? AND ROUTINE_SCHEMA = ?",
                       SQL_NTS);
-  else
+  else if (szProcName)
     rc= my_SQLPrepare(hstmt, (SQLCHAR *)
                       "SELECT ROUTINE_SCHEMA AS PROCEDURE_CAT,"
                       "NULL AS PROCEDURE_SCHEM,"
@@ -2180,19 +2181,36 @@
                       "ROUTINE_COMMENT AS REMARKS,"
                       "IF(ROUTINE_TYPE = 'FUNCTION', 2,"
                         "IF(ROUTINE_TYPE= 'PROCEDURE', 1, 0)) AS PROCEDURE_TYPE"
-                      "  FROM INFORMATION_SCHEMA.ROUTINES"
+                      " FROM INFORMATION_SCHEMA.ROUTINES"
                       " WHERE ROUTINE_NAME LIKE ?"
                       " AND ROUTINE_SCHEMA = DATABASE()",
                       SQL_NTS);
+  else
+    rc= my_SQLPrepare(hstmt, (SQLCHAR *)
+                      "SELECT ROUTINE_SCHEMA AS PROCEDURE_CAT,"
+                      "NULL AS PROCEDURE_SCHEM,"
+                      "ROUTINE_NAME AS PROCEDURE_NAME,"
+                      "NULL AS NUM_INPUT_PARAMS,"
+                      "NULL AS NUM_OUTPUT_PARAMS,"
+                      "NULL AS NUM_RESULT_SETS,"
+                      "ROUTINE_COMMENT AS REMARKS,"
+                      "IF(ROUTINE_TYPE = 'FUNCTION', 2,"
+                        " IF(ROUTINE_TYPE= 'PROCEDURE', 1, 0)) AS PROCEDURE_TYPE"
+                      " FROM INFORMATION_SCHEMA.ROUTINES"
+                      " WHERE ROUTINE_SCHEMA = DATABASE()",
+                      SQL_NTS);
   if (!SQL_SUCCEEDED(rc))
     return rc;

-  if (cbProcName == SQL_NTS)
-    cbProcName= strlen((const char *)szProcName);
-  rc= my_SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_C_CHAR,
-                          0, 0, szProcName, cbProcName, NULL);
-  if (!SQL_SUCCEEDED(rc))
-    return rc;
+  if (szProcName)
+  {
+    if (cbProcName == SQL_NTS)
+      cbProcName= strlen((const char *)szProcName);
+    rc= my_SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_C_CHAR,
+                            0, 0, szProcName, cbProcName, NULL);
+    if (!SQL_SUCCEEDED(rc))
+      return rc;
+  }

   if (szCatalogName)
   {
Index: test/my_catalog.c
===================================================================
--- test/my_catalog.c   (Revision 488)
+++ test/my_catalog.c   (Arbeitskopie)
@@ -1276,7 +1276,16 @@
   return OK;
 }

+DECLARE_TEST(t_bug28316)
+{
+  SQLRETURN rc;

+  ok_stmt(hstmt, SQLProcedures(hstmt, NULL, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS));
+
+  return OK;
+}
+
+
 BEGIN_TESTS
   ADD_TEST(my_columns_null)
   ADD_TEST(my_drop_table)
@@ -1296,6 +1305,7 @@
   ADD_TEST(t_bug4518)
   ADD_TEST(empty_set)
   ADD_TEST(t_bug23031)
+  ADD_TEST(t_bug28316)
 END_TESTS

