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

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_query_project.hpp"
  14. #include "Code_root.hpp"
  15. // Plan_query_project
  16. Plan_query_project::~Plan_query_project()
  17. {
  18. }
  19. Plan_base*
  20. Plan_query_project::analyze(Ctx& ctx, Ctl& ctl)
  21. {
  22.     ctx_assert(m_query != 0);
  23.     m_query->analyze(ctx, ctl);
  24.     if (! ctx.ok())
  25. return 0;
  26.     ctx_assert(m_exprRow != 0);
  27.     ctl.m_aggrok = true;
  28.     ctl.m_aggrin = false;
  29.     m_exprRow->analyze(ctx, ctl);
  30.     ctl.m_aggrok = false;
  31.     if (! ctx.ok())
  32. return 0;
  33.     return this;
  34. }
  35. Plan_expr_row*
  36. Plan_query_project::getRow()
  37. {
  38.     ctx_assert(m_exprRow != 0);
  39.     return m_exprRow;
  40. }
  41. Exec_base*
  42. Plan_query_project::codegen(Ctx& ctx, Ctl& ctl)
  43. {
  44.     // create code for the subquery
  45.     ctx_assert(m_query != 0);
  46.     Exec_query* execQuery = static_cast<Exec_query*>(m_query->codegen(ctx, ctl));
  47.     if (! ctx.ok())
  48. return 0;
  49.     ctx_assert(execQuery != 0);
  50.     // create code for the row based on query code
  51.     ctx_assert(m_exprRow != 0);
  52.     ctl.m_execQuery = execQuery;
  53.     Exec_expr_row* execRow = static_cast<Exec_expr_row*>(m_exprRow->codegen(ctx, ctl));
  54.     if (! ctx.ok())
  55. return 0;
  56.     ctx_assert(execRow != 0);
  57.     Exec_query_project* exec = new Exec_query_project(ctl.m_execRoot);
  58.     ctl.m_execRoot->saveNode(exec);
  59.     // re-use SqlSpecs from the row
  60.     const SqlSpecs& sqlSpecs = execRow->getCode().sqlSpecs();
  61.     Exec_query_project::Code& code = *new Exec_query_project::Code(sqlSpecs);
  62.     code.m_limitOff = m_limitOff;
  63.     code.m_limitCnt = m_limitCnt;
  64.     exec->setCode(code);
  65.     exec->setQuery(execQuery);
  66.     exec->setRow(execRow);
  67.     return exec;
  68. }
  69. void
  70. Plan_query_project::print(Ctx& ctx)
  71. {
  72.     ctx.print(" [query_project");
  73.     Plan_base* a[] = { m_query, m_exprRow };
  74.     printList(ctx, a, 2);
  75.     ctx.print("]");
  76. }
  77. // Exec_query_project
  78. Exec_query_project::Code::~Code()
  79. {
  80. }
  81. Exec_query_project::Data::~Data()
  82. {
  83. }
  84. Exec_query_project::~Exec_query_project()
  85. {
  86. }
  87. const Exec_query*
  88. Exec_query_project::getRawQuery() const
  89. {
  90.     ctx_assert(m_query != 0);
  91.     return m_query;
  92. }
  93. void
  94. Exec_query_project::alloc(Ctx& ctx, Ctl& ctl)
  95. {
  96.     // allocate the subquery
  97.     ctx_assert(m_query != 0);
  98.     m_query->alloc(ctx, ctl);
  99.     if (! ctx.ok())
  100. return;
  101.     // allocate the row based on subquery data
  102.     ctx_assert(m_exprRow != 0);
  103.     ctl.m_query = m_query;
  104.     m_exprRow->alloc(ctx, ctl);
  105.     if (! ctx.ok())
  106. return;
  107.     // re-use SqlRow from the expression row
  108.     const SqlRow& sqlRow = m_exprRow->getData().sqlRow();
  109.     Data& data = *new Data(this, sqlRow);
  110.     setData(data);
  111. }
  112. void
  113. Exec_query_project::execImpl(Ctx& ctx, Ctl& ctl)
  114. {
  115.     ctx_assert(m_query != 0);
  116.     m_query->execute(ctx, ctl);
  117. }
  118. bool
  119. Exec_query_project::fetchImpl(Ctx& ctx, Ctl& ctl)
  120. {
  121.     const Code& code = getCode();
  122.     Data& data = getData();
  123.     ctx_assert(m_query != 0);
  124.     while (1) {
  125. if (! m_query->fetch(ctx, ctl))
  126.     return false;
  127. ctx_assert(m_exprRow != 0);
  128. m_exprRow->evaluate(ctx, ctl);
  129. if (! ctx.ok())
  130.     return false;
  131. ctl.m_postEval = true;
  132. m_exprRow->evaluate(ctx, ctl);
  133. ctl.m_postEval = false;
  134. const int n = ++data.m_cnt;
  135. const int o = code.m_limitOff <= 0 ? 0 : code.m_limitOff;
  136. const int c = code.m_limitCnt;
  137. if (n <= o)
  138.     continue;
  139. if (c < 0)
  140.     break;
  141. if (n - o <= c)
  142.     break;
  143. return false;
  144.     }
  145.     return true;
  146. }
  147. void
  148. Exec_query_project::close(Ctx& ctx)
  149. {
  150.     Data& data = getData();
  151.     data.m_cnt = 0;
  152.     ctx_assert(m_query != 0);
  153.     m_query->close(ctx);
  154.     ctx_assert(m_exprRow != 0);
  155.     m_exprRow->close(ctx);
  156. }
  157. void
  158. Exec_query_project::print(Ctx& ctx)
  159. {
  160.     ctx.print(" [query_project");
  161.     Exec_base* a[] = { m_query, m_exprRow };
  162.     printList(ctx, a, 2);
  163.     ctx.print("]");
  164. }