~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2002-2006 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/* Classes to support the SET command */
17
18
#ifdef USE_PRAGMA_INTERFACE
19
#pragma interface			/* gcc class implementation */
20
#endif
21
22
/****************************************************************************
23
  Variables that are changable runtime are declared using the
24
  following classes
25
****************************************************************************/
26
27
class sys_var;
28
class set_var;
29
class sys_var_pluginvar; /* opaque */
30
typedef struct system_variables SV;
31
typedef struct my_locale_st MY_LOCALE;
32
33
extern TYPELIB bool_typelib, delay_key_write_typelib, sql_mode_typelib,
34
  optimizer_switch_typelib, slave_exec_mode_typelib;
35
36
typedef int (*sys_check_func)(THD *,  set_var *);
37
typedef bool (*sys_update_func)(THD *, set_var *);
38
typedef void (*sys_after_update_func)(THD *,enum_var_type);
39
typedef void (*sys_set_default_func)(THD *, enum_var_type);
40
typedef uchar *(*sys_value_ptr_func)(THD *thd);
41
42
struct sys_var_chain
43
{
44
  sys_var *first;
45
  sys_var *last;
46
};
47
48
class sys_var
49
{
50
public:
51
52
  /**
53
    Enumeration type to indicate for a system variable whether it will be written to the binlog or not.
54
  */
55
  enum Binlog_status_enum
56
  {  
57
    /* The variable value is not in the binlog. */
58
    NOT_IN_BINLOG,
59
    /* The value of the @@session variable is in the binlog. */
60
    SESSION_VARIABLE_IN_BINLOG
61
    /*
62
      Currently, no @@global variable is ever in the binlog, so we
63
      don't need an enumeration value for that.
64
    */
65
  };
66
67
  sys_var *next;
68
  struct my_option *option_limits;	/* Updated by by set_var_init() */
69
  uint name_length;			/* Updated by by set_var_init() */
70
  const char *name;
71
72
  sys_after_update_func after_update;
73
  bool no_support_one_shot;
74
  sys_var(const char *name_arg, sys_after_update_func func= NULL,
75
          Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
76
    :name(name_arg), after_update(func), no_support_one_shot(1),
77
    binlog_status(binlog_status_arg),
78
    m_allow_empty_value(TRUE)
79
  {}
80
  virtual ~sys_var() {}
81
  void chain_sys_var(sys_var_chain *chain_arg)
82
  {
83
    if (chain_arg->last)
84
      chain_arg->last->next= this;
85
    else
86
      chain_arg->first= this;
87
    chain_arg->last= this;
88
  }
89
  virtual bool check(THD *thd, set_var *var);
90
  bool check_enum(THD *thd, set_var *var, const TYPELIB *enum_names);
91
  bool check_set(THD *thd, set_var *var, TYPELIB *enum_names);
92
  bool is_written_to_binlog(enum_var_type type)
93
  {
94
    return (type == OPT_SESSION || type == OPT_DEFAULT) &&
95
      (binlog_status == SESSION_VARIABLE_IN_BINLOG);
96
  }
97
  virtual bool update(THD *thd, set_var *var)=0;
98
  virtual void set_default(THD *thd_arg, enum_var_type type) {}
99
  virtual SHOW_TYPE show_type() { return SHOW_UNDEF; }
100
  virtual uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
101
  { return 0; }
102
  virtual bool check_type(enum_var_type type)
103
  { return type != OPT_GLOBAL; }		/* Error if not GLOBAL */
104
  virtual bool check_update_type(Item_result type)
105
  { return type != INT_RESULT; }		/* Assume INT */
106
  virtual bool check_default(enum_var_type type)
107
  { return option_limits == 0; }
108
  Item *item(THD *thd, enum_var_type type, LEX_STRING *base);
109
  virtual bool is_struct() { return 0; }
110
  virtual bool is_readonly() const { return 0; }
111
  virtual sys_var_pluginvar *cast_pluginvar() { return 0; }
112
113
protected:
114
  void set_allow_empty_value(bool allow_empty_value)
115
  {
116
    m_allow_empty_value= allow_empty_value;
117
  }
118
119
private:
120
  const Binlog_status_enum binlog_status;
121
122
  bool m_allow_empty_value;
123
};
124
125
126
/*
127
  A base class for all variables that require its access to
128
  be guarded with a mutex.
129
*/
130
131
class sys_var_global: public sys_var
132
{
133
protected:
134
  pthread_mutex_t *guard;
135
public:
136
  sys_var_global(const char *name_arg, sys_after_update_func after_update_arg,
137
                 pthread_mutex_t *guard_arg)
138
    :sys_var(name_arg, after_update_arg), guard(guard_arg) {}
139
};
140
141
142
/*
143
  A global-only ulong variable that requires its access to be
144
  protected with a mutex.
145
*/
146
147
class sys_var_long_ptr_global: public sys_var_global
148
{
149
public:
150
  ulong *value;
151
  sys_var_long_ptr_global(sys_var_chain *chain, const char *name_arg,
152
                          ulong *value_ptr_arg,
153
                          pthread_mutex_t *guard_arg,
154
                          sys_after_update_func after_update_arg= NULL)
155
    :sys_var_global(name_arg, after_update_arg, guard_arg),
156
    value(value_ptr_arg)
157
  { chain_sys_var(chain); }
158
  bool check(THD *thd, set_var *var);
159
  bool update(THD *thd, set_var *var);
160
  void set_default(THD *thd, enum_var_type type);
161
  SHOW_TYPE show_type() { return SHOW_LONG; }
162
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
163
  { return (uchar*) value; }
164
};
165
166
167
/*
168
  A global ulong variable that is protected by LOCK_global_system_variables
169
*/
170
171
class sys_var_long_ptr :public sys_var_long_ptr_global
172
{
173
public:
174
  sys_var_long_ptr(sys_var_chain *chain, const char *name_arg, ulong *value_ptr,
175
                   sys_after_update_func after_update_arg= NULL);
176
};
177
178
179
class sys_var_ulonglong_ptr :public sys_var
180
{
181
public:
182
  ulonglong *value;
183
  sys_var_ulonglong_ptr(sys_var_chain *chain, const char *name_arg, ulonglong *value_ptr_arg)
184
    :sys_var(name_arg),value(value_ptr_arg)
185
  { chain_sys_var(chain); }
186
  sys_var_ulonglong_ptr(sys_var_chain *chain, const char *name_arg, ulonglong *value_ptr_arg,
187
		       sys_after_update_func func)
188
    :sys_var(name_arg,func), value(value_ptr_arg)
189
  { chain_sys_var(chain); }
190
  bool update(THD *thd, set_var *var);
191
  void set_default(THD *thd, enum_var_type type);
192
  SHOW_TYPE show_type() { return SHOW_LONGLONG; }
193
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
194
  { return (uchar*) value; }
195
};
196
197
198
class sys_var_bool_ptr :public sys_var
199
{
200
public:
201
  my_bool *value;
202
  sys_var_bool_ptr(sys_var_chain *chain, const char *name_arg, my_bool *value_arg)
203
    :sys_var(name_arg),value(value_arg)
204
  { chain_sys_var(chain); }
205
  bool check(THD *thd, set_var *var)
206
  {
207
    return check_enum(thd, var, &bool_typelib);
208
  }
209
  bool update(THD *thd, set_var *var);
210
  void set_default(THD *thd, enum_var_type type);
211
  SHOW_TYPE show_type() { return SHOW_MY_BOOL; }
212
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
213
  { return (uchar*) value; }
214
  bool check_update_type(Item_result type) { return 0; }
215
};
216
217
218
class sys_var_bool_ptr_readonly :public sys_var_bool_ptr
219
{
220
public:
221
  sys_var_bool_ptr_readonly(sys_var_chain *chain, const char *name_arg,
222
                            my_bool *value_arg)
223
    :sys_var_bool_ptr(chain, name_arg, value_arg)
224
  {}
225
  bool is_readonly() const { return 1; }
226
};
227
228
229
class sys_var_str :public sys_var
230
{
231
public:
232
  char *value;					// Pointer to allocated string
233
  uint value_length;
234
  sys_check_func check_func;
235
  sys_update_func update_func;
236
  sys_set_default_func set_default_func;
237
  sys_var_str(sys_var_chain *chain, const char *name_arg,
238
	      sys_check_func check_func_arg,
239
	      sys_update_func update_func_arg,
240
	      sys_set_default_func set_default_func_arg,
241
              char *value_arg)
242
    :sys_var(name_arg), value(value_arg), check_func(check_func_arg),
243
    update_func(update_func_arg),set_default_func(set_default_func_arg)
244
  { chain_sys_var(chain); }
245
  bool check(THD *thd, set_var *var);
246
  bool update(THD *thd, set_var *var)
247
  {
248
    return (*update_func)(thd, var);
249
  }
250
  void set_default(THD *thd, enum_var_type type)
251
  {
252
    (*set_default_func)(thd, type);
253
  }
254
  SHOW_TYPE show_type() { return SHOW_CHAR; }
255
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
256
  { return (uchar*) value; }
257
  bool check_update_type(Item_result type)
258
  {
259
    return type != STRING_RESULT;		/* Only accept strings */
260
  }
261
  bool check_default(enum_var_type type) { return 0; }
262
};
263
264
265
class sys_var_const_str :public sys_var
266
{
267
public:
268
  char *value;					// Pointer to const value
269
  sys_var_const_str(sys_var_chain *chain, const char *name_arg,
270
                    const char *value_arg)
271
    :sys_var(name_arg), value((char*) value_arg)
272
  { chain_sys_var(chain); }
273
  bool check(THD *thd, set_var *var)
274
  {
275
    return 1;
276
  }
277
  bool update(THD *thd, set_var *var)
278
  {
279
    return 1;
280
  }
281
  SHOW_TYPE show_type() { return SHOW_CHAR; }
282
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
283
  {
284
    return (uchar*) value;
285
  }
286
  bool check_update_type(Item_result type)
287
  {
288
    return 1;
289
  }
290
  bool check_default(enum_var_type type) { return 1; }
291
  bool is_readonly() const { return 1; }
292
};
293
294
295
class sys_var_const_str_ptr :public sys_var
296
{
297
public:
298
  char **value;					// Pointer to const value
299
  sys_var_const_str_ptr(sys_var_chain *chain, const char *name_arg, char **value_arg)
300
    :sys_var(name_arg),value(value_arg)
301
  { chain_sys_var(chain); }
302
  bool check(THD *thd, set_var *var)
303
  {
304
    return 1;
305
  }
306
  bool update(THD *thd, set_var *var)
307
  {
308
    return 1;
309
  }
310
  SHOW_TYPE show_type() { return SHOW_CHAR; }
311
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
312
  {
313
    return (uchar*) *value;
314
  }
315
  bool check_update_type(Item_result type)
316
  {
317
    return 1;
318
  }
319
  bool check_default(enum_var_type type) { return 1; }
320
  bool is_readonly() const { return 1; }
321
};
322
323
324
class sys_var_enum :public sys_var
325
{
326
  uint *value;
327
  TYPELIB *enum_names;
328
public:
329
  sys_var_enum(sys_var_chain *chain, const char *name_arg, uint *value_arg,
330
	       TYPELIB *typelib, sys_after_update_func func)
331
    :sys_var(name_arg,func), value(value_arg), enum_names(typelib)
332
  { chain_sys_var(chain); }
333
  bool check(THD *thd, set_var *var)
334
  {
335
    return check_enum(thd, var, enum_names);
336
  }
337
  bool update(THD *thd, set_var *var);
338
  SHOW_TYPE show_type() { return SHOW_CHAR; }
339
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
340
  bool check_update_type(Item_result type) { return 0; }
341
};
342
343
344
class sys_var_enum_const :public sys_var
345
{
346
  ulong SV::*offset;
347
  TYPELIB *enum_names;
348
public:
349
  sys_var_enum_const(sys_var_chain *chain, const char *name_arg, ulong SV::*offset_arg,
350
      TYPELIB *typelib, sys_after_update_func func)
351
    :sys_var(name_arg,func), offset(offset_arg), enum_names(typelib)
352
  { chain_sys_var(chain); }
353
  bool check(THD *thd, set_var *var) { return 1; }
354
  bool update(THD *thd, set_var *var) { return 1; }
355
  SHOW_TYPE show_type() { return SHOW_CHAR; }
356
  bool check_update_type(Item_result type) { return 1; }
357
  bool is_readonly() const { return 1; }
358
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
359
};
360
361
362
class sys_var_thd :public sys_var
363
{
364
public:
365
  sys_var_thd(const char *name_arg, 
366
              sys_after_update_func func= NULL,
367
              Binlog_status_enum binlog_status= NOT_IN_BINLOG)
368
    :sys_var(name_arg, func, binlog_status)
369
  {}
370
  bool check_type(enum_var_type type) { return 0; }
371
  bool check_default(enum_var_type type)
372
  {
373
    return type == OPT_GLOBAL && !option_limits;
374
  }
375
};
376
377
378
class sys_var_thd_ulong :public sys_var_thd
379
{
380
  sys_check_func check_func;
381
public:
382
  ulong SV::*offset;
383
  sys_var_thd_ulong(sys_var_chain *chain, const char *name_arg,
384
                    ulong SV::*offset_arg,
385
                    sys_check_func c_func= NULL,
386
                    sys_after_update_func au_func= NULL,
387
                    Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
388
    :sys_var_thd(name_arg, au_func, binlog_status_arg), check_func(c_func),
389
    offset(offset_arg)
390
  { chain_sys_var(chain); }
391
  bool check(THD *thd, set_var *var);
392
  bool update(THD *thd, set_var *var);
393
  void set_default(THD *thd, enum_var_type type);
394
  SHOW_TYPE show_type() { return SHOW_LONG; }
395
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
396
};
397
398
399
class sys_var_thd_ha_rows :public sys_var_thd
400
{
401
public:
402
  ha_rows SV::*offset;
403
  sys_var_thd_ha_rows(sys_var_chain *chain, const char *name_arg, 
404
                      ha_rows SV::*offset_arg)
405
    :sys_var_thd(name_arg), offset(offset_arg)
406
  { chain_sys_var(chain); }
407
  sys_var_thd_ha_rows(sys_var_chain *chain, const char *name_arg, 
408
                      ha_rows SV::*offset_arg,
409
		      sys_after_update_func func)
410
    :sys_var_thd(name_arg,func), offset(offset_arg)
411
  { chain_sys_var(chain); }
412
  bool update(THD *thd, set_var *var);
413
  void set_default(THD *thd, enum_var_type type);
414
  SHOW_TYPE show_type() { return SHOW_HA_ROWS; }
415
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
416
};
417
418
419
class sys_var_thd_ulonglong :public sys_var_thd
420
{
421
public:
422
  ulonglong SV::*offset;
423
  bool only_global;
424
  sys_var_thd_ulonglong(sys_var_chain *chain, const char *name_arg, 
425
                        ulonglong SV::*offset_arg)
426
    :sys_var_thd(name_arg), offset(offset_arg)
427
  { chain_sys_var(chain); }
428
  sys_var_thd_ulonglong(sys_var_chain *chain, const char *name_arg, 
429
                        ulonglong SV::*offset_arg,
430
			sys_after_update_func func, bool only_global_arg)
431
    :sys_var_thd(name_arg, func), offset(offset_arg),
432
    only_global(only_global_arg)
433
  { chain_sys_var(chain); }
434
  bool update(THD *thd, set_var *var);
435
  void set_default(THD *thd, enum_var_type type);
436
  SHOW_TYPE show_type() { return SHOW_LONGLONG; }
437
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
438
  bool check(THD *thd, set_var *var);
439
  bool check_default(enum_var_type type)
440
  {
441
    return type == OPT_GLOBAL && !option_limits;
442
  }
443
  bool check_type(enum_var_type type)
444
  {
445
    return (only_global && type != OPT_GLOBAL);
446
  }
447
};
448
449
450
class sys_var_thd_bool :public sys_var_thd
451
{
452
public:
453
  my_bool SV::*offset;
454
  sys_var_thd_bool(sys_var_chain *chain, const char *name_arg, my_bool SV::*offset_arg)
455
    :sys_var_thd(name_arg), offset(offset_arg)
456
  { chain_sys_var(chain); }
457
  sys_var_thd_bool(sys_var_chain *chain, const char *name_arg, my_bool SV::*offset_arg,
458
		   sys_after_update_func func)
459
    :sys_var_thd(name_arg,func), offset(offset_arg)
460
  { chain_sys_var(chain); }
461
  bool update(THD *thd, set_var *var);
462
  void set_default(THD *thd, enum_var_type type);
463
  SHOW_TYPE show_type() { return SHOW_MY_BOOL; }
464
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
465
  bool check(THD *thd, set_var *var)
466
  {
467
    return check_enum(thd, var, &bool_typelib);
468
  }
469
  bool check_update_type(Item_result type) { return 0; }
470
};
471
472
473
class sys_var_thd_enum :public sys_var_thd
474
{
475
protected:
476
  ulong SV::*offset;
477
  TYPELIB *enum_names;
478
  sys_check_func check_func;
479
public:
480
  sys_var_thd_enum(sys_var_chain *chain, const char *name_arg,
481
                   ulong SV::*offset_arg, TYPELIB *typelib,
482
                   sys_after_update_func func= NULL,
483
                   sys_check_func check= NULL)
484
    :sys_var_thd(name_arg, func), offset(offset_arg),
485
    enum_names(typelib), check_func(check)
486
  { chain_sys_var(chain); }
487
  bool check(THD *thd, set_var *var)
488
  {
489
    int ret= 0;
490
    if (check_func)
491
      ret= (*check_func)(thd, var);
492
    return ret ? ret : check_enum(thd, var, enum_names);
493
  }
494
  bool update(THD *thd, set_var *var);
495
  void set_default(THD *thd, enum_var_type type);
496
  SHOW_TYPE show_type() { return SHOW_CHAR; }
497
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
498
  bool check_update_type(Item_result type) { return 0; }
499
};
500
501
502
503
class sys_var_thd_optimizer_switch :public sys_var_thd_enum
504
{
505
public:
506
  sys_var_thd_optimizer_switch(sys_var_chain *chain, const char *name_arg, 
507
                               ulong SV::*offset_arg)
508
    :sys_var_thd_enum(chain, name_arg, offset_arg, &optimizer_switch_typelib)
509
  {}
510
  bool check(THD *thd, set_var *var)
511
  {
512
    return check_set(thd, var, enum_names);
513
  }
514
  void set_default(THD *thd, enum_var_type type);
515
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
516
  static bool symbolic_mode_representation(THD *thd, ulonglong sql_mode,
517
                                           LEX_STRING *rep);
518
};
519
520
521
class sys_var_thd_storage_engine :public sys_var_thd
522
{
523
protected:
524
  plugin_ref SV::*offset;
525
public:
526
  sys_var_thd_storage_engine(sys_var_chain *chain, const char *name_arg, 
527
                             plugin_ref SV::*offset_arg)
528
    :sys_var_thd(name_arg), offset(offset_arg)
529
  { chain_sys_var(chain); }
530
  bool check(THD *thd, set_var *var);
531
  SHOW_TYPE show_type() { return SHOW_CHAR; }
532
  bool check_update_type(Item_result type)
533
  {
534
    return type != STRING_RESULT;		/* Only accept strings */
535
  }
536
  void set_default(THD *thd, enum_var_type type);
537
  bool update(THD *thd, set_var *var);
538
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
539
};
540
541
class sys_var_thd_bit :public sys_var_thd
542
{
543
  sys_check_func check_func;
544
  sys_update_func update_func;
545
public:
546
  ulonglong bit_flag;
547
  bool reverse;
548
  sys_var_thd_bit(sys_var_chain *chain, const char *name_arg,
549
                  sys_check_func c_func, sys_update_func u_func,
550
                  ulonglong bit, bool reverse_arg=0,
551
                  Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
552
    :sys_var_thd(name_arg, NULL, binlog_status_arg), check_func(c_func),
553
    update_func(u_func), bit_flag(bit), reverse(reverse_arg)
554
  { chain_sys_var(chain); }
555
  bool check(THD *thd, set_var *var);
556
  bool update(THD *thd, set_var *var);
557
  bool check_update_type(Item_result type) { return 0; }
558
  bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
559
  SHOW_TYPE show_type() { return SHOW_MY_BOOL; }
560
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
561
};
562
563
class sys_var_thd_dbug :public sys_var_thd
564
{
565
public:
566
  sys_var_thd_dbug(sys_var_chain *chain, const char *name_arg)
567
    :sys_var_thd(name_arg)
568
  { chain_sys_var(chain); }
569
  bool check_update_type(Item_result type) { return type != STRING_RESULT; }
570
  SHOW_TYPE show_type() { return SHOW_CHAR; }
571
  bool update(THD *thd, set_var *var);
572
  void set_default(THD *thd, enum_var_type type) { DBUG_POP(); }
573
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *b);
574
};
575
576
577
578
/* some variables that require special handling */
579
580
class sys_var_timestamp :public sys_var
581
{
582
public:
583
  sys_var_timestamp(sys_var_chain *chain, const char *name_arg,
584
                    Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
585
    :sys_var(name_arg, NULL, binlog_status_arg)
586
  { chain_sys_var(chain); }
587
  bool update(THD *thd, set_var *var);
588
  void set_default(THD *thd, enum_var_type type);
589
  bool check_type(enum_var_type type)    { return type == OPT_GLOBAL; }
590
  bool check_default(enum_var_type type) { return 0; }
591
  SHOW_TYPE show_type() { return SHOW_LONG; }
592
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
593
};
594
595
596
class sys_var_last_insert_id :public sys_var
597
{
598
public:
599
  sys_var_last_insert_id(sys_var_chain *chain, const char *name_arg,
600
                         Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
601
    :sys_var(name_arg, NULL, binlog_status_arg)
602
  { chain_sys_var(chain); }
603
  bool update(THD *thd, set_var *var);
604
  bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
605
  SHOW_TYPE show_type() { return SHOW_LONGLONG; }
606
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
607
};
608
609
610
class sys_var_insert_id :public sys_var
611
{
612
public:
613
  sys_var_insert_id(sys_var_chain *chain, const char *name_arg)
614
    :sys_var(name_arg)
615
  { chain_sys_var(chain); }
616
  bool update(THD *thd, set_var *var);
617
  bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
618
  SHOW_TYPE show_type() { return SHOW_LONGLONG; }
619
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
620
};
621
622
623
class sys_var_rand_seed1 :public sys_var
624
{
625
public:
626
  sys_var_rand_seed1(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
};
633
634
class sys_var_rand_seed2 :public sys_var
635
{
636
public:
637
  sys_var_rand_seed2(sys_var_chain *chain, const char *name_arg,
638
                     Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
639
    :sys_var(name_arg, NULL, binlog_status_arg)
640
  { chain_sys_var(chain); }
641
  bool update(THD *thd, set_var *var);
642
  bool check_type(enum_var_type type) { return type == OPT_GLOBAL; }
643
};
644
645
646
class sys_var_collation :public sys_var_thd
647
{
648
public:
649
  sys_var_collation(const char *name_arg,
650
                    Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
651
    :sys_var_thd(name_arg, NULL, binlog_status_arg)
652
  {
653
    no_support_one_shot= 0;
654
  }
655
  bool check(THD *thd, set_var *var);
656
  SHOW_TYPE show_type() { return SHOW_CHAR; }
657
  bool check_update_type(Item_result type)
658
  {
659
    return ((type != STRING_RESULT) && (type != INT_RESULT));
660
  }
661
  bool check_default(enum_var_type type) { return 0; }
662
  virtual void set_default(THD *thd, enum_var_type type)= 0;
663
};
664
665
class sys_var_character_set :public sys_var_thd
666
{
667
public:
668
  bool nullable;
669
  sys_var_character_set(const char *name_arg, bool is_nullable= 0,
670
                        Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
671
    :sys_var_thd(name_arg, NULL, binlog_status_arg), nullable(is_nullable)
672
  {
673
    /*
674
      In fact only almost all variables derived from sys_var_character_set
675
      support ONE_SHOT; character_set_results doesn't. But that's good enough.
676
    */
677
    no_support_one_shot= 0;
678
  }
679
  bool check(THD *thd, set_var *var);
680
  SHOW_TYPE show_type() { return SHOW_CHAR; }
681
  bool check_update_type(Item_result type)
682
  {
683
    return ((type != STRING_RESULT) && (type != INT_RESULT));
684
  }
685
  bool check_default(enum_var_type type) { return 0; }
686
  bool update(THD *thd, set_var *var);
687
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
688
  virtual void set_default(THD *thd, enum_var_type type)= 0;
689
  virtual CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type)= 0;
690
};
691
692
class sys_var_character_set_sv :public sys_var_character_set
693
{
694
  CHARSET_INFO *SV::*offset;
695
  CHARSET_INFO **global_default;
696
public:
697
  sys_var_character_set_sv(sys_var_chain *chain, const char *name_arg,
698
			   CHARSET_INFO *SV::*offset_arg,
699
			   CHARSET_INFO **global_default_arg,
700
                           bool is_nullable= 0,
701
                           Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
702
    : sys_var_character_set(name_arg, is_nullable, binlog_status_arg),
703
    offset(offset_arg), global_default(global_default_arg)
704
  { chain_sys_var(chain); }
705
  void set_default(THD *thd, enum_var_type type);
706
  CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
707
};
708
709
710
class sys_var_character_set_client: public sys_var_character_set_sv
711
{
712
public:
713
  sys_var_character_set_client(sys_var_chain *chain, const char *name_arg,
714
                               CHARSET_INFO *SV::*offset_arg,
715
                               CHARSET_INFO **global_default_arg,
716
                               Binlog_status_enum binlog_status_arg)
717
    : sys_var_character_set_sv(chain, name_arg, offset_arg, global_default_arg,
718
                               0, binlog_status_arg)
719
  { }
720
  bool check(THD *thd, set_var *var);
721
};
722
723
724
class sys_var_character_set_database :public sys_var_character_set
725
{
726
public:
727
  sys_var_character_set_database(sys_var_chain *chain, const char *name_arg,
728
                                 Binlog_status_enum binlog_status_arg=
729
                                   NOT_IN_BINLOG)
730
    : sys_var_character_set(name_arg, 0, binlog_status_arg)
731
  { chain_sys_var(chain); }
732
  void set_default(THD *thd, enum_var_type type);
733
  CHARSET_INFO **ci_ptr(THD *thd, enum_var_type type);
734
};
735
736
class sys_var_collation_sv :public sys_var_collation
737
{
738
  CHARSET_INFO *SV::*offset;
739
  CHARSET_INFO **global_default;
740
public:
741
  sys_var_collation_sv(sys_var_chain *chain, const char *name_arg,
742
		       CHARSET_INFO *SV::*offset_arg,
743
                       CHARSET_INFO **global_default_arg,
744
                       Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
745
    :sys_var_collation(name_arg, binlog_status_arg),
746
    offset(offset_arg), global_default(global_default_arg)
747
  {
748
    chain_sys_var(chain);
749
  }
750
  bool update(THD *thd, set_var *var);
751
  void set_default(THD *thd, enum_var_type type);
752
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
753
};
754
755
756
class sys_var_key_cache_param :public sys_var
757
{
758
protected:
759
  size_t offset;
760
public:
761
  sys_var_key_cache_param(sys_var_chain *chain, const char *name_arg, 
762
                          size_t offset_arg)
763
    :sys_var(name_arg), offset(offset_arg)
764
  { chain_sys_var(chain); }
765
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
766
  bool check_default(enum_var_type type) { return 1; }
767
  bool is_struct() { return 1; }
768
};
769
770
771
class sys_var_key_buffer_size :public sys_var_key_cache_param
772
{
773
public:
774
  sys_var_key_buffer_size(sys_var_chain *chain, const char *name_arg)
775
    :sys_var_key_cache_param(chain, name_arg,
776
                             offsetof(KEY_CACHE, param_buff_size))
777
  {}
778
  bool update(THD *thd, set_var *var);
779
  SHOW_TYPE show_type() { return SHOW_LONGLONG; }
780
};
781
782
783
class sys_var_key_cache_long :public sys_var_key_cache_param
784
{
785
public:
786
  sys_var_key_cache_long(sys_var_chain *chain, const char *name_arg, size_t offset_arg)
787
    :sys_var_key_cache_param(chain, name_arg, offset_arg)
788
  {}
789
  bool update(THD *thd, set_var *var);
790
  SHOW_TYPE show_type() { return SHOW_LONG; }
791
};
792
793
794
class sys_var_thd_date_time_format :public sys_var_thd
795
{
796
  DATE_TIME_FORMAT *SV::*offset;
797
  timestamp_type date_time_type;
798
public:
799
  sys_var_thd_date_time_format(sys_var_chain *chain, const char *name_arg,
800
			       DATE_TIME_FORMAT *SV::*offset_arg,
801
			       timestamp_type date_time_type_arg)
802
    :sys_var_thd(name_arg), offset(offset_arg),
803
    date_time_type(date_time_type_arg)
804
  { chain_sys_var(chain); }
805
  SHOW_TYPE show_type() { return SHOW_CHAR; }
806
  bool check_update_type(Item_result type)
807
  {
808
    return type != STRING_RESULT;		/* Only accept strings */
809
  }
810
  bool check_default(enum_var_type type) { return 0; }
811
  bool check(THD *thd, set_var *var);
812
  bool update(THD *thd, set_var *var);
813
  void update2(THD *thd, enum_var_type type, DATE_TIME_FORMAT *new_value);
814
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
815
  void set_default(THD *thd, enum_var_type type);
816
};
817
818
819
class sys_var_log_state :public sys_var_bool_ptr
820
{
821
  uint log_type;
822
public:
823
  sys_var_log_state(sys_var_chain *chain, const char *name_arg, my_bool *value_arg, 
824
                    uint log_type_arg)
825
    :sys_var_bool_ptr(chain, name_arg, value_arg), log_type(log_type_arg) {}
826
  bool update(THD *thd, set_var *var);
827
  void set_default(THD *thd, enum_var_type type);
828
};
829
830
831
class sys_var_set :public sys_var
832
{
833
protected:
834
  ulong *value;
835
  TYPELIB *enum_names;
836
public:
837
  sys_var_set(sys_var_chain *chain, const char *name_arg, ulong *value_arg,
838
              TYPELIB *typelib, sys_after_update_func func)
839
    :sys_var(name_arg, func), value(value_arg), enum_names(typelib)
840
  { chain_sys_var(chain); }
841
  virtual bool check(THD *thd, set_var *var)
842
  {
843
    return check_set(thd, var, enum_names);
844
  }
845
  virtual void set_default(THD *thd, enum_var_type type)
846
  {  
847
    *value= 0;
848
  }
849
  bool update(THD *thd, set_var *var);
850
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
851
  bool check_update_type(Item_result type) { return 0; }
852
  SHOW_TYPE show_type() { return SHOW_CHAR; }
853
};
854
855
class sys_var_set_slave_mode :public sys_var_set
856
{
857
public:
858
  sys_var_set_slave_mode(sys_var_chain *chain, const char *name_arg,
859
                         ulong *value_arg,
860
                         TYPELIB *typelib, sys_after_update_func func) :
861
    sys_var_set(chain, name_arg, value_arg, typelib, func) {}
862
  void set_default(THD *thd, enum_var_type type);
863
  bool check(THD *thd, set_var *var);
864
  bool update(THD *thd, set_var *var);
865
};
866
867
class sys_var_log_output :public sys_var
868
{
869
  ulong *value;
870
  TYPELIB *enum_names;
871
public:
872
  sys_var_log_output(sys_var_chain *chain, const char *name_arg, ulong *value_arg,
873
                     TYPELIB *typelib, sys_after_update_func func)
874
    :sys_var(name_arg,func), value(value_arg), enum_names(typelib)
875
  {
876
    chain_sys_var(chain);
877
    set_allow_empty_value(FALSE);
878
  }
879
  virtual bool check(THD *thd, set_var *var)
880
  {
881
    return check_set(thd, var, enum_names);
882
  }
883
  bool update(THD *thd, set_var *var);
884
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
885
  bool check_update_type(Item_result type) { return 0; }
886
  void set_default(THD *thd, enum_var_type type);
887
  SHOW_TYPE show_type() { return SHOW_CHAR; }
888
};
889
890
891
/* Variable that you can only read from */
892
893
class sys_var_readonly: public sys_var
894
{
895
public:
896
  enum_var_type var_type;
897
  SHOW_TYPE show_type_value;
898
  sys_value_ptr_func value_ptr_func;
899
  sys_var_readonly(sys_var_chain *chain, const char *name_arg, enum_var_type type,
900
		   SHOW_TYPE show_type_arg,
901
		   sys_value_ptr_func value_ptr_func_arg)
902
    :sys_var(name_arg), var_type(type), 
903
       show_type_value(show_type_arg), value_ptr_func(value_ptr_func_arg)
904
  { chain_sys_var(chain); }
905
  bool update(THD *thd, set_var *var) { return 1; }
906
  bool check_default(enum_var_type type) { return 1; }
907
  bool check_type(enum_var_type type) { return type != var_type; }
908
  bool check_update_type(Item_result type) { return 1; }
909
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
910
  {
911
    return (*value_ptr_func)(thd);
912
  }
913
  SHOW_TYPE show_type() { return show_type_value; }
914
  bool is_readonly() const { return 1; }
915
};
916
917
918
class sys_var_have_option: public sys_var
919
{
920
protected:
921
  virtual SHOW_COMP_OPTION get_option() = 0;
922
public:
923
  sys_var_have_option(sys_var_chain *chain, const char *variable_name):
924
    sys_var(variable_name)
925
  { chain_sys_var(chain); }
926
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
927
  {
928
    return (uchar*) show_comp_option_name[get_option()];
929
  }
930
  bool update(THD *thd, set_var *var) { return 1; }
931
  bool check_default(enum_var_type type) { return 1; }
932
  bool check_type(enum_var_type type) { return type != OPT_GLOBAL; }
933
  bool check_update_type(Item_result type) { return 1; }
934
  SHOW_TYPE show_type() { return SHOW_CHAR; }
935
  bool is_readonly() const { return 1; }
936
};
937
938
939
class sys_var_have_variable: public sys_var_have_option
940
{
941
  SHOW_COMP_OPTION *have_variable;
942
943
public:
944
  sys_var_have_variable(sys_var_chain *chain, const char *variable_name,
945
                        SHOW_COMP_OPTION *have_variable_arg):
946
    sys_var_have_option(chain, variable_name),
947
    have_variable(have_variable_arg)
948
  { }
949
  SHOW_COMP_OPTION get_option() { return *have_variable; }
950
};
951
952
953
class sys_var_have_plugin: public sys_var_have_option
954
{
955
  const char *plugin_name_str;
956
  const uint plugin_name_len;
957
  const int plugin_type;
958
959
public:
960
  sys_var_have_plugin(sys_var_chain *chain, const char *variable_name,
961
                      const char *plugin_name_str_arg, uint plugin_name_len_arg, 
962
                      int plugin_type_arg):
963
    sys_var_have_option(chain, variable_name), 
964
    plugin_name_str(plugin_name_str_arg), plugin_name_len(plugin_name_len_arg),
965
    plugin_type(plugin_type_arg)
966
  { }
967
  /* the following method is declared in sql_plugin.cc */
968
  SHOW_COMP_OPTION get_option();
969
};
970
971
972
class sys_var_thd_time_zone :public sys_var_thd
973
{
974
public:
975
  sys_var_thd_time_zone(sys_var_chain *chain, const char *name_arg,
976
                        Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
977
    :sys_var_thd(name_arg, NULL, binlog_status_arg)
978
  {
979
    no_support_one_shot= 0;
980
    chain_sys_var(chain);
981
  }
982
  bool check(THD *thd, set_var *var);
983
  SHOW_TYPE show_type() { return SHOW_CHAR; }
984
  bool check_update_type(Item_result type)
985
  {
986
    return type != STRING_RESULT;		/* Only accept strings */
987
  }
988
  bool check_default(enum_var_type type) { return 0; }
989
  bool update(THD *thd, set_var *var);
990
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
991
  virtual void set_default(THD *thd, enum_var_type type);
992
};
993
994
995
class sys_var_max_user_conn : public sys_var_thd
996
{
997
public:
998
  sys_var_max_user_conn(sys_var_chain *chain, const char *name_arg):
999
    sys_var_thd(name_arg)
1000
  { chain_sys_var(chain); }
1001
  bool check(THD *thd, set_var *var);
1002
  bool update(THD *thd, set_var *var);
1003
  bool check_default(enum_var_type type)
1004
  {
1005
    return type != OPT_GLOBAL || !option_limits;
1006
  }
1007
  void set_default(THD *thd, enum_var_type type);
1008
  SHOW_TYPE show_type() { return SHOW_INT; }
1009
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1010
};
1011
1012
1013
class sys_var_microseconds :public sys_var_thd
1014
{
1015
  ulonglong SV::*offset;
1016
public:
1017
  sys_var_microseconds(sys_var_chain *chain, const char *name_arg,
1018
                       ulonglong SV::*offset_arg):
1019
    sys_var_thd(name_arg), offset(offset_arg)
1020
  { chain_sys_var(chain); }
1021
  bool check(THD *thd, set_var *var) {return 0;}
1022
  bool update(THD *thd, set_var *var);
1023
  void set_default(THD *thd, enum_var_type type);
1024
  SHOW_TYPE show_type() { return SHOW_DOUBLE; }
1025
  bool check_update_type(Item_result type)
1026
  {
1027
    return (type != INT_RESULT && type != REAL_RESULT && type != DECIMAL_RESULT);
1028
  }
1029
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1030
};
1031
1032
1033
class sys_var_trust_routine_creators :public sys_var_bool_ptr
1034
{
1035
  /* We need a derived class only to have a warn_deprecated() */
1036
public:
1037
  sys_var_trust_routine_creators(sys_var_chain *chain,
1038
                                 const char *name_arg, my_bool *value_arg) :
1039
    sys_var_bool_ptr(chain, name_arg, value_arg) {};
1040
  void warn_deprecated(THD *thd);
1041
  void set_default(THD *thd, enum_var_type type);
1042
  bool update(THD *thd, set_var *var);
1043
};
1044
1045
/**
1046
  Handler for setting the system variable --read-only.
1047
*/
1048
1049
class sys_var_opt_readonly :public sys_var_bool_ptr
1050
{
1051
public:
1052
  sys_var_opt_readonly(sys_var_chain *chain, const char *name_arg, 
1053
                       my_bool *value_arg) :
1054
    sys_var_bool_ptr(chain, name_arg, value_arg) {};
1055
  ~sys_var_opt_readonly() {};
1056
  bool update(THD *thd, set_var *var);
1057
};
1058
1059
1060
class sys_var_thd_lc_time_names :public sys_var_thd
1061
{
1062
public:
1063
  sys_var_thd_lc_time_names(sys_var_chain *chain, const char *name_arg,
1064
                            Binlog_status_enum binlog_status_arg= NOT_IN_BINLOG)
1065
    : sys_var_thd(name_arg, NULL, binlog_status_arg)
1066
  {
1067
#if MYSQL_VERSION_ID < 50000
1068
    no_support_one_shot= 0;
1069
#endif
1070
    chain_sys_var(chain);
1071
  }
1072
  bool check(THD *thd, set_var *var);
1073
  SHOW_TYPE show_type() { return SHOW_CHAR; }
1074
  bool check_update_type(Item_result type)
1075
  {
1076
    return ((type != STRING_RESULT) && (type != INT_RESULT));
1077
  }
1078
  bool check_default(enum_var_type type) { return 0; }
1079
  bool update(THD *thd, set_var *var);
1080
  uchar *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
1081
  virtual void set_default(THD *thd, enum_var_type type);
1082
};
1083
1084
1085
extern void fix_binlog_format_after_update(THD *thd, enum_var_type type);
1086
1087
class sys_var_thd_binlog_format :public sys_var_thd_enum
1088
{
1089
public:
1090
  sys_var_thd_binlog_format(sys_var_chain *chain, const char *name_arg, 
1091
                            ulong SV::*offset_arg)
1092
    :sys_var_thd_enum(chain, name_arg, offset_arg,
1093
                      &binlog_format_typelib,
1094
                      fix_binlog_format_after_update)
1095
  {};
1096
  bool is_readonly() const;
1097
};
1098
1099
/****************************************************************************
1100
  Classes for parsing of the SET command
1101
****************************************************************************/
1102
1103
class set_var_base :public Sql_alloc
1104
{
1105
public:
1106
  set_var_base() {}
1107
  virtual ~set_var_base() {}
1108
  virtual int check(THD *thd)=0;	/* To check privileges etc. */
1109
  virtual int update(THD *thd)=0;	/* To set the value */
1110
  /* light check for PS */
1111
  virtual bool no_support_one_shot() { return 1; }
1112
};
1113
1114
1115
/* MySQL internal variables, like query_cache_size */
1116
1117
class set_var :public set_var_base
1118
{
1119
public:
1120
  sys_var *var;
1121
  Item *value;
1122
  enum_var_type type;
1123
  union
1124
  {
1125
    CHARSET_INFO *charset;
1126
    ulong ulong_value;
1127
    ulonglong ulonglong_value;
1128
    plugin_ref plugin;
1129
    DATE_TIME_FORMAT *date_time_format;
1130
    Time_zone *time_zone;
1131
    MY_LOCALE *locale_value;
1132
  } save_result;
1133
  LEX_STRING base;			/* for structs */
1134
1135
  set_var(enum_var_type type_arg, sys_var *var_arg,
1136
          const LEX_STRING *base_name_arg, Item *value_arg)
1137
    :var(var_arg), type(type_arg), base(*base_name_arg)
1138
  {
1139
    /*
1140
      If the set value is a field, change it to a string to allow things like
1141
      SET table_type=MYISAM;
1142
    */
1143
    if (value_arg && value_arg->type() == Item::FIELD_ITEM)
1144
    {
1145
      Item_field *item= (Item_field*) value_arg;
1146
      if (!(value=new Item_string(item->field_name, 
1147
                  (uint) strlen(item->field_name),
1148
				  item->collation.collation)))
1149
	value=value_arg;			/* Give error message later */
1150
    }
1151
    else
1152
      value=value_arg;
1153
  }
1154
  int check(THD *thd);
1155
  int update(THD *thd);
1156
  bool no_support_one_shot() { return var->no_support_one_shot; }
1157
};
1158
1159
1160
/* User variables like @my_own_variable */
1161
1162
class set_var_user: public set_var_base
1163
{
1164
  Item_func_set_user_var *user_var_item;
1165
public:
1166
  set_var_user(Item_func_set_user_var *item)
1167
    :user_var_item(item)
1168
  {}
1169
  int check(THD *thd);
1170
  int update(THD *thd);
1171
};
1172
1173
/* For SET NAMES and SET CHARACTER SET */
1174
1175
class set_var_collation_client: public set_var_base
1176
{
1177
  CHARSET_INFO *character_set_client;
1178
  CHARSET_INFO *character_set_results;
1179
  CHARSET_INFO *collation_connection;
1180
public:
1181
  set_var_collation_client(CHARSET_INFO *client_coll_arg,
1182
  			   CHARSET_INFO *connection_coll_arg,
1183
  			   CHARSET_INFO *result_coll_arg)
1184
    :character_set_client(client_coll_arg),
1185
     character_set_results(result_coll_arg),
1186
     collation_connection(connection_coll_arg)
1187
  {}
1188
  int check(THD *thd);
1189
  int update(THD *thd);
1190
};
1191
1192
1193
extern "C"
1194
{
1195
  typedef int (*process_key_cache_t) (const char *, KEY_CACHE *);
1196
}
1197
1198
/* Named lists (used for keycaches) */
1199
1200
class NAMED_LIST :public ilink
1201
{
1202
  const char *name;
1203
  uint name_length;
1204
public:
1205
  uchar* data;
1206
1207
  NAMED_LIST(I_List<NAMED_LIST> *links, const char *name_arg,
1208
	     uint name_length_arg, uchar* data_arg)
1209
    :name_length(name_length_arg), data(data_arg)
1210
  {
1211
    name= my_strndup(name_arg, name_length, MYF(MY_WME));
1212
    links->push_back(this);
1213
  }
1214
  inline bool cmp(const char *name_cmp, uint length)
1215
  {
1216
    return length == name_length && !memcmp(name, name_cmp, length);
1217
  }
1218
  ~NAMED_LIST()
1219
  {
1220
    my_free((uchar*) name, MYF(0));
1221
  }
1222
  friend bool process_key_caches(process_key_cache_t func);
1223
  friend void delete_elements(I_List<NAMED_LIST> *list,
1224
			      void (*free_element)(const char*, uchar*));
1225
};
1226
1227
/* updated in sql_acl.cc */
1228
1229
extern sys_var_thd_bool sys_old_alter_table;
1230
extern sys_var_thd_bool sys_old_passwords;
1231
extern LEX_STRING default_key_cache_base;
1232
1233
/* For sql_yacc */
1234
struct sys_var_with_base
1235
{
1236
  sys_var *var;
1237
  LEX_STRING base_name;
1238
};
1239
1240
/*
1241
  Prototypes for helper functions
1242
*/
1243
1244
int set_var_init();
1245
void set_var_free();
1246
int mysql_append_static_vars(const SHOW_VAR *show_vars, uint count);
1247
SHOW_VAR* enumerate_sys_vars(THD *thd, bool sorted);
1248
int mysql_add_sys_var_chain(sys_var *chain, struct my_option *long_options);
1249
int mysql_del_sys_var_chain(sys_var *chain);
1250
sys_var *find_sys_var(THD *thd, const char *str, uint length=0);
1251
int sql_set_variables(THD *thd, List<set_var_base> *var_list);
1252
bool not_all_support_one_shot(List<set_var_base> *var_list);
1253
void fix_delay_key_write(THD *thd, enum_var_type type);
1254
void fix_slave_exec_mode(enum_var_type type);
1255
ulong fix_sql_mode(ulong sql_mode);
1256
extern sys_var_const_str sys_charset_system;
1257
extern sys_var_str sys_init_connect;
1258
extern sys_var_str sys_init_slave;
1259
extern sys_var_thd_time_zone sys_time_zone;
1260
extern sys_var_thd_bit sys_autocommit;
1261
CHARSET_INFO *get_old_charset_by_name(const char *old_name);
1262
uchar* find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
1263
		NAMED_LIST **found);
1264
1265
extern sys_var_str sys_var_general_log_path, sys_var_slow_log_path;
1266
1267
/* key_cache functions */
1268
KEY_CACHE *get_key_cache(LEX_STRING *cache_name);
1269
KEY_CACHE *get_or_create_key_cache(const char *name, uint length);
1270
void free_key_cache(const char *name, KEY_CACHE *key_cache);
1271
bool process_key_caches(process_key_cache_t func);
1272
void delete_elements(I_List<NAMED_LIST> *list,
1273
		     void (*free_element)(const char*, uchar*));