~drizzle-trunk/drizzle/development

584.4.4 by Monty Taylor
Split out Name_resolution_context.
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 Sun Microsystems
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; version 2 of the License.
9
 *
10
 *  This program is distributed in the hope that it will be useful,
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 *  GNU General Public License for more details.
14
 *
15
 *  You should have received a copy of the GNU General Public License
16
 *  along with this program; if not, write to the Free Software
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
 */
19
20
#ifndef DRIZZLED_NAME_RESOLUTION_CONTEXT_H
21
#define DRIZZLED_NAME_RESOLUTION_CONTEXT_H
22
23
class TableList;
584.1.13 by Monty Taylor
Split out a little more code. Removed table_list.h from common_includes.
24
class Security_context;
584.4.4 by Monty Taylor
Split out Name_resolution_context.
25
class Session;
26
class st_select_lex;
27
28
/*
29
  Instances of Name_resolution_context store the information necesary for
30
  name resolution of Items and other context analysis of a query made in
31
  fix_fields().
32
33
  This structure is a part of SELECT_LEX, a pointer to this structure is
34
  assigned when an item is created (which happens mostly during  parsing
35
  (sql_yacc.yy)), but the structure itself will be initialized after parsing
36
  is complete
37
38
  TODO: move subquery of INSERT ... SELECT and CREATE ... SELECT to
39
  separate SELECT_LEX which allow to remove tricks of changing this
40
  structure before and after INSERT/CREATE and its SELECT to make correct
41
  field name resolution.
42
*/
43
44
class Name_resolution_context: public Sql_alloc
45
{
46
public:
47
  /*
48
    The name resolution context to search in when an Item cannot be
49
    resolved in this context (the context of an outer select)
50
  */
51
  Name_resolution_context *outer_context;
52
53
  /*
54
    List of tables used to resolve the items of this context.  Usually these
55
    are tables from the FROM clause of SELECT statement.  The exceptions are
56
    INSERT ... SELECT and CREATE ... SELECT statements, where SELECT
57
    subquery is not moved to a separate SELECT_LEX.  For these types of
58
    statements we have to change this member dynamically to ensure correct
59
    name resolution of different parts of the statement.
60
  */
61
  TableList *table_list;
62
  /*
63
    In most cases the two table references below replace 'table_list' above
64
    for the purpose of name resolution. The first and last name resolution
65
    table references allow us to search only in a sub-tree of the nested
66
    join tree in a FROM clause. This is needed for NATURAL JOIN, JOIN ... USING
67
    and JOIN ... ON.
68
  */
69
  TableList *first_name_resolution_table;
70
  /*
71
    Last table to search in the list of leaf table references that begins
72
    with first_name_resolution_table.
73
  */
74
  TableList *last_name_resolution_table;
75
76
  /*
77
    SELECT_LEX item belong to, in case of merged VIEW it can differ from
78
    SELECT_LEX where item was created, so we can't use table_list/field_list
79
    from there
80
  */
81
  st_select_lex *select_lex;
82
83
  /*
84
    Processor of errors caused during Item name resolving, now used only to
85
    hide underlying tables in errors about views (i.e. it substitute some
86
    errors for views)
87
  */
88
  void (*error_processor)(Session *, void *);
89
  void *error_processor_data;
90
91
  /*
92
    When true items are resolved in this context both against the
93
    SELECT list and this->table_list. If false, items are resolved
94
    only against this->table_list.
95
  */
96
  bool resolve_in_select_list;
97
98
  /*
99
    Security context of this name resolution context. It's used for views
100
    and is non-zero only if the view is defined with SQL SECURITY DEFINER.
101
  */
102
  Security_context *security_ctx;
103
104
  Name_resolution_context()
105
    :outer_context(0), table_list(0), select_lex(0),
106
     error_processor_data(0),
107
     security_ctx(0)
108
    {}
109
110
  void init()
111
    {
112
      resolve_in_select_list= false;
113
      error_processor= &dummy_error_processor;
114
      first_name_resolution_table= NULL;
115
      last_name_resolution_table= NULL;
116
    }
117
118
  void resolve_in_table_list_only(TableList *tables)
119
    {
120
      table_list= first_name_resolution_table= tables;
121
      resolve_in_select_list= false;
122
    }
123
124
  void process_error(Session *session)
125
    {
126
      (*error_processor)(session, error_processor_data);
127
    }
128
};
129
130
#endif /* DRIZZLED_NAME_RESOLUTION_CONTEXT_H */