~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/drizzle.cc

doStartTableScan() result not checked.

Add __attribute__((warn_unused_result)) to Cursor::startTableScan()
and by extension init_read_records

then go and fix the places where we weren't checking for errors.

This patch helped by Monty Widenius' patch to MariaDB. Greatly increased
confidence that we either handle the errors correctly or are at least
on par with bugs :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
368
368
  com_nopager(string *str, const char*), com_pager(string *str, const char*);
369
369
 
370
370
static int read_and_execute(bool interactive);
371
 
static int sql_connect(const string &host, const string &database, const string &user, const string &password);
 
371
static int sql_connect(const string &host, const string &database, const string &user, const string &password,
 
372
                       uint32_t silent);
372
373
static const char *server_version_string(drizzle_con_st *con);
373
374
static int put_info(const char *str,INFO_TYPE info,uint32_t error,
374
375
                    const char *sql_state);
1280
1281
# if defined(HAVE_LOCALE_H)
1281
1282
  setlocale(LC_ALL, "");
1282
1283
# endif
1283
 
  bindtextdomain("drizzle7", LOCALEDIR);
1284
 
  textdomain("drizzle7");
 
1284
  bindtextdomain("drizzle", LOCALEDIR);
 
1285
  textdomain("drizzle");
1285
1286
#endif
1286
1287
 
1287
 
  po::options_description commandline_options(_("Options used only in command line"));
 
1288
  po::options_description commandline_options(N_("Options used only in command line"));
1288
1289
  commandline_options.add_options()
1289
 
  ("help,?",_("Displays this help and exit."))
1290
 
  ("batch,B",_("Don't use history file. Disable interactive behavior. (Enables --silent)"))
 
1290
  ("help,?",N_("Displays this help and exit."))
 
1291
  ("batch,B",N_("Don't use history file. Disable interactive behavior. (Enables --silent)"))
1291
1292
  ("column-type-info", po::value<bool>(&column_types_flag)->default_value(false)->zero_tokens(),
1292
 
  _("Display column type information."))
 
1293
  N_("Display column type information."))
1293
1294
  ("comments,c", po::value<bool>(&preserve_comments)->default_value(false)->zero_tokens(),
1294
 
  _("Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments"))
 
1295
  N_("Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments"))
1295
1296
  ("vertical,E", po::value<bool>(&vertical)->default_value(false)->zero_tokens(),
1296
 
  _("Print the output of a query (rows) vertically."))
 
1297
  N_("Print the output of a query (rows) vertically."))
1297
1298
  ("force,f", po::value<bool>(&ignore_errors)->default_value(false)->zero_tokens(),
1298
 
  _("Continue even if we get an sql error."))
 
1299
  N_("Continue even if we get an sql error."))
1299
1300
  ("named-commands,G", po::value<bool>(&named_cmds)->default_value(false)->zero_tokens(),
1300
 
  _("Enable named commands. Named commands mean this program's internal commands; see drizzle> help . When enabled, the named commands can be used from any line of the query, otherwise only from the first line, before an enter."))
 
1301
  N_("Enable named commands. Named commands mean this program's internal commands; see drizzle> help . When enabled, the named commands can be used from any line of the query, otherwise only from the first line, before an enter."))
1301
1302
  ("no-beep,b", po::value<bool>(&opt_nobeep)->default_value(false)->zero_tokens(),
1302
 
  _("Turn off beep on error."))
1303
 
  ("disable-line-numbers", _("Do not write line numbers for errors."))
1304
 
  ("disable-column-names", _("Do not write column names in results."))
 
1303
  N_("Turn off beep on error."))
 
1304
  ("disable-line-numbers", N_("Do not write line numbers for errors."))
 
1305
  ("disable-column-names", N_("Do not write column names in results."))
1305
1306
  ("skip-column-names,N", 
1306
 
  _("Don't write column names in results. WARNING: -N is deprecated, use long version of this options instead."))
 
1307
  N_("Don't write column names in results. WARNING: -N is deprecated, use long version of this options instead."))
1307
1308
  ("set-variable,O", po::value<string>(),
1308
 
  _("Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value."))
 
