~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/session.h

  • Committer: Brian Aker
  • Date: 2009-06-16 00:53:22 UTC
  • mto: This revision was merged to the branch mainline in revision 1094.
  • Revision ID: brian@gaz-20090616005322-w0ode4jul9z8s2y9
Partial fix for tests for tmp

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
/* Classes in mysql */
25
25
 
26
 
#include <drizzled/plugin/protocol.h>
 
26
#include <drizzled/protocol.h>
27
27
#include <drizzled/sql_locale.h>
28
28
#include <drizzled/ha_trx_info.h>
29
29
#include <mysys/my_alloc.h>
134
134
  uint64_t max_error_count;
135
135
  uint64_t max_length_for_sort_data;
136
136
  size_t max_sort_length;
 
137
  uint64_t max_tmp_tables;
137
138
  uint64_t min_examined_row_limit;
138
139
  uint32_t net_buffer_length;
139
140
  uint32_t net_read_timeout;
143
144
  bool optimizer_prune_level;
144
145
  bool log_warnings;
145
146
  bool engine_condition_pushdown;
 
147
  bool keep_files_on_create;
146
148
 
147
149
  uint32_t optimizer_search_depth;
 
150
  /*
 
151
    Controls use of Engine-MRR:
 
152
      0 - auto, based on cost
 
153
      1 - force MRR when the storage engine is capable of doing it
 
154
      2 - disable MRR.
 
155
  */
 
156
  uint32_t optimizer_use_mrr;
148
157
  /* A bitmap for switching optimizations on/off */
149
158
  uint32_t optimizer_switch;
150
159
  uint32_t div_precincrement;
264
273
 
265
274
void mark_transaction_to_rollback(Session *session, bool all);
266
275
 
267
 
struct st_savepoint 
268
 
{
269
 
  struct st_savepoint *prev;
270
 
  char *name;
271
 
  uint32_t length;
272
 
  Ha_trx_info *ha_list;
273
 
};
274
 
 
275
 
extern pthread_mutex_t LOCK_xid_cache;
276
 
extern HASH xid_cache;
277
 
 
278
 
#include <drizzled/security_context.h>
279
 
#include <drizzled/open_tables_state.h>
280
 
 
281
 
#include <drizzled/internal_error_handler.h> 
282
 
#include <drizzled/diagnostics_area.h> 
283
 
 
284
 
/**
285
 
  Storage engine specific thread local data.
286
 
*/
287
 
struct Ha_data
288
 
{
289
 
  /**
290
 
    Storage engine specific thread local data.
291
 
    Lifetime: one user connection.
292
 
  */
293
 
  void *ha_ptr;
294
 
  /**
295
 
    0: Life time: one statement within a transaction. If @@autocommit is
296
 
    on, also represents the entire transaction.
297
 
    @sa trans_register_ha()
298
 
 
299
 
    1: Life time: one transaction within a connection.
300
 
    If the storage engine does not participate in a transaction,
301
 
    this should not be used.
302
 
    @sa trans_register_ha()
303
 
  */
304
 
  Ha_trx_info ha_info[2];
305
 
 
306
 
  Ha_data() :ha_ptr(NULL) {}
307
 
};
308
 
 
309
 
/**
310
 
 * Represents a client connection to the database server.
311
 
 *
312
 
 * Contains the client/server protocol object, the current statement
313
 
 * being executed, local-to-session variables and status counters, and
314
 
 * a host of other information.
315
 
 *
316
 
 * @todo
317
 
 *
318
 
 * Session should NOT inherit from Statement, but rather it should have a
319
 
 * vector of Statement object pointers which comprise the statements executed
320
 
 * on the Session.  Until this architectural change is done, we can forget
321
 
 * about parallel operations inside a session.
322
 
 *
323
 
 * @todo
324
 
 *
325
 
 * Make member variables private and have inlined accessors and setters.  Hide
326
 
 * all member variables that are not critical to non-internal operations of the
327
 
 * session object.
 
276
/**
 
277
 * Single command executed against this connection.
 
278
 *
 
279
 * @details
 
280
 *
 
281
 * One connection can contain a lot of simultaneously running statements,
 
282
 * some of which could be prepared, that is, contain placeholders.
 
283
 *
 
284
 * To perform some action with statement we reset Session part to the state  of
 
285
 * that statement, do the action, and then save back modified state from Session
 
286
 * to the statement. It will be changed in near future, and Statement will
 
287
 * be used explicitly.
 
288
 *
 
289
 * @todo
 
290
 *
 
291
 * The above comment is bullshit in Drizzle. See TODO markers on Session to
 
292
 * completely detach the inheritance of Session from Statement.
328
293
 */
