@@ -1709,6 +1709,9 @@ MySQL_ConnectionMetaData::getBestRowIdentifier(const sql::SQLString& catalog, co
1709
1709
1710
1710
boost::scoped_ptr< sql::ResultSet > rs (getPrimaryKeys (catalog, schema, table));
1711
1711
1712
+ if (!rs->rowsCount ())
1713
+ rs.reset (getUniqueNonNullableKeys (catalog, schema, table));
1714
+
1712
1715
while (rs->next ()) {
1713
1716
sql::SQLString columnNamePattern (rs->getString (4 ));
1714
1717
@@ -3224,6 +3227,91 @@ MySQL_ConnectionMetaData::getPrimaryKeys(const sql::SQLString& catalog, const sq
3224
3227
}
3225
3228
/* }}} */
3226
3229
3230
+ /* {{{ MySQL_ConnectionMetaData::getUniqueNonNullableKeys() -I- */
3231
+ sql::ResultSet *
3232
+ MySQL_ConnectionMetaData::getUniqueNonNullableKeys (const sql::SQLString& catalog, const sql::SQLString& schema, const sql::SQLString& table)
3233
+ {
3234
+ CPP_ENTER (" MySQL_ConnectionMetaData::getPrimaryKeys" );
3235
+ CPP_INFO_FMT (" catalog=%s schema=%s table=%s" , catalog.c_str (), schema.c_str (), table.c_str ());
3236
+
3237
+ std::list<sql::SQLString> rs_field_data;
3238
+ rs_field_data.push_back (" TABLE_CAT" );
3239
+ rs_field_data.push_back (" TABLE_SCHEM" );
3240
+ rs_field_data.push_back (" TABLE_NAME" );
3241
+ rs_field_data.push_back (" COLUMN_NAME" );
3242
+ rs_field_data.push_back (" KEY_SEQ" );
3243
+ rs_field_data.push_back (" PK_NAME" );
3244
+
3245
+
3246
+ std::auto_ptr< MySQL_ArtResultSet::rset_t > rs_data (new MySQL_ArtResultSet::rset_t ());
3247
+
3248
+ /* Bind Problems with 49999, check later why */
3249
+ if (use_info_schema && server_version > 50002 ) {
3250
+ const sql::SQLString query (" SELECT TABLE_CATALOG AS TABLE_CAT, TABLE_SCHEMA AS TABLE_SCHEM, TABLE_NAME,"
3251
+ " COLUMN_NAME, SEQ_IN_INDEX AS KEY_SEQ, INDEX_NAME AS PK_NAME "
3252
+ " FROM INFORMATION_SCHEMA.STATISTICS "
3253
+ " WHERE TABLE_SCHEMA LIKE ? AND TABLE_NAME LIKE ? AND INDEX_NAME <> 'PRIMARY'"
3254
+ " AND NON_UNIQUE = 0 AND NULLABLE <> 'YES'"
3255
+ " ORDER BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX" );
3256
+
3257
+ boost::scoped_ptr< sql::PreparedStatement > stmt (connection->prepareStatement (query));
3258
+ stmt->setString (1 , schema);
3259
+ stmt->setString (2 , table);
3260
+
3261
+ boost::scoped_ptr< sql::ResultSet > rs (stmt->executeQuery ());
3262
+
3263
+ while (rs->next ()) {
3264
+ MySQL_ArtResultSet::row_t rs_data_row;
3265
+
3266
+ rs_data_row.push_back (rs->getString (1 )); // TABLE_CAT
3267
+ rs_data_row.push_back (rs->getString (2 )); // TABLE_SCHEM
3268
+ rs_data_row.push_back (rs->getString (3 )); // TABLE_NAME
3269
+ rs_data_row.push_back (rs->getString (4 )); // COLUMN_NAME
3270
+ rs_data_row.push_back (rs->getString (5 )); // KEY_SEQ
3271
+ rs_data_row.push_back (rs->getString (6 )); // PK_NAME
3272
+
3273
+ rs_data->push_back (rs_data_row);
3274
+ }
3275
+ } else {
3276
+ sql::SQLString query (" SHOW KEYS FROM `" );
3277
+ query.append (schema).append (" `.`" ).append (table).append (" `" );
3278
+
3279
+ boost::scoped_ptr< sql::Statement > stmt (connection->createStatement ());
3280
+ boost::scoped_ptr< sql::ResultSet > rs (NULL );
3281
+ try {
3282
+ rs.reset (stmt->executeQuery (query));
3283
+ } catch (SQLException &) {
3284
+ // probably schema and/or table doesn't exist. return empty set
3285
+ // do nothing here
3286
+ }
3287
+
3288
+ if (rs.get ()) {
3289
+ while (rs->next ()) {
3290
+ int non_unique = rs->getInt (" Non_unique" );
3291
+ sql::SQLString nullable = rs->getString (" Null" );
3292
+ if (non_unique == 0 && nullable.compare (" YES" )) {
3293
+ sql::SQLString key_name = rs->getString (" Key_name" );
3294
+ MySQL_ArtResultSet::row_t rs_data_row;
3295
+
3296
+ rs_data_row.push_back (" def" ); // TABLE_CAT
3297
+ rs_data_row.push_back (schema); // TABLE_SCHEM
3298
+ rs_data_row.push_back (rs->getString (1 )); // TABLE_NAME
3299
+ rs_data_row.push_back (rs->getString (" Column_name" )); // COLUMN_NAME
3300
+ rs_data_row.push_back (rs->getString (" Seq_in_index" )); // KEY_SEQ
3301
+ rs_data_row.push_back (key_name); // PK_NAME
3302
+
3303
+ rs_data->push_back (rs_data_row);
3304
+ }
3305
+ }
3306
+ }
3307
+ }
3308
+
3309
+ MySQL_ArtResultSet * ret = new MySQL_ArtResultSet (rs_field_data, rs_data.get (), logger);
3310
+ // If there is no exception we can release otherwise on function exit memory will be freed
3311
+ rs_data.release ();
3312
+ return ret;
3313
+ }
3314
+ /* }}} */
3227
3315
3228
3316
/* {{{ MySQL_ConnectionMetaData::getProcedureColumns() -U- */
3229
3317
sql::ResultSet *
0 commit comments