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

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 <common/StmtArea.hpp>
  14. #include <dictionary/DictTable.hpp>
  15. #include <dictionary/DictColumn.hpp>
  16. #include "Code_query_lookup.hpp"
  17. #include "Code_column.hpp"
  18. #include "Code_expr.hpp"
  19. #include "Code_root.hpp"
  20. // Plan_query_lookup
  21. Plan_query_lookup::~Plan_query_lookup()
  22. {
  23. }
  24. Plan_base*
  25. Plan_query_lookup::analyze(Ctx& ctx, Ctl& ctl)
  26. {
  27.     ctx_assert(m_table != 0);
  28.     m_table->analyze(ctx, ctl);
  29.     if (! ctx.ok())
  30. return 0;
  31.     return this;
  32. }
  33. Exec_base*
  34. Plan_query_lookup::codegen(Ctx& ctx, Ctl& ctl)
  35. {
  36.     // set up
  37.     ctx_assert(m_table != 0);
  38.     const BaseString& tableName = m_table->getName();
  39.     const DictTable& dictTable = m_table->dictTable();
  40.     const unsigned keyCount = dictTable.keyCount();
  41.     const ColumnVector& columns = m_table->exprColumns();
  42.     ctx_assert(columns.size() > 0);
  43.     const unsigned attrCount = columns.size() - 1;
  44.     // create the code
  45.     Exec_query_lookup::Code& code = *new Exec_query_lookup::Code(keyCount, attrCount);
  46.     code.m_tableName = strcpy(new char[tableName.length() + 1], tableName.c_str());
  47.     // key attributes
  48.     code.m_keyId = new NdbAttrId[1 + keyCount];
  49.     code.m_keyId[0] = (NdbAttrId)-1;
  50.     for (unsigned k = 1; k <= keyCount; k++) {
  51. const DictColumn* keyColumn = dictTable.getKey(k);
  52. const SqlType& sqlType = keyColumn->sqlType();
  53. SqlSpec sqlSpec(sqlType, SqlSpec::Physical);
  54. code.m_keySpecs.setEntry(k, sqlSpec);
  55. code.m_keyId[k] = keyColumn->getAttrId();
  56.     }
  57.     // matching expressions
  58.     const Plan_table::Index& index = m_table->m_indexList[0];
  59.     ctx_assert(index.m_keyFound);
  60.     const ExprVector& keyEq = index.m_keyEq;
  61.     ctx_assert(keyEq.size() == 1 + keyCount);
  62.     code.m_keyMatch = new Exec_expr* [1 + keyCount];
  63.     code.m_keyMatch[0] = 0;
  64.     for (unsigned k = 1; k <= keyCount; k++) {
  65. Plan_expr* expr = keyEq[k];
  66. Exec_expr* execExpr = static_cast<Exec_expr*>(expr->codegen(ctx, ctl));
  67. if (! ctx.ok())
  68.     return 0;
  69. ctx_assert(execExpr != 0);
  70. code.m_keyMatch[k] = execExpr;
  71.     }
  72.     // queried attributes
  73.     code.m_attrId = new NdbAttrId[1 + attrCount];
  74.     code.m_attrId[0] = (NdbAttrId)-1;
  75.     for (unsigned i = 1; i <= attrCount; i++) {
  76. Plan_column* column = columns[i];
  77. ctx_assert(column != 0);
  78. const DictColumn& dictColumn = column->dictColumn();
  79. const SqlType& sqlType = dictColumn.sqlType();
  80. SqlSpec sqlSpec(sqlType, SqlSpec::Physical);
  81. code.m_sqlSpecs.setEntry(i, sqlSpec);
  82. code.m_attrId[i] = dictColumn.getAttrId();
  83.     }
  84.     // create the exec
  85.     Exec_query_lookup* exec = new Exec_query_lookup(ctl.m_execRoot);
  86.     ctl.m_execRoot->saveNode(exec);
  87.     exec->setCode(code);
  88.     return exec;
  89. }
  90. void
  91. Plan_query_lookup::print(Ctx& ctx)
  92. {
  93.     ctx.print(" [query_lookup");
  94.     Plan_base* a[] = { m_table };
  95.     printList(ctx, a, 1);
  96.     ctx.print("]");
  97. }
  98. // Exec_query_lookup
  99. Exec_query_lookup::Code::~Code()
  100. {
  101.     delete[] m_tableName;
  102.     delete[] m_keyId;
  103.     delete[] m_keyMatch;
  104.     delete[] m_attrId;
  105. }
  106. Exec_query_lookup::Data::~Data()
  107. {
  108.     delete[] m_recAttr;
  109. }
  110. Exec_query_lookup::~Exec_query_lookup()
  111. {
  112. }
  113. void
  114. Exec_query_lookup::alloc(Ctx& ctx, Ctl& ctl)
  115. {
  116.     const Code& code = getCode();
  117.     // create data
  118.     Data& data = *new Data(this, code.sqlSpecs());
  119.     setData(data);
  120.     // allocate matching expressions
  121.     for (unsigned k = 1; k <= code.m_keyCount; k++) {
  122. Exec_expr* expr = code.m_keyMatch[k];
  123. ctx_assert(expr != 0);
  124. expr->alloc(ctx, ctl);
  125. if (! ctx.ok())
  126.     return;
  127.     }
  128.     // needed for isNULL
  129.     data.m_recAttr = new NdbRecAttr* [1 + code.m_attrCount];
  130.     for (unsigned i = 0; i <= code.m_attrCount; i++) {
  131. data.m_recAttr[i] = 0;
  132.     }
  133. }
  134. void
  135. Exec_query_lookup::close(Ctx& ctx)
  136. {
  137.     Data& data = getData();
  138.     if (data.m_con != 0) {
  139. Ndb* const ndb = ndbObject();
  140. ndb->closeTransaction(data.m_con);
  141. data.m_con = 0;
  142. data.m_op = 0;
  143. data.m_done = true;
  144. ctx_log2(("lookup closed at statement close"));
  145.     }
  146. }
  147. void
  148. Exec_query_lookup::print(Ctx& ctx)
  149. {
  150.     ctx.print(" [query_lookup");
  151.     if (m_code != 0) {
  152. const Code& code = getCode();
  153. ctx.print(" keyId=");
  154. for (unsigned i = 1; i <= code.m_keyCount; i++) {
  155.     if (i > 1)
  156. ctx.print(",");
  157.     ctx.print("%u", (unsigned)code.m_keyId[i]);
  158. }
  159. ctx.print(" attrId=");
  160. for (unsigned i = 1; i <= code.m_attrCount; i++) {
  161.     if (i > 1)
  162. ctx.print(",");
  163.     ctx.print("%u", (unsigned)code.m_attrId[i]);
  164. }
  165. ctx.print(" table=%s", code.m_tableName);
  166.     }
  167.     ctx.print("]");
  168. }