329
 
class Session : public Open_tables_state
 
294
class Statement
330
295
{
 
296
  Statement(const Statement &rhs);              /* not implemented: */
 
297
  Statement &operator=(const Statement &rhs);   /* non-copyable */
331
298
public:
332
299
  /**
333
 
   * @note
334
 
   * The elements from here until the END_STATEMENT_VARIABLES below have
335
 
   * been coped from the original Statement class that used to be declared
336
 
   * in this header file. Session used to inherit from that class. Thus, we
337
 
   * copied the elements from Statement that were needed in Session and then
338
 
   * removed the Statement class.
339
 
   */
340
 
  
 
300
   * List of items created in the parser for this query. Every item puts
 
301
   * itself to the list on creation (see Item::Item() for details))
 
302
   */
 
303
  Item *free_list;
 
304
  MEM_ROOT *mem_root; /**< Pointer to current memroot */
 
305
  /**
 
306
   * Uniquely identifies each statement object in thread scope; change during
 
307
   * statement lifetime.
 
308
   *
 
309
   * @todo should be const
 
310
   */
 
311
   uint32_t id;
 
312
 
341
313
  /*
342
314
    MARK_COLUMNS_NONE:  Means mark_used_colums is not set and no indicator to
343
315
                        handler of fields used is set
350
322
                        and update_row.
351
323
  */
352
324
  enum enum_mark_columns mark_used_columns;
353
 
  inline void* alloc(size_t size)
354
 
  {
355
 
    return alloc_root(mem_root,size);
356
 
  }
357
 
  inline void* calloc(size_t size)
358
 
  {
359
 
    void *ptr;
360
 
    if ((ptr= alloc_root(mem_root,size)))
361
 
      memset(ptr, 0, size);
362
 
    return ptr;
363
 
  }
364
 
  inline char *strdup(const char *str)
365
 
  {
366
 
    return strdup_root(mem_root,str);
367
 
  }
368
 
  inline char *strmake(const char *str, size_t size)
369
 
  {
370
 
    return strmake_root(mem_root,str,size);
371
 
  }
372
 
  inline void *memdup(const void *str, size_t size)
373
 
  {
374
 
    return memdup_root(mem_root,str,size);
375
 
  }
376
 
  inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
377
 
  {
378
 
    void *ptr;
379
 
    if ((ptr= alloc_root(mem_root,size+gap)))
380
 
      memcpy(ptr,str,size);
381
 
    return ptr;
382
 
  }
383
 
  /** Frees all items attached to this Statement */
384
 
  void free_items();
385
 
  /**
386
 
   * List of items created in the parser for this query. Every item puts
387
 
   * itself to the list on creation (see Item::Item() for details))
388
 
   */
389
 
  Item *free_list;
390
 
  MEM_ROOT *mem_root; /**< Pointer to current memroot */
391
 
  /**
392
 
   * Uniquely identifies each statement object in thread scope; change during
393
 
   * statement lifetime.
394
 
   *
395
 
   * @todo should be const
396
 
   */
397
 
  uint32_t id;
 
325
 
398
326
  LEX *lex; /**< parse tree descriptor */
399
327
  /**
400
328
    Points to the query associated with this statement. It's const, but
435
363
  */
436
364
  char *db;
437
365
  uint32_t db_length; /**< Length of current schema name */
438
 
  /**< END_STATEMENT_VARIABLES */
439
 
 
 
366
 
 
367
public:
 
368
 
 
369
  /* This constructor is called for backup statements */
 
370
  Statement() {}
 
371
 
 
372
  Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, uint32_t id_arg)
 
373
  :
 
374
    free_list(NULL), 
 
375
    mem_root(mem_root_arg),
 
376
    id(id_arg),
 
377
    mark_used_columns(MARK_COLUMNS_READ),
 
378
    lex(lex_arg),
 
379
    query(NULL),
 
380
    query_length(0),
 
381
    db(NULL),
 
382
    db_length(0)
 
383
  {}
 
384
  virtual ~Statement() {}
 
385
  inline void* alloc(size_t size)
 
386
  {
 
387
    return alloc_root(mem_root,size);
 
388
  }
 
389
  inline void* calloc(size_t size)
 
