Code_expr_const.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "Code_expr_const.hpp"
  14. #include "Code_root.hpp"
  15. // Plan_expr_const
  16. Plan_expr_const::~Plan_expr_const()
  17. {
  18. }
  19. Plan_base*
  20. Plan_expr_const::analyze(Ctx& ctx, Ctl& ctl)
  21. {
  22.     m_exec = 0;
  23.     // convert data type
  24.     m_lexType.convert(ctx, m_sqlType, m_string.length());
  25.     if (! ctx.ok())
  26. return 0;
  27.     // depends on no tables
  28.     // set alias name
  29.     m_alias = m_string;
  30.     // node was not changed
  31.     return this;
  32. }
  33. Exec_base*
  34. Plan_expr_const::codegen(Ctx& ctx, Ctl& ctl)
  35. {
  36.     if (m_exec != 0)
  37. return m_exec;
  38.     // convert data
  39.     SqlSpec sqlSpec(m_sqlType, SqlSpec::Physical);
  40.     SqlField sqlField(sqlSpec);
  41.     LexSpec lexSpec(m_lexType);
  42.     lexSpec.convert(ctx, m_string, sqlField);
  43.     if (! ctx.ok())
  44. return 0;
  45.     // create code
  46.     Exec_expr_const* exec = new Exec_expr_const(ctl.m_execRoot);
  47.     ctl.m_execRoot->saveNode(exec);
  48.     Exec_expr_const::Code& code = *new Exec_expr_const::Code(sqlField);
  49.     exec->setCode(code);
  50.     m_exec = exec;
  51.     return exec;
  52. }
  53. void
  54. Plan_expr_const::print(Ctx& ctx)
  55. {
  56.     ctx.print(" [const %s]", m_string.c_str());
  57. }
  58. bool
  59. Plan_expr_const::isEqual(const Plan_expr* expr) const
  60. {
  61.     ctx_assert(expr != 0);
  62.     if (expr->type() != Plan_expr::TypeConst)
  63. return false;
  64.     const Plan_expr_const* expr2 = static_cast<const Plan_expr_const*>(expr);
  65.     if (strcmp(m_string.c_str(), expr2->m_string.c_str()) != 0)
  66. return false;
  67.     return true;
  68. }
  69. bool
  70. Plan_expr_const::isGroupBy(const Plan_expr_row* row) const
  71. {
  72.     return true;
  73. }
  74. // Exec_expr_const
  75. Exec_expr_const::Code::~Code()
  76. {
  77. }
  78. Exec_expr_const::Data::~Data()
  79. {
  80. }
  81. Exec_expr_const::~Exec_expr_const()
  82. {
  83. }
  84. void
  85. Exec_expr_const::alloc(Ctx& ctx, Ctl& ctl)
  86. {
  87.     if (m_data != 0)
  88. return;
  89.     // copy the value for const correctness reasons
  90.     SqlField sqlField(getCode().m_sqlField);
  91.     Data& data = *new Data(sqlField);
  92.     setData(data);
  93. }
  94. void
  95. Exec_expr_const::evaluate(Ctx& ctx, Ctl& ctl)
  96. {
  97.     const Code& code = getCode();
  98.     Data& data = getData();
  99.     if (ctl.m_groupIndex != 0) {
  100. SqlField& out = data.groupField(code.sqlSpec().sqlType(), ctl.m_groupIndex, ctl.m_groupInit);
  101. data.sqlField().copy(ctx, out);
  102.     }
  103. }
  104. void
  105. Exec_expr_const::close(Ctx& ctx)
  106. {
  107.     Data& data = getData();
  108.     data.m_groupField.clear();
  109. }
  110. void
  111. Exec_expr_const::print(Ctx& ctx)
  112. {
  113.     const Code& code = getCode();
  114.     ctx.print(" [");
  115.     char buf[500];
  116.     code.m_sqlField.print(buf, sizeof(buf));
  117.     ctx.print("%s", buf);
  118.     ctx.print("]");
  119. }