120
90
chain_arg->first= this;
121
91
chain_arg->last= this;
125
* Returns the name of the variable.
129
* So that we can exist in a Registry. We really need to formalize that
131
inline const std::string &getName() const
136
* Returns a vector of strings representing aliases
137
* for this variable's name.
139
const std::vector<std::string>& getAliases() const
141
return empty_aliases;
144
* Returns a pointer to the next sys_var, or NULL if none.
146
inline sys_var *getNext() const
151
* Sets the pointer to the next sys_var.
153
* @param Pointer to the next sys_var, or NULL if you set the tail...
155
inline void setNext(sys_var *in_next)
160
* Returns a pointer to the variable's option limits
162
inline struct option *getOptionLimits() const
164
return option_limits;
167
* Sets the pointer to the variable's option limits
169
* @param Pointer to the option limits option variable
171
inline void setOptionLimits(struct option *in_option_limits)
173
option_limits= in_option_limits;
176
* Returns the function pointer for after update trigger, or NULL if none.
178
inline sys_after_update_func getAfterUpdateTrigger() const
182
virtual bool check(Session *session, set_var *var);
183
bool check_enum(Session *session, set_var *var, const TYPELIB *enum_names);
184
virtual bool update(Session *session, set_var *var)=0;
185
virtual void set_default(Session *, sql_var_t)
93
virtual bool check(THD *thd, set_var *var);
94
bool check_enum(THD *thd, set_var *var, const TYPELIB *enum_names);
95
bool check_set(THD *thd, set_var *var, TYPELIB *enum_names);
96
bool is_written_to_binlog(enum_var_type type)
98
return (type == OPT_SESSION || type == OPT_DEFAULT) &&
99
(binlog_status == SESSION_VARIABLE_IN_BINLOG);
101
virtual bool update(THD *thd, set_var *var)=0;
102
virtual void set_default(THD *thd_arg __attribute__((unused)),
103
enum_var_type type __attribute__((unused)))
187
virtual SHOW_TYPE show_type()
191
virtual unsigned char *value_ptr(Session *, sql_var_t, const LEX_STRING *)
195
virtual bool check_type(sql_var_t type)
197
return type != OPT_GLOBAL;
198
} /* Error if not GLOBAL */
105
virtual SHOW_TYPE show_type() { return SHOW_UNDEF; }
106
virtual unsigned char *value_ptr(THD *thd __attribute__((unused)),
107
enum_var_type type __attribute__((unused)),
108
LEX_STRING *base __attribute__((unused)))
110
virtual bool check_type(enum_var_type type)
111
{ return type != OPT_GLOBAL; } /* Error if not GLOBAL */
199
112
virtual bool check_update_type(Item_result type)
201
return type != INT_RESULT;
203
virtual bool check_default(sql_var_t)
205
return option_limits == 0;
207
Item *item(Session *session, sql_var_t type, const LEX_STRING *base);
208
virtual bool is_readonly() const
212
virtual sys_var_pluginvar *cast_pluginvar()
113
{ return type != INT_RESULT; } /* Assume INT */
114
virtual bool check_default(enum_var_type type __attribute__((unused)))
115
{ return option_limits == 0; }
116
Item *item(THD *thd, enum_var_type type, LEX_STRING *base);
117
virtual bool is_struct() { return 0; }
118
virtual bool is_readonly() const { return 0; }
119
virtual sys_var_pluginvar *cast_pluginvar() { return 0; }
122
void set_allow_empty_value(bool allow_empty_value)
124
m_allow_empty_value= allow_empty_value;
128
const Binlog_status_enum binlog_status;
130
bool m_allow_empty_value;
219
* A base class for all variables that require its access to
220
* be guarded with a mutex.
135
A base class for all variables that require its access to
136
be guarded with a mutex.
222
139
class sys_var_global: public sys_var
225
142
pthread_mutex_t *guard;
227
sys_var_global(const char *name_arg,
228
sys_after_update_func after_update_arg,
144
sys_var_global(const char *name_arg, sys_after_update_func after_update_arg,
229
145
pthread_mutex_t *guard_arg)
231
sys_var(name_arg, after_update_arg),
146
:sys_var(name_arg, after_update_arg), guard(guard_arg) {}
236
class sys_var_uint32_t_ptr :public sys_var
151
A global-only ulong variable that requires its access to be
152
protected with a mutex.
155
class sys_var_long_ptr_global: public sys_var_global
240
sys_var_uint32_t_ptr(sys_var_chain *chain, const char *name_arg,
241
uint32_t *value_ptr_arg)
242
:sys_var(name_arg),value(value_ptr_arg)
243
{ chain_sys_var(chain); }
244
sys_var_uint32_t_ptr(sys_var_chain *chain, const char *name_arg,
245
uint32_t *value_ptr_arg,
246
sys_after_update_func func)
247
:sys_var(name_arg,func), value(value_ptr_arg)
248
{ chain_sys_var(chain); }
249
bool check(Session *session, set_var *var);
250
bool update(Session *session, set_var *var);
251
void set_default(Session *session, sql_var_t type);
252
SHOW_TYPE show_type() { return SHOW_INT; }
253
unsigned char *value_ptr(Session *, sql_var_t, const LEX_STRING *)
159
sys_var_long_ptr_global(sys_var_chain *chain, const char *name_arg,
160
ulong *value_ptr_arg,
161
pthread_mutex_t *guard_arg,
162
sys_after_update_func after_update_arg= NULL)
163
:sys_var_global(name_arg, after_update_arg, guard_arg),
165
{ chain_sys_var(chain); }
166
bool check(THD *thd, set_var *var);
167
bool update(THD *thd, set_var *var);
168
void set_default(THD *thd, enum_var_type type);
169
SHOW_TYPE show_type() { return SHOW_LONG; }
170
unsigned char *value_ptr(THD *thd __attribute__((unused)),
171
enum_var_type type __attribute__((unused)),
172
LEX_STRING *base __attribute__((unused)))
254
173
{ return (unsigned char*) value; }
178
A global ulong variable that is protected by LOCK_global_system_variables
181
class sys_var_long_ptr :public sys_var_long_ptr_global
184
sys_var_long_ptr(sys_var_chain *chain, const char *name_arg, ulong *value_ptr,
185
sys_after_update_func after_update_arg= NULL);
258
189
class sys_var_uint64_t_ptr :public sys_var
402
325
sys_var_const_str_ptr(sys_var_chain *chain, const char *name_arg, char **value_arg)
403
326
:sys_var(name_arg),value(value_arg)
404
327
{ chain_sys_var(chain); }
405
bool check(Session *, set_var *)
328
bool check(THD *thd __attribute__((unused)),
329
set_var *var __attribute__((unused)))
409
bool update(Session *, set_var *)
333
bool update(THD *thd __attribute__((unused)),
334
set_var *var __attribute__((unused)))
413
338
SHOW_TYPE show_type() { return SHOW_CHAR; }
414
unsigned char *value_ptr(Session *, sql_var_t, const LEX_STRING *)
339
unsigned char *value_ptr(THD *thd __attribute__((unused)),
340
enum_var_type type __attribute__((unused)),
341
LEX_STRING *base __attribute__((unused)))
416
343
return (unsigned char*) *value;
418
bool check_update_type(Item_result)
345
bool check_update_type(Item_result type __attribute__((unused)))
422
bool check_default(sql_var_t)
349
bool check_default(enum_var_type type __attribute__((unused)))
424
351
bool is_readonly(void) const { return 1; }
428
class sys_var_session :public sys_var
431
sys_var_session(const char *name_arg,
432
sys_after_update_func func= NULL)
433
:sys_var(name_arg, func)
355
class sys_var_enum :public sys_var
360
sys_var_enum(sys_var_chain *chain, const char *name_arg, uint32_t *value_arg,
361
TYPELIB *typelib, sys_after_update_func func)
362
:sys_var(name_arg,func), value(value_arg), enum_names(typelib)
363
{ chain_sys_var(chain); }
364
bool check(THD *thd, set_var *var)
366
return check_enum(thd, var, enum_names);
368
bool update(THD *thd, set_var *var);
369
SHOW_TYPE show_type() { return SHOW_CHAR; }
370
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
371
bool check_update_type(Item_result type __attribute__((unused)))
376
class sys_var_enum_const :public sys_var
381
sys_var_enum_const(sys_var_chain *chain, const char *name_arg, ulong SV::*offset_arg,
382
TYPELIB *typelib, sys_after_update_func func)
383
:sys_var(name_arg,func), offset(offset_arg), enum_names(typelib)
384
{ chain_sys_var(chain); }
385
bool check(THD *thd __attribute__((unused)),
386
set_var *var __attribute__((unused)))
388
bool update(THD *thd __attribute__((unused)),
389
set_var *var __attribute__((unused)))
391
SHOW_TYPE show_type() { return SHOW_CHAR; }
392
bool check_update_type(Item_result type __attribute__((unused)))
394
bool is_readonly() const { return 1; }
395
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
399
class sys_var_thd :public sys_var
402
sys_var_thd(const char *name_arg,
403
sys_after_update_func func= NULL,
404
Binlog_status_enum binlog_status= NOT_IN_BINLOG)
405
:sys_var(name_arg, func, binlog_status)
435
bool check_type(sql_var_t)
407
bool check_type(enum_var_type type __attribute__((unused)))
437
bool check_default(sql_var_t type)
409
bool check_default(enum_var_type type)
439
411
return type == OPT_GLOBAL && !option_limits;
443
class sys_var_session_uint32_t :public sys_var_session
416
class sys_var_thd_ulong :public sys_var_thd
445
418
sys_check_func check_func;
447
uint32_t system_variables::*offset;
448
sys_var_session_uint32_t(sys_var_chain *chain, const char *name_arg,
449
uint32_t system_variables::*offset_arg,
450
sys_check_func c_func= NULL,
451
sys_after_update_func au_func= NULL)
452
:sys_var_session(name_arg, au_func), check_func(c_func),
421
sys_var_thd_ulong(sys_var_chain *chain, const char *name_arg,
422
ulong SV::*offset_arg,
423
sys_check_func c_func= NULL,
424
sys_after_update_func au_func= NULL,
425
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
426
:sys_var_thd(name_arg, au_func, binlog_status_arg), check_func(c_func),
453
427
offset(offset_arg)
454
428
{ chain_sys_var(chain); }
455
bool check(Session *session, set_var *var);
456
bool update(Session *session, set_var *var);
457
void set_default(Session *session, sql_var_t type);
458
SHOW_TYPE show_type() { return SHOW_INT; }
459
unsigned char *value_ptr(Session *session, sql_var_t type,
460
const LEX_STRING *base);
429
bool check(THD *thd, set_var *var);
430
bool update(THD *thd, set_var *var);
431
void set_default(THD *thd, enum_var_type type);
432
SHOW_TYPE show_type() { return SHOW_LONG; }
433
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
464
class sys_var_session_ha_rows :public sys_var_session
437
class sys_var_thd_ha_rows :public sys_var_thd
467
ha_rows system_variables::*offset;
468
sys_var_session_ha_rows(sys_var_chain *chain, const char *name_arg,
469
ha_rows system_variables::*offset_arg)
470
:sys_var_session(name_arg), offset(offset_arg)
441
sys_var_thd_ha_rows(sys_var_chain *chain, const char *name_arg,
442
ha_rows SV::*offset_arg)
443
:sys_var_thd(name_arg), offset(offset_arg)
471
444
{ chain_sys_var(chain); }
472
sys_var_session_ha_rows(sys_var_chain *chain, const char *name_arg,
473
ha_rows system_variables::*offset_arg,
445
sys_var_thd_ha_rows(sys_var_chain *chain, const char *name_arg,
446
ha_rows SV::*offset_arg,
474
447
sys_after_update_func func)
475
:sys_var_session(name_arg,func), offset(offset_arg)
448
:sys_var_thd(name_arg,func), offset(offset_arg)
476
449
{ chain_sys_var(chain); }
477
bool update(Session *session, set_var *var);
478
void set_default(Session *session, sql_var_t type);
450
bool update(THD *thd, set_var *var);
451
void set_default(THD *thd, enum_var_type type);
479
452
SHOW_TYPE show_type() { return SHOW_HA_ROWS; }
480
unsigned char *value_ptr(Session *session, sql_var_t type,
481
const LEX_STRING *base);
453
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
485
class sys_var_session_uint64_t :public sys_var_session
457
class sys_var_thd_uint64_t :public sys_var_thd
487
sys_check_func check_func;
489
uint64_t system_variables::*offset;
460
uint64_t SV::*offset;
490
461
bool only_global;
491
sys_var_session_uint64_t(sys_var_chain *chain,
492
const char *name_arg,
493
uint64_t system_variables::*offset_arg,
494
sys_after_update_func au_func= NULL,
495
sys_check_func c_func= NULL)
496
:sys_var_session(name_arg, au_func),
462
sys_var_thd_uint64_t(sys_var_chain *chain, const char *name_arg,
463
uint64_t SV::*offset_arg)
464
:sys_var_thd(name_arg), offset(offset_arg)
499
465
{ chain_sys_var(chain); }
500
sys_var_session_uint64_t(sys_var_chain *chain,
501
const char *name_arg,
502
uint64_t system_variables::*offset_arg,
503
sys_after_update_func func,
504
bool only_global_arg,
505
sys_check_func cfunc= NULL)
506
:sys_var_session(name_arg, func),
466
sys_var_thd_uint64_t(sys_var_chain *chain, const char *name_arg,
467
uint64_t SV::*offset_arg,
468
sys_after_update_func func, bool only_global_arg)
469
:sys_var_thd(name_arg, func), offset(offset_arg),
509
470
only_global(only_global_arg)
510
471
{ chain_sys_var(chain); }
511
bool update(Session *session, set_var *var);
512
void set_default(Session *session, sql_var_t type);
472
bool update(THD *thd, set_var *var);
473
void set_default(THD *thd, enum_var_type type);
513
474
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
514
unsigned char *value_ptr(Session *session, sql_var_t type,
515
const LEX_STRING *base);
516
bool check(Session *session, set_var *var);
517
bool check_default(sql_var_t type)
519
return type == OPT_GLOBAL && !option_limits;
521
bool check_type(sql_var_t type)
523
return (only_global && type != OPT_GLOBAL);
527
class sys_var_session_size_t :public sys_var_session
529
sys_check_func check_func;
531
size_t system_variables::*offset;
533
sys_var_session_size_t(sys_var_chain *chain, const char *name_arg,
534
size_t system_variables::*offset_arg,
535
sys_after_update_func au_func= NULL,
536
sys_check_func c_func= NULL)
537
:sys_var_session(name_arg, au_func),
540
{ chain_sys_var(chain); }
541
sys_var_session_size_t(sys_var_chain *chain,
542
const char *name_arg,
543
size_t system_variables::*offset_arg,
544
sys_after_update_func func,
545
bool only_global_arg,
546
sys_check_func cfunc= NULL)
547
:sys_var_session(name_arg, func),
550
only_global(only_global_arg)
551
{ chain_sys_var(chain); }
552
bool update(Session *session, set_var *var);
553
void set_default(Session *session, sql_var_t type);
554
SHOW_TYPE show_type() { return SHOW_SIZE; }
555
unsigned char *value_ptr(Session *session, sql_var_t type,
556
const LEX_STRING *base);
557
bool check(Session *session, set_var *var);
558
bool check_default(sql_var_t type)
560
return type == OPT_GLOBAL && !option_limits;
562
bool check_type(sql_var_t type)
564
return (only_global && type != OPT_GLOBAL);
569
class sys_var_session_bool :public sys_var_session
572
bool system_variables::*offset;
573
sys_var_session_bool(sys_var_chain *chain, const char *name_arg, bool system_variables::*offset_arg)
574
:sys_var_session(name_arg), offset(offset_arg)
575
{ chain_sys_var(chain); }
576
sys_var_session_bool(sys_var_chain *chain, const char *name_arg, bool system_variables::*offset_arg,
475
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
476
bool check(THD *thd, set_var *var);
477
bool check_default(enum_var_type type)
479
return type == OPT_GLOBAL && !option_limits;
481
bool check_type(enum_var_type type)
483
return (only_global && type != OPT_GLOBAL);
488
class sys_var_thd_bool :public sys_var_thd
492
sys_var_thd_bool(sys_var_chain *chain, const char *name_arg, bool SV::*offset_arg)
493
:sys_var_thd(name_arg), offset(offset_arg)
494
{ chain_sys_var(chain); }
495
sys_var_thd_bool(sys_var_chain *chain, const char *name_arg, bool SV::*offset_arg,
577
496
sys_after_update_func func)
578
:sys_var_session(name_arg,func), offset(offset_arg)
497
:sys_var_thd(name_arg,func), offset(offset_arg)
579
498
{ chain_sys_var(chain); }
580
bool update(Session *session, set_var *var);
581
void set_default(Session *session, sql_var_t type);
499
bool update(THD *thd, set_var *var);
500
void set_default(THD *thd, enum_var_type type);
582
501
SHOW_TYPE show_type() { return SHOW_MY_BOOL; }
583
unsigned char *value_ptr(Session *session, sql_var_t type,
584
const LEX_STRING *base);
585
bool check(Session *session, set_var *var)
502
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
503
bool check(THD *thd, set_var *var)
587
return check_enum(session, var, &bool_typelib);
505
return check_enum(thd, var, &bool_typelib);
589
bool check_update_type(Item_result)
507
bool check_update_type(Item_result type __attribute__((unused)))
594
class sys_var_session_enum :public sys_var_session
512
class sys_var_thd_enum :public sys_var_thd
597
uint32_t system_variables::*offset;
598
516
TYPELIB *enum_names;
599
517
sys_check_func check_func;
601
sys_var_session_enum(sys_var_chain *chain, const char *name_arg,
602
uint32_t system_variables::*offset_arg, TYPELIB *typelib,
519
sys_var_thd_enum(sys_var_chain *chain, const char *name_arg,
520
ulong SV::*offset_arg, TYPELIB *typelib,
603
521
sys_after_update_func func= NULL,
604
sys_check_func check_f= NULL)
605
:sys_var_session(name_arg, func), offset(offset_arg),
606
enum_names(typelib), check_func(check_f)
522
sys_check_func check= NULL)
523
:sys_var_thd(name_arg, func), offset(offset_arg),
524
enum_names(typelib), check_func(check)
607
525
{ chain_sys_var(chain); }
608
bool check(Session *session, set_var *var)
526
bool check(THD *thd, set_var *var)
612
ret= (*check_func)(session, var);
613
return ret ? ret : check_enum(session, var, enum_names);
530
ret= (*check_func)(thd, var);
531
return ret ? ret : check_enum(thd, var, enum_names);
615
bool update(Session *session, set_var *var);
616
void set_default(Session *session, sql_var_t type);
533
bool update(THD *thd, set_var *var);
534
void set_default(THD *thd, enum_var_type type);
617
535
SHOW_TYPE show_type() { return SHOW_CHAR; }
618
unsigned char *value_ptr(Session *session, sql_var_t type,
619
const LEX_STRING *base);
620
bool check_update_type(Item_result)
536
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
537
bool check_update_type(Item_result type __attribute__((unused)))
625
class sys_var_session_storage_engine :public sys_var_session
543
class sys_var_thd_optimizer_switch :public sys_var_thd_enum
546
sys_var_thd_optimizer_switch(sys_var_chain *chain, const char *name_arg,
547
ulong SV::*offset_arg)
548
:sys_var_thd_enum(chain, name_arg, offset_arg, &optimizer_switch_typelib)
550
bool check(THD *thd, set_var *var)
552
return check_set(thd, var, enum_names);
554
void set_default(THD *thd, enum_var_type type);
555
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
556
static bool symbolic_mode_representation(THD *thd, uint64_t sql_mode,
561
class sys_var_thd_storage_engine :public sys_var_thd
628
plugin::StorageEngine *system_variables::*offset;
564
plugin_ref SV::*offset;
630
sys_var_session_storage_engine(sys_var_chain *chain, const char *name_arg,
631
plugin::StorageEngine *system_variables::*offset_arg)
632
:sys_var_session(name_arg), offset(offset_arg)
566
sys_var_thd_storage_engine(sys_var_chain *chain, const char *name_arg,
567
plugin_ref SV::*offset_arg)
568
:sys_var_thd(name_arg), offset(offset_arg)
633
569
{ chain_sys_var(chain); }
634
bool check(Session *session, set_var *var);
570
bool check(THD *thd, set_var *var);
635
571
SHOW_TYPE show_type() { return SHOW_CHAR; }
636
572
bool check_update_type(Item_result type)
638
574
return type != STRING_RESULT; /* Only accept strings */
640
void set_default(Session *session, sql_var_t type);
641
bool update(Session *session, set_var *var);
642
unsigned char *value_ptr(Session *session, sql_var_t type,
643
const LEX_STRING *base);
576
void set_default(THD *thd, enum_var_type type);
577
bool update(THD *thd, set_var *var);
578
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
646
class sys_var_session_bit :public sys_var_session
581
class sys_var_thd_bit :public sys_var_thd
648
583
sys_check_func check_func;
649
584
sys_update_func update_func;
651
586
uint64_t bit_flag;
653
sys_var_session_bit(sys_var_chain *chain, const char *name_arg,
588
sys_var_thd_bit(sys_var_chain *chain, const char *name_arg,
654
589
sys_check_func c_func, sys_update_func u_func,
655
uint64_t bit, bool reverse_arg=0)
656
:sys_var_session(name_arg, NULL), check_func(c_func),
590
uint64_t bit, bool reverse_arg=0,
591
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
592
:sys_var_thd(name_arg, NULL, binlog_status_arg), check_func(c_func),
657
593
update_func(u_func), bit_flag(bit), reverse(reverse_arg)
658
594
{ chain_sys_var(chain); }
659
bool check(Session *session, set_var *var);
660
bool update(Session *session, set_var *var);
661
bool check_update_type(Item_result)
595
bool check(THD *thd, set_var *var);
596
bool update(THD *thd, set_var *var);
597
bool check_update_type(Item_result type __attribute__((unused)))
663
bool check_type(sql_var_t type) { return type == OPT_GLOBAL; }
599
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
664
600
SHOW_TYPE show_type() { return SHOW_MY_BOOL; }
665
unsigned char *value_ptr(Session *session, sql_var_t type,
666
const LEX_STRING *base);
601
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
669
604
/* some variables that require special handling */
671
606
class sys_var_timestamp :public sys_var
674
sys_var_timestamp(sys_var_chain *chain, const char *name_arg)
675
:sys_var(name_arg, NULL)
609
sys_var_timestamp(sys_var_chain *chain, const char *name_arg,
610
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
611
:sys_var(name_arg, NULL, binlog_status_arg)
676
612
{ chain_sys_var(chain); }
677
bool update(Session *session, set_var *var);
678
void set_default(Session *session, sql_var_t type);
679
bool check_type(sql_var_t type) { return type == OPT_GLOBAL; }
680
bool check_default(sql_var_t)
613
bool update(THD *thd, set_var *var);
614
void set_default(THD *thd, enum_var_type type);
615
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
616
bool check_default(enum_var_type type __attribute__((unused)))
682
618
SHOW_TYPE show_type(void) { return SHOW_LONG; }
683
unsigned char *value_ptr(Session *session, sql_var_t type,
684
const LEX_STRING *base);
619
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
688
623
class sys_var_last_insert_id :public sys_var
691
sys_var_last_insert_id(sys_var_chain *chain, const char *name_arg)
692
:sys_var(name_arg, NULL)
693
{ chain_sys_var(chain); }
694
bool update(Session *session, set_var *var);
695
bool check_type(sql_var_t type) { return type == OPT_GLOBAL; }
696
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
697
unsigned char *value_ptr(Session *session, sql_var_t type,
698
const LEX_STRING *base);
702
class sys_var_collation :public sys_var_session
705
sys_var_collation(const char *name_arg)
706
:sys_var_session(name_arg, NULL)
626
sys_var_last_insert_id(sys_var_chain *chain, const char *name_arg,
627
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
628
:sys_var(name_arg, NULL, binlog_status_arg)
629
{ chain_sys_var(chain); }
630
bool update(THD *thd, set_var *var);
631
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
632
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
633
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
637
class sys_var_insert_id :public sys_var
640
sys_var_insert_id(sys_var_chain *chain, const char *name_arg)
642
{ chain_sys_var(chain); }
643
bool update(THD *thd, set_var *var);
644
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
645
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
646
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
650
class sys_var_rand_seed1 :public sys_var
653
sys_var_rand_seed1(sys_var_chain *chain, const char *name_arg,
654
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
655
:sys_var(name_arg, NULL, binlog_status_arg)
656
{ chain_sys_var(chain); }
657
bool update(THD *thd, set_var *var);
658
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
661
class sys_var_rand_seed2 :public sys_var
664
sys_var_rand_seed2(sys_var_chain *chain, const char *name_arg,
665
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
666
:sys_var(name_arg, NULL, binlog_status_arg)
667
{ chain_sys_var(chain); }
668
bool update(THD *thd, set_var *var);
669
bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
673
class sys_var_collation :public sys_var_thd
676
sys_var_collation(const char *name_arg,
677
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
678
:sys_var_thd(name_arg, NULL, binlog_status_arg)
680
no_support_one_shot= 0;
682
bool check(THD *thd, set_var *var);
683
SHOW_TYPE show_type() { return SHOW_CHAR; }
684
bool check_update_type(Item_result type)
686
return ((type != STRING_RESULT) && (type != INT_RESULT));
688
bool check_default(enum_var_type type __attribute__((unused))) { return 0; }
689
virtual void set_default(THD *thd, enum_var_type type)= 0;
692
class sys_var_character_set :public sys_var_thd
696
sys_var_character_set(const char *name_arg, bool is_nullable= 0,
697
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
698
:sys_var_thd(name_arg, NULL, binlog_status_arg), nullable(is_nullable)
701
In fact only almost all variables derived from sys_var_character_set
702
support ONE_SHOT; character_set_results doesn't. But that's good enough.
704
no_support_one_shot= 0;
706
bool check(THD *thd, set_var *var);
707
SHOW_TYPE show_type() { return SHOW_CHAR; }
708
bool check_update_type(Item_result type)
710
return ((type != STRING_RESULT) && (type != INT_RESULT));
712
bool check_default(enum_var_type type __attribute__((unused)))
714
bool update(THD *thd, set_var *var);
715
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
716
virtual void set_default(THD *thd, enum_var_type type)= 0;
717
virtual const CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type)= 0;
720
class sys_var_character_set_sv :public sys_var_character_set
722
const CHARSET_INFO *SV::*offset;
723
const CHARSET_INFO **global_default;
725
sys_var_character_set_sv(sys_var_chain *chain, const char *name_arg,
726
const CHARSET_INFO *SV::*offset_arg,
727
const CHARSET_INFO **global_default_arg,
729
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
730
: sys_var_character_set(name_arg, is_nullable, binlog_status_arg),
731
offset(offset_arg), global_default(global_default_arg)
732
{ chain_sys_var(chain); }
733
void set_default(THD *thd, enum_var_type type);
734
const CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
738
class sys_var_character_set_client: public sys_var_character_set_sv
741
sys_var_character_set_client(sys_var_chain *chain, const char *name_arg,
742
const CHARSET_INFO *SV::*offset_arg,
743
const CHARSET_INFO **global_default_arg,
744
Binlog_status_enum binlog_status_arg)
745
: sys_var_character_set_sv(chain, name_arg, offset_arg, global_default_arg,
746
0, binlog_status_arg)
708
bool check(Session *session, set_var *var);
709
SHOW_TYPE show_type() { return SHOW_CHAR; }
710
bool check_update_type(Item_result type)
712
return ((type != STRING_RESULT) && (type != INT_RESULT));
714
bool check_default(sql_var_t) { return 0; }
715
virtual void set_default(Session *session, sql_var_t type)= 0;
748
bool check(THD *thd, set_var *var);
752
class sys_var_character_set_database :public sys_var_character_set
755
sys_var_character_set_database(sys_var_chain *chain, const char *name_arg,
756
Binlog_status_enum binlog_status_arg=
758
: sys_var_character_set(name_arg, 0, binlog_status_arg)
759
{ chain_sys_var(chain); }
760
void set_default(THD *thd, enum_var_type type);
761
const CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
718
764
class sys_var_collation_sv :public sys_var_collation
720
const CHARSET_INFO *system_variables::*offset;
766
const CHARSET_INFO *SV::*offset;
721
767
const CHARSET_INFO **global_default;
723
769
sys_var_collation_sv(sys_var_chain *chain, const char *name_arg,
724
const CHARSET_INFO *system_variables::*offset_arg,
725
const CHARSET_INFO **global_default_arg)
726
:sys_var_collation(name_arg),
770
const CHARSET_INFO *SV::*offset_arg,
771
const CHARSET_INFO **global_default_arg,
772
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
773
:sys_var_collation(name_arg, binlog_status_arg),
727
774
offset(offset_arg), global_default(global_default_arg)
729
776
chain_sys_var(chain);
731
bool update(Session *session, set_var *var);
732
void set_default(Session *session, sql_var_t type);
733
unsigned char *value_ptr(Session *session, sql_var_t type,
734
const LEX_STRING *base);
778
bool update(THD *thd, set_var *var);
779
void set_default(THD *thd, enum_var_type type);
780
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
784
class sys_var_key_cache_param :public sys_var
789
sys_var_key_cache_param(sys_var_chain *chain, const char *name_arg,
791
:sys_var(name_arg), offset(offset_arg)
792
{ chain_sys_var(chain); }
793
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
794
bool check_default(enum_var_type type __attribute__((unused)))
796
bool is_struct() { return 1; }
800
class sys_var_key_buffer_size :public sys_var_key_cache_param
803
sys_var_key_buffer_size(sys_var_chain *chain, const char *name_arg)
804
:sys_var_key_cache_param(chain, name_arg,
805
offsetof(KEY_CACHE, param_buff_size))
807
bool update(THD *thd, set_var *var);
808
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
812
class sys_var_key_cache_long :public sys_var_key_cache_param
815
sys_var_key_cache_long(sys_var_chain *chain, const char *name_arg, size_t offset_arg)
816
:sys_var_key_cache_param(chain, name_arg, offset_arg)
818
bool update(THD *thd, set_var *var);
819
SHOW_TYPE show_type() { return SHOW_LONG; }
823
class sys_var_thd_date_time_format :public sys_var_thd
825
DATE_TIME_FORMAT *SV::*offset;
826
enum enum_drizzle_timestamp_type date_time_type;
828
sys_var_thd_date_time_format(sys_var_chain *chain, const char *name_arg,
829
DATE_TIME_FORMAT *SV::*offset_arg,
830
enum enum_drizzle_timestamp_type date_time_type_arg)
831
:sys_var_thd(name_arg), offset(offset_arg),
832
date_time_type(date_time_type_arg)
833
{ chain_sys_var(chain); }
834
SHOW_TYPE show_type() { return SHOW_CHAR; }
835
bool check_update_type(Item_result type)
837
return type != STRING_RESULT; /* Only accept strings */
839
bool check_default(enum_var_type type __attribute__((unused)))
841
bool check(THD *thd, set_var *var);
842
bool update(THD *thd, set_var *var);
843
void update2(THD *thd, enum_var_type type, DATE_TIME_FORMAT *new_value);
844
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
845
void set_default(THD *thd, enum_var_type type);
849
class sys_var_log_state :public sys_var_bool_ptr
853
sys_var_log_state(sys_var_chain *chain, const char *name_arg, bool *value_arg,
854
uint32_t log_type_arg)
855
:sys_var_bool_ptr(chain, name_arg, value_arg), log_type(log_type_arg) {}
856
bool update(THD *thd, set_var *var);
857
void set_default(THD *thd, enum_var_type type);
861
class sys_var_set :public sys_var
867
sys_var_set(sys_var_chain *chain, const char *name_arg, ulong *value_arg,
868
TYPELIB *typelib, sys_after_update_func func)
869
:sys_var(name_arg, func), value(value_arg), enum_names(typelib)
870
{ chain_sys_var(chain); }
871
virtual bool check(THD *thd, set_var *var)
873
return check_set(thd, var, enum_names);
875
virtual void set_default(THD *thd __attribute__((unused)),
876
enum_var_type type __attribute__((unused)))
880
bool update(THD *thd, set_var *var);
881
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
882
bool check_update_type(Item_result type __attribute__((unused)))
884
SHOW_TYPE show_type() { return SHOW_CHAR; }
887
class sys_var_set_slave_mode :public sys_var_set
890
sys_var_set_slave_mode(sys_var_chain *chain, const char *name_arg,
892
TYPELIB *typelib, sys_after_update_func func) :
893
sys_var_set(chain, name_arg, value_arg, typelib, func) {}
894
void set_default(THD *thd, enum_var_type type);
895
bool check(THD *thd, set_var *var);
896
bool update(THD *thd, set_var *var);
899
class sys_var_log_output :public sys_var
904
sys_var_log_output(sys_var_chain *chain, const char *name_arg, ulong *value_arg,
905
TYPELIB *typelib, sys_after_update_func func)
906
:sys_var(name_arg,func), value(value_arg), enum_names(typelib)
908
chain_sys_var(chain);
909
set_allow_empty_value(false);
911
virtual bool check(THD *thd, set_var *var)
913
return check_set(thd, var, enum_names);
915
bool update(THD *thd, set_var *var);
916
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
917
bool check_update_type(Item_result type __attribute__((unused)))
919
void set_default(THD *thd, enum_var_type type);
920
SHOW_TYPE show_type() { return SHOW_CHAR; }
737
924
/* Variable that you can only read from */
739
926
class sys_var_readonly: public sys_var
929
enum_var_type var_type;
743
930
SHOW_TYPE show_type_value;
744
931
sys_value_ptr_func value_ptr_func;
745
sys_var_readonly(sys_var_chain *chain, const char *name_arg, sql_var_t type,
932
sys_var_readonly(sys_var_chain *chain, const char *name_arg, enum_var_type type,
746
933
SHOW_TYPE show_type_arg,
747
934
sys_value_ptr_func value_ptr_func_arg)
748
:sys_var(name_arg), var_type(type),
935
:sys_var(name_arg), var_type(type),
749
936
show_type_value(show_type_arg), value_ptr_func(value_ptr_func_arg)
750
937
{ chain_sys_var(chain); }
751
bool update(Session *, set_var *)
753
bool check_default(sql_var_t)
755
bool check_type(sql_var_t type) { return type != var_type; }
756
bool check_update_type(Item_result)
758
unsigned char *value_ptr(Session *session, sql_var_t,
938
bool update(THD *thd __attribute__((unused)),
939
set_var *var __attribute__((unused)))
941
bool check_default(enum_var_type type __attribute__((unused)))
943
bool check_type(enum_var_type type) { return type != var_type; }
944
bool check_update_type(Item_result type __attribute__((unused)))
946
unsigned char *value_ptr(THD *thd, enum_var_type type __attribute__((unused)),
947
LEX_STRING *base __attribute__((unused)))
761
return (*value_ptr_func)(session);
949
return (*value_ptr_func)(thd);
763
951
SHOW_TYPE show_type(void) { return show_type_value; }
764
952
bool is_readonly(void) const { return 1; }
768
class sys_var_session_time_zone :public sys_var_session
771
sys_var_session_time_zone(sys_var_chain *chain, const char *name_arg)
772
:sys_var_session(name_arg, NULL)
956
class sys_var_have_option: public sys_var
959
virtual SHOW_COMP_OPTION get_option() = 0;
961
sys_var_have_option(sys_var_chain *chain, const char *variable_name):
962
sys_var(variable_name)
963
{ chain_sys_var(chain); }
964
unsigned char *value_ptr(THD *thd __attribute__((unused)),
965
enum_var_type type __attribute__((unused)),
966
LEX_STRING *base __attribute__((unused)))
968
return (unsigned char*) show_comp_option_name[get_option()];
970
bool update(THD *thd __attribute__((unused)),
971
set_var *var __attribute__((unused))) { return 1; }
972
bool check_default(enum_var_type type __attribute__((unused)))
974
bool check_type(enum_var_type type) { return type != OPT_GLOBAL; }
975
bool check_update_type(Item_result type __attribute__((unused)))
977
SHOW_TYPE show_type() { return SHOW_CHAR; }
978
bool is_readonly() const { return 1; }
982
class sys_var_have_variable: public sys_var_have_option
984
SHOW_COMP_OPTION *have_variable;
987
sys_var_have_variable(sys_var_chain *chain, const char *variable_name,
988
SHOW_COMP_OPTION *have_variable_arg):
989
sys_var_have_option(chain, variable_name),
990
have_variable(have_variable_arg)
992
SHOW_COMP_OPTION get_option() { return *have_variable; }
996
class sys_var_have_plugin: public sys_var_have_option
998
const char *plugin_name_str;
999
const uint32_t plugin_name_len;
1000
const int plugin_type;
1003
sys_var_have_plugin(sys_var_chain *chain, const char *variable_name,
1004
const char *plugin_name_str_arg, uint32_t plugin_name_len_arg,
1005
int plugin_type_arg):
1006
sys_var_have_option(chain, variable_name),
1007
plugin_name_str(plugin_name_str_arg), plugin_name_len(plugin_name_len_arg),
1008
plugin_type(plugin_type_arg)
1010
/* the following method is declared in sql_plugin.cc */
1011
SHOW_COMP_OPTION get_option();
1015
class sys_var_thd_time_zone :public sys_var_thd
1018
sys_var_thd_time_zone(sys_var_chain *chain, const char *name_arg,
1019
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
1020
:sys_var_thd(name_arg, NULL, binlog_status_arg)
1022
no_support_one_shot= 0;
774
1023
chain_sys_var(chain);
776
bool check(Session *session, set_var *var);
1025
bool check(THD *thd, set_var *var);
777
1026
SHOW_TYPE show_type() { return SHOW_CHAR; }
778
1027
bool check_update_type(Item_result type)
780
1029
return type != STRING_RESULT; /* Only accept strings */
782
bool check_default(sql_var_t)
1031
bool check_default(enum_var_type type __attribute__((unused)))
784
bool update(Session *session, set_var *var);
785
unsigned char *value_ptr(Session *session, sql_var_t type,
786
const LEX_STRING *base);
787
virtual void set_default(Session *session, sql_var_t type);
791
class sys_var_microseconds :public sys_var_session
793
uint64_t system_variables::*offset;
1033
bool update(THD *thd, set_var *var);
1034
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1035
virtual void set_default(THD *thd, enum_var_type type);
1039
class sys_var_max_user_conn : public sys_var_thd
1042
sys_var_max_user_conn(sys_var_chain *chain, const char *name_arg):
1043
sys_var_thd(name_arg)
1044
{ chain_sys_var(chain); }
1045
bool check(THD *thd, set_var *var);
1046
bool update(THD *thd, set_var *var);
1047
bool check_default(enum_var_type type)
1049
return type != OPT_GLOBAL || !option_limits;
1051
void set_default(THD *thd, enum_var_type type);
1052
SHOW_TYPE show_type() { return SHOW_INT; }
1053
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1057
class sys_var_microseconds :public sys_var_thd
1059
uint64_t SV::*offset;
795
1061
sys_var_microseconds(sys_var_chain *chain, const char *name_arg,
796
uint64_t system_variables::*offset_arg):
797
sys_var_session(name_arg), offset(offset_arg)
1062
uint64_t SV::*offset_arg):
1063
sys_var_thd(name_arg), offset(offset_arg)
798
1064
{ chain_sys_var(chain); }
799
bool check(Session *, set_var *) {return 0;}
800
bool update(Session *session, set_var *var);
801
void set_default(Session *session, sql_var_t type);
1065
bool check(THD *thd __attribute__((unused)),
1066
set_var *var __attribute__((unused))) {return 0;}
1067
bool update(THD *thd, set_var *var);
1068
void set_default(THD *thd, enum_var_type type);
802
1069
SHOW_TYPE show_type() { return SHOW_DOUBLE; }
803
1070
bool check_update_type(Item_result type)
805
1072
return (type != INT_RESULT && type != REAL_RESULT && type != DECIMAL_RESULT);
809
class sys_var_session_lc_time_names :public sys_var_session
812
sys_var_session_lc_time_names(sys_var_chain *chain, const char *name_arg)
813
: sys_var_session(name_arg, NULL)
1074
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1078
Handler for setting the system variable --read-only.
1081
class sys_var_opt_readonly :public sys_var_bool_ptr
1084
sys_var_opt_readonly(sys_var_chain *chain, const char *name_arg,
1086
sys_var_bool_ptr(chain, name_arg, value_arg) {};
1087
~sys_var_opt_readonly() {};
1088
bool update(THD *thd, set_var *var);
1092
class sys_var_thd_lc_time_names :public sys_var_thd
1095
sys_var_thd_lc_time_names(sys_var_chain *chain, const char *name_arg,
1096
Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
1097
: sys_var_thd(name_arg, NULL, binlog_status_arg)
1099
#if DRIZZLE_VERSION_ID < 50000
1100
no_support_one_shot= 0;
815
1102
chain_sys_var(chain);
817
bool check(Session *session, set_var *var);
1104
bool check(THD *thd, set_var *var);
818
1105
SHOW_TYPE show_type() { return SHOW_CHAR; }
819
1106
bool check_update_type(Item_result type)
821
1108
return ((type != STRING_RESULT) && (type != INT_RESULT));
823
bool check_default(sql_var_t)
1110
bool check_default(enum_var_type type __attribute__((unused)))
825
bool update(Session *session, set_var *var);
826
unsigned char *value_ptr(Session *session, sql_var_t type,
827
const LEX_STRING *base);
828
virtual void set_default(Session *session, sql_var_t type);
1112
bool update(THD *thd, set_var *var);
1113
unsigned char *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1114
virtual void set_default(THD *thd, enum_var_type type);
1118
extern void fix_binlog_format_after_update(THD *thd, enum_var_type type);
1120
class sys_var_thd_binlog_format :public sys_var_thd_enum
1123
sys_var_thd_binlog_format(sys_var_chain *chain, const char *name_arg,
1124
ulong SV::*offset_arg)
1125
:sys_var_thd_enum(chain, name_arg, offset_arg,
1126
&binlog_format_typelib,
1127
fix_binlog_format_after_update)
1129
bool is_readonly() const;
832
1132
/****************************************************************************
833
1133
Classes for parsing of the SET command
834
1134
****************************************************************************/
836
class set_var_base :public memory::SqlAlloc
1136
class set_var_base :public Sql_alloc
839
1139
set_var_base() {}
840
1140
virtual ~set_var_base() {}
841
virtual int check(Session *session)=0; /* To check privileges etc. */
842
virtual int update(Session *session)=0; /* To set the value */
1141
virtual int check(THD *thd)=0; /* To check privileges etc. */
1142
virtual int update(THD *thd)=0; /* To set the value */
843
1143
/* light check for PS */
1144
virtual bool no_support_one_shot() { return 1; }
846
1148
/* MySQL internal variables */
847
1150
class set_var :public set_var_base
855
1158
const CHARSET_INFO *charset;
856
uint32_t uint32_t_value;
857
1160
uint64_t uint64_t_value;
859
plugin::StorageEngine *storage_engine;
1162
DATE_TIME_FORMAT *date_time_format;
860
1163
Time_zone *time_zone;
861
1164
MY_LOCALE *locale_value;
863
1166
LEX_STRING base; /* for structs */
865
set_var(sql_var_t type_arg, sys_var *var_arg,
1168
set_var(enum_var_type type_arg, sys_var *var_arg,
866
1169
const LEX_STRING *base_name_arg, Item *value_arg)
867
1170
:var(var_arg), type(type_arg), base(*base_name_arg)