390
  {
 
391
    void *ptr;
 
392
    if ((ptr= alloc_root(mem_root,size)))
 
393
      memset(ptr, 0, size);
 
394
    return ptr;
 
395
  }
 
396
  inline char *strdup(const char *str)
 
397
  {
 
398
    return strdup_root(mem_root,str);
 
399
  }
 
400
  inline char *strmake(const char *str, size_t size)
 
401
  {
 
402
    return strmake_root(mem_root,str,size);
 
403
  }
 
404
  inline void *memdup(const void *str, size_t size)
 
405
  {
 
406
    return memdup_root(mem_root,str,size);
 
407
  }
 
408
  inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
 
409
  {
 
410
    void *ptr;
 
411
    if ((ptr= alloc_root(mem_root,size+gap)))
 
412
      memcpy(ptr,str,size);
 
413
    return ptr;
 
414
  }
 
415
  /** Frees all items attached to this Statement */
 
416
  void free_items();
 
417
};
 
418
 
 
419
struct st_savepoint 
 
420
{
 
421
  struct st_savepoint *prev;
 
422
  char *name;
 
423
  uint32_t length;
 
424
  Ha_trx_info *ha_list;
 
425
};
 
426
 
 
427
extern pthread_mutex_t LOCK_xid_cache;
 
428
extern HASH xid_cache;
 
429
 
 
430
#include <drizzled/security_context.h>
 
431
#include <drizzled/open_tables_state.h>
 
432
 
 
433
#include <drizzled/internal_error_handler.h> 
 
434
#include <drizzled/diagnostics_area.h> 
 
435
 
 
436
/**
 
437
  Storage engine specific thread local data.
 
438
*/
 
439
struct Ha_data
 
440
{
 
441
  /**
 
442
    Storage engine specific thread local data.
 
443
    Lifetime: one user connection.
 
444
  */
 
445
  void *ha_ptr;
 
446
  /**
 
447
    0: Life time: one statement within a transaction. If @@autocommit is
 
448
    on, also represents the entire transaction.
 
449
    @sa trans_register_ha()
 
450
 
 
451
    1: Life time: one transaction within a connection.
 
452
    If the storage engine does not participate in a transaction,
 
453
    this should not be used.
 
454
    @sa trans_register_ha()
 
455
  */
 
456
  Ha_trx_info ha_info[2];
 
457
 
 
458
  Ha_data() :ha_ptr(NULL) {}
 
459
};
 
460
 
 
461
/**
 
462
 * Represents a client connection to the database server.
 
463
 *
 
464
 * Contains the client/server protocol object, the current statement
 
465
 * being executed, local-to-session variables and status counters, and
 
466
 * a host of other information.
 
467
 *
 
468
 * @todo
 
469
 *
 
470
 * Session should NOT inherit from Statement, but rather it should have a
 
471
 * vector of Statement object pointers which comprise the statements executed
 
472
 * on the Session.  Until this architectural change is done, we can forget
 
473
 * about parallel operations inside a session.
 
474
 *
 
475
 * @todo
 
476
 *
 
477
 * Make member variables private and have inlined accessors and setters.  Hide
 
478
 * all member variables that are not critical to non-internal operations of the
 
479
 * session object.
 
480
 */
 
481
class Session :public Statement, public Open_tables_state
 
482
{
 
483
public:
440
484
  /**
441
485
    Constant for Session::where initialization in the beginning of every query.
442
486
 
510
554
  uint32_t max_client_packet_length; /**< Maximum number of bytes a client can send in a single packet */
511
555
  time_t start_time;
512
556
  time_t user_time;
 
557
  uint64_t connect_utime;
513
558
  uint64_t thr_create_utime; /**< track down slow pthread_create */
514
559
  uint64_t start_utime;
515
560
  uint64_t utime_after_lock;
872
917
  }
873
918
 
874
919
  Session(Protocol *protocol_arg);
875
 
  virtual ~Session();
 
920
  ~Session();
876
921
 
877
922
  /**
878
923
    Initialize memory roots necessary for query processing and (!)
1004
1049
    if (user_time)
1005
1050
    {
1006
1051
      start_time= user_time;
1007
 
      connect_microseconds= start_utime= utime_after_lock= my_micro_time();
 
1052
      start_utime= utime_after_lock= my_micro_time();
1008
1053
    }
1009
1054
    else
1010
1055
      start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
1224
1269
   * @param  Database name to connect to, may be NULL
1225
1270
   */