1309
  N_("Change the value of a variable. Please note that this option is deprecated; you can set variables directly with --variable-name=value."))
1309
1310
  ("table,t", po::value<bool>(&output_tables)->default_value(false)->zero_tokens(),
1310
 
  _("Output in table format.")) 
 
1311
  N_("Output in table format.")) 
1311
1312
  ("safe-updates,U", po::value<bool>(&safe_updates)->default_value(false)->zero_tokens(),
1312
 
  _("Only allow UPDATE and DELETE that uses keys."))
 
1313
  N_("Only allow UPDATE and DELETE that uses keys."))
1313
1314
  ("i-am-a-dummy,U", po::value<bool>(&safe_updates)->default_value(false)->zero_tokens(),
1314
 
  _("Synonym for option --safe-updates, -U."))
 
1315
  N_("Synonym for option --safe-updates, -U."))
1315
1316
  ("verbose,v", po::value<string>(&opt_verbose)->default_value(""),
1316
 
  _("-v vvv implies that verbose= 3, Used to specify verbose"))
1317
 
  ("version,V", _("Output version information and exit."))
 
1317
  N_("-v vvv implies that verbose= 3, Used to specify verbose"))
 
1318
  ("version,V", N_("Output version information and exit."))
1318
1319
  ("secure-auth", po::value<bool>(&opt_secure_auth)->default_value(false)->zero_tokens(),
1319
 
  _("Refuse client connecting to server if it uses old (pre-4.1.1) protocol"))
 
1320
  N_("Refuse client connecting to server if it uses old (pre-4.1.1) protocol"))
1320
1321
  ("show-warnings", po::value<bool>(&show_warnings)->default_value(false)->zero_tokens(),
1321
 
  _("Show warnings after every statement."))
 
1322
  N_("Show warnings after every statement."))
1322
1323
  ("show-progress-size", po::value<uint32_t>(&show_progress_size)->default_value(0),
1323
 
  _("Number of lines before each import progress report."))
 
1324
  N_("Number of lines before each import progress report."))
1324
1325
  ("ping", po::value<bool>(&opt_ping)->default_value(false)->zero_tokens(),
1325
 
  _("Ping the server to check if it's alive."))
 
1326
  N_("Ping the server to check if it's alive."))
1326
1327
  ("no-defaults", po::value<bool>()->default_value(false)->zero_tokens(),
1327
 
  _("Configuration file defaults are not used if no-defaults is set"))
 
1328
  N_("Configuration file defaults are not used if no-defaults is set"))
1328
1329
  ;
1329
1330
 
1330
 
  po::options_description drizzle_options(_("Options specific to the drizzle client"));
 
1331
  po::options_description drizzle_options(N_("Options specific to the drizzle client"));
1331
1332
  drizzle_options.add_options()
1332
1333
  ("disable-auto-rehash,A",
1333
 
  _("Disable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time."))
 
1334
  N_("Disable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time."))
1334
1335
  ("auto-vertical-output", po::value<bool>(&auto_vertical_output)->default_value(false)->zero_tokens(),
1335
 
  _("Automatically switch to vertical output mode if the result is wider than the terminal width."))
 
1336
  N_("Automatically switch to vertical output mode if the result is wider than the terminal width."))
1336
1337
  ("database,D", po::value<string>(&current_db)->default_value(""),
1337
 
  _("Database to use."))
 
1338
  N_("Database to use."))
1338
1339
  ("default-character-set",po::value<string>(),
1339
 
  _("(not used)"))
 
1340
  N_("(not used)"))
1340
1341
  ("delimiter", po::value<string>(&delimiter_str)->default_value(";"),
1341
 
  _("Delimiter to be used."))
 
1342
  N_("Delimiter to be used."))
1342
1343
  ("execute,e", po::value<string>(),
1343
 
  _("Execute command and quit. (Disables --force and history file)"))
 
1344
  N_("Execute command and quit. (Disables --force and history file)"))
1344
1345
  ("local-infile", po::value<bool>(&opt_local_infile)->default_value(false)->zero_tokens(),
1345
 
  _("Enable LOAD DATA LOCAL INFILE."))
 
1346
  N_("Enable LOAD DATA LOCAL INFILE."))
1346
1347
  ("unbuffered,n", po::value<bool>(&unbuffered)->default_value(false)->zero_tokens(),
1347
 
  _("Flush buffer after each query."))
 
1348
  N_("Flush buffer after each query."))
1348
1349
  ("sigint-ignore", po::value<bool>(&opt_sigint_ignore)->default_value(false)->zero_tokens(),
1349
 
  _("Ignore SIGINT (CTRL-C)"))
 
1350
  N_("Ignore SIGINT (CTRL-C)"))
1350
1351
  ("one-database,o", po::value<bool>(&one_database)->default_value(false)->zero_tokens(),
1351
 
  _("Only update the default database. This is useful for skipping updates to other database in the update log."))
 
1352
  N_("Only update the default database. This is useful for skipping updates to other database in the update log."))
1352
1353
  ("pager", po::value<string>(),
1353
 
  _("Pager to use to display results. If you don't supply an option the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default."))
 
1354
  N_("Pager to use to display results. If you don't supply an option the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default."))
1354
1355
  ("disable-pager", po::value<bool>(&opt_nopager)->default_value(false)->zero_tokens(),
1355
 
  _("Disable pager and print to stdout. See interactive help (\\h) also."))
 
1356
  N_("Disable pager and print to stdout. See interactive help (\\h) also."))
1356
1357
  ("prompt", po::value<string>(&current_prompt)->default_value(""),  
1357
 
  _("Set the drizzle prompt to this value."))
 
1358
  N_("Set the drizzle prompt to this value."))
1358
1359
  ("quick,q", po::value<bool>(&quick)->default_value(false)->zero_tokens(),
1359
 
  _("Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file."))
 
1360
  N_("Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file."))
1360
1361
  ("raw,r", po::value<bool>(&opt_raw_data)->default_value(false)->zero_tokens(),
1361
 
  _("Write fields without conversion. Used with --batch.")) 
1362
 
  ("disable-reconnect", _("Do not reconnect if the connection is lost."))
 
1362
  N_("Write fields without conversion. Used with --batch.")) 
 
1363
  ("disable-reconnect", N_("Do not reconnect if the connection is lost."))
1363
1364
  ("shutdown", po::value<bool>()->zero_tokens(),
1364
 
  _("Shutdown the server"))
1365
 
  ("silent,s", _("Be more silent. Print results with a tab as separator, each row on new line."))
 
1365
  N_("Shutdown the server"))
 
1366
  ("silent,s", N_("Be more silent. Print results with a tab as separator, each row on new line."))
1366
1367
  ("tee", po::value<string>(),
1367
 
  _("Append everything into outfile. See interactive help (\\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default."))
 
1368
  N_("Append everything into outfile. See interactive help (\\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default."))
1368
1369
  ("disable-tee", po::value<bool>()->default_value(false)->zero_tokens(), 
1369
 
  _("Disable outfile. See interactive help (\\h) also."))
 
1370
  N_("Disable outfile. See interactive help (\\h) also."))
1370
1371
  ("connect-timeout", po::value<uint32_t>(&opt_connect_timeout)->default_value(0)->notifier(&check_timeout_value),
1371
 
  _("Number of seconds before connection timeout."))
 
1372
  N_("Number of seconds before connection timeout."))
1372
1373
  ("max-input-line", po::value<uint32_t>(&opt_max_input_line)->default_value(16*1024L*1024L)->notifier(&check_max_input_line),
1373
 
  _("Max length of input line"))
 
1374
  N_("Max length of input line"))
1374
1375
  ("select-limit", po::value<uint32_t>(&select_limit)->default_value(1000L),
1375
 
  _("Automatic limit for SELECT when using --safe-updates"))
 
1376
  N_("Automatic limit for SELECT when using --safe-updates"))
1376
1377
  ("max-join-size", po::value<uint32_t>(&max_join_size)->default_value(1000000L),
1377
 
  _("Automatic limit for rows in a join when using --safe-updates"))
 
1378
  N_("Automatic limit for rows in a join when using --safe-updates"))
1378
1379
  ;
1379
1380
 
1380
 
  po::options_description client_options(_("Options specific to the client"));
 