1226
1271
  bool checkUser(const char *passwd, uint32_t passwd_len, const char *db);
1227
 
  
1228
 
  /**
1229
 
   * Returns the timestamp (in microseconds) of when the Session 
1230
 
   * connected to the server.
1231
 
   */
1232
 
  inline uint64_t getConnectMicroseconds() const
1233
 
  {
1234
 
    return connect_microseconds;
1235
 
  }
1236
1272
 
1237
1273
private:
1238
 
  /** Microsecond timestamp of when Session connected */
1239
 
  uint64_t connect_microseconds;
1240
1274
  const char *proc_info;
1241
1275
 
1242
1276
  /** The current internal error handler for this thread, or NULL. */
1333
1367
   * used by this thread if we are on the upper level.
1334
1368
   */
1335
1369
  void close_thread_tables();
1336
 
  void close_old_data_files(bool morph_locks= false,
1337
 
                            bool send_refresh= false);
 
1370
  void close_old_data_files(bool morph_locks, bool send_refresh);
1338
1371
  void close_open_tables();
1339
1372
  void close_data_files_and_morph_locks(const char *db, const char *table_name);
1340
 
 
1341
 
private:
1342
 
  bool free_cached_table();
1343
 
public:
1344
 
 
1345
1373
  /**
1346
1374
   * Prepares statement for reopening of tables and recalculation of set of
1347
1375
   * prelocked tables.
1349
1377
   * @param Pointer to a pointer to a list of tables which we were trying to open and lock
1350
1378
   */
1351
1379
  void close_tables_for_reopen(TableList **tables);
1352
 
 
1353
 
 
1354
1380
  /**
1355
1381
   * Open all tables in list, locks them (all, including derived)
1356
1382
   *
1365
1391
   * 
1366
1392
   * The lock will automaticaly be freed by close_thread_tables()
1367
1393
   */
1368
 
  bool openTablesLock(TableList *tables);
1369
 
 
 
1394
  int open_and_lock_tables(TableList *tables);
1370
1395
  /**
1371
1396
   * Open all tables in list and process derived tables
1372
1397
   *
1385
1410
   * This is to be used on prepare stage when you don't read any
1386
1411
   * data from the tables.
1387
1412
   */
1388
 
  bool openTables(TableList *tables, uint32_t flags= 0);
1389
 
 
1390
 
  int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1391
 
 
1392
 
  Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1393
 
  Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1394
 
 
 
1413
  bool open_normal_and_derived_tables(TableList *tables, uint32_t flags);
 
1414
  int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags);
 
1415
  Table *open_ltable(TableList *table_list, thr_lock_type lock_type);
 
1416
  Table *open_table(TableList *table_list, bool *refresh, uint32_t flags);
1395
1417
  void unlink_open_table(Table *find);
1396
1418
  void drop_open_table(Table *table, const char *db_name,
1397
1419
                       const char *table_name);
1407
1429
  Table *find_temporary_table(const char *db, const char *table_name);
1408
1430
  void close_temporary_tables();
1409
1431
  void close_temporary_table(Table *table, bool free_share, bool delete_table);
1410
 
  void close_temporary(Table *table, bool free_share, bool delete_table);
1411
1432
  int drop_temporary_table(TableList *table_list);
1412
 
  bool rm_temporary_table(StorageEngine *base, char *path);
1413
 
  Table *open_temporary_table(const char *path, const char *db,
1414
 
                              const char *table_name, bool link_in_list,
1415
 
                              open_table_mode open_mode);
1416
1433
  
1417
1434
  /* Reopen operations */
1418
1435
  bool reopen_tables(bool get_locks, bool mark_share_as_old);
1419
1436
  bool reopen_name_locked_table(TableList* table_list, bool link_in);
1420
 
  bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1421
1437
 
1422
1438
  void wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond);
1423
 
  int setup_conds(TableList *leaves, COND **conds);
1424
 
  int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1425
1439
};
1426
1440
 
1427
1441
class JOIN;
1468
1482
#include <drizzled/table_ident.h>
1469
1483
#include <drizzled/user_var_entry.h>
1470
1484
#include <drizzled/unique.h>
 
1485
#include <drizzled/multi_delete.h>
 
1486
#include <drizzled/multi_update.h>
1471
1487
#include <drizzled/my_var.h>
1472
1488
#include <drizzled/select_dumpvar.h>
1473
1489