1381
  po::options_description client_options(N_("Options specific to the client"));
1381
1382
  client_options.add_options()
1382
1383
  ("host,h", po::value<string>(&current_host)->default_value("localhost"),
1383
 
  _("Connect to host"))
 
1384
  N_("Connect to host"))
1384
1385
  ("password,P", po::value<string>(&current_password)->default_value(PASSWORD_SENTINEL),
1385
 
  _("Password to use when connecting to server. If password is not given it's asked from the tty."))
 
1386
  N_("Password to use when connecting to server. If password is not given it's asked from the tty."))
1386
1387
  ("port,p", po::value<uint32_t>()->default_value(0),
1387
 
  _("Port number to use for connection or 0 for default to, in order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, built-in default"))
 
1388
  N_("Port number to use for connection or 0 for default to, in order of preference, drizzle.cnf, $DRIZZLE_TCP_PORT, built-in default"))
1388
1389
#ifdef DRIZZLE_ADMIN_TOOL
1389
1390
  ("user,u", po::value<string>(&current_user)->default_value("root"),
1390
1391
#else
1391
1392
  ("user,u", po::value<string>(&current_user)->default_value(""),
1392
1393
#endif
1393
 
  _("User for login if not current user."))
 
1394
  N_("User for login if not current user."))
1394
1395
  ("protocol",po::value<string>(&opt_protocol)->default_value("mysql"),
1395
 
  _("The protocol of connection (mysql or drizzle)."))
 
1396
  N_("The protocol of connection (mysql or drizzle)."))
1396
1397
  ;
1397
1398
 
1398
 
  po::options_description long_options(_("Allowed Options"));
 
1399
  po::options_description long_options(N_("Allowed Options"));
1399
1400
  long_options.add(commandline_options).add(drizzle_options).add(client_options);
1400
1401
 
1401
1402
  std::string system_config_dir_drizzle(SYSCONFDIR); 
1489
1490
  if (! isatty(0) || ! isatty(1))
1490
1491
  {
1491
1492
    status.setBatch(1); opt_silent=1;
 
1493
    ignore_errors=0;
1492
1494
  }
1493
1495
  else
1494
1496
    status.setAddToHistory(1);
1665
1667
  }
1666
1668
  if (vm.count("silent"))
1667
1669
  {
1668
 
    opt_silent= 2;
 
1670
    opt_silent++;
1669
1671
  }
1670
1672
  
1671
1673
  if (vm.count("help") || vm.count("version"))
1693
1695
  }
1694
1696
 
1695
1697
  memset(&drizzle, 0, sizeof(drizzle));
1696
 
  if (sql_connect(current_host, current_db, current_user, opt_password))
 
1698
  if (sql_connect(current_host, current_db, current_user, opt_password,opt_silent))
1697
1699
  {
1698
1700
    quick= 1;          // Avoid history
1699
1701
    status.setExitStatus(1);
3693
3695
  }
3694
3696
  else
3695
3697
    opt_rehash= 0;
3696
 
  error=sql_connect(current_host, current_db, current_user, opt_password);
 
3698
  error=sql_connect(current_host, current_db, current_user, opt_password,0);
3697
3699
  opt_rehash= save_rehash;
3698
3700
 
3699
3701
  if (connected)
4002
4004
 
4003
4005
 
4004
4006
static int
4005
 
sql_connect(const string &host, const string &database, const string &user, const string &password)
 
4007
sql_connect(const string &host, const string &database, const string &user, const string &password,
 
4008
                 uint32_t silent)
4006
4009
{
4007
4010
  drizzle_return_t ret;
4008
4011
  if (connected)
4051
4054
*/
4052
4055
  if ((ret= drizzle_con_connect(&con)) != DRIZZLE_RETURN_OK)
4053
4056
  {
4054
 
 
4055
 
    if (opt_silent < 2)
 
4057
    if (!silent || (ret != DRIZZLE_RETURN_GETADDRINFO &&
 
4058
                    ret != DRIZZLE_RETURN_COULD_NOT_CONNECT))
4056
4059
    {
4057
4060
      (void) put_error(&con, NULL);
4058
4061
      (void) fflush(stdout);