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

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.hpp"
  14. #include "Code_expr_conv.hpp"
  15. #include "Code_root.hpp"
  16. // Plan_expr_conv
  17. Plan_expr_conv::~Plan_expr_conv()
  18. {
  19. }
  20. Plan_base*
  21. Plan_expr_conv::analyze(Ctx& ctx, Ctl& ctl)
  22. {
  23.     m_exec = 0;
  24.     const SqlType& t1 = sqlType();
  25.     ctx_assert(m_expr != 0);
  26.     m_expr->analyze(ctx, ctl);
  27.     if (! ctx.ok())
  28. return 0;
  29.     const SqlType& t2 = m_expr->sqlType();
  30.     if (t2.type() == SqlType::Unbound) {
  31. return m_expr;
  32.     }
  33.     if (t1.equal(t2)) {
  34. return m_expr;
  35.     }
  36.     // XXX move to runtime or make table-driven
  37.     bool ok = false;
  38.     if (t2.type() == SqlType::Null) {
  39. ok = true;
  40.     } else if (t1.type() == SqlType::Char) {
  41. if (t2.type() == SqlType::Char) {
  42.     ok = true;
  43. } else if (t2.type() == SqlType::Varchar) {
  44.     ok = true;
  45. } else if (t2.type() == SqlType::Binary) {
  46.     ok = true;
  47. } else if (t2.type() == SqlType::Varbinary) {
  48.     ok = true;
  49. }
  50.     } else if (t1.type() == SqlType::Varchar) {
  51. if (t2.type() == SqlType::Char) {
  52.     ok = true;
  53. } else if (t2.type() == SqlType::Varchar) {
  54.     ok = true;
  55. } else if (t2.type() == SqlType::Binary) {
  56.     ok = true;
  57. } else if (t2.type() == SqlType::Varbinary) {
  58.     ok = true;
  59. }
  60.     } else if (t1.type() == SqlType::Binary) {
  61. if (t2.type() == SqlType::Char) {
  62.     ok = true;
  63. } else if (t2.type() == SqlType::Varchar) {
  64.     ok = true;
  65. } else if (t2.type() == SqlType::Binary) {
  66.     ok = true;
  67. } else if (t2.type() == SqlType::Varbinary) {
  68.     ok = true;
  69. }
  70.     } else if (t1.type() == SqlType::Varbinary) {
  71. if (t2.type() == SqlType::Char) {
  72.     ok = true;
  73. } else if (t2.type() == SqlType::Varchar) {
  74.     ok = true;
  75. } else if (t2.type() == SqlType::Binary) {
  76.     ok = true;
  77. } else if (t2.type() == SqlType::Varbinary) {
  78.     ok = true;
  79. }
  80.     } else if (t1.type() == SqlType::Smallint) {
  81. if (t2.type() == SqlType::Smallint) {
  82.     ok = true;
  83. } else if (t2.type() == SqlType::Integer) {
  84.     ok = true;
  85. } else if (t2.type() == SqlType::Bigint) {
  86.     ok = true;
  87. } else if (t2.type() == SqlType::Real) {
  88.     ok = true;
  89. } else if (t2.type() == SqlType::Double) {
  90.     ok = true;
  91. }
  92.     } else if (t1.type() == SqlType::Integer) {
  93. if (t2.type() == SqlType::Smallint) {
  94.     ok = true;
  95. } else if (t2.type() == SqlType::Integer) {
  96.     ok = true;
  97. } else if (t2.type() == SqlType::Bigint) {
  98.     ok = true;
  99. } else if (t2.type() == SqlType::Real) {
  100.     ok = true;
  101. } else if (t2.type() == SqlType::Double) {
  102.     ok = true;
  103. }
  104.     } else if (t1.type() == SqlType::Bigint) {
  105. if (t2.type() == SqlType::Smallint) {
  106.     ok = true;
  107. } else if (t2.type() == SqlType::Integer) {
  108.     ok = true;
  109. } else if (t2.type() == SqlType::Bigint) {
  110.     ok = true;
  111. } else if (t2.type() == SqlType::Real) {
  112.     ok = true;
  113. } else if (t2.type() == SqlType::Double) {
  114.     ok = true;
  115. }
  116.     } else if (t1.type() == SqlType::Real) {
  117. if (t2.type() == SqlType::Smallint) {
  118.     ok = true;
  119. } else if (t2.type() == SqlType::Integer) {
  120.     ok = true;
  121. } else if (t2.type() == SqlType::Bigint) {
  122.     ok = true;
  123. } else if (t2.type() == SqlType::Real) {
  124.     ok = true;
  125. } else if (t2.type() == SqlType::Double) {
  126.     ok = true;
  127. }
  128.     } else if (t1.type() == SqlType::Double) {
  129. if (t2.type() == SqlType::Smallint) {
  130.     ok = true;
  131. } else if (t2.type() == SqlType::Integer) {
  132.     ok = true;
  133. } else if (t2.type() == SqlType::Bigint) {
  134.     ok = true;
  135. } else if (t2.type() == SqlType::Real) {
  136.     ok = true;
  137. } else if (t2.type() == SqlType::Double) {
  138.     ok = true;
  139. }
  140.     } else if (t1.type() == SqlType::Datetime) {
  141. if (t2.type() == SqlType::Datetime) {
  142.     ok = true;
  143. }
  144.     }
  145.     if (! ok) {
  146. char b1[40], b2[40];
  147. t1.print(b1, sizeof(b1));
  148. t2.print(b2, sizeof(b2));
  149. ctx.pushStatus(Error::Gen, "cannot convert %s to %s", b2, b1);
  150. return 0;
  151.     }
  152.     // depend on same tables
  153.     const TableSet& ts = m_expr->tableSet();
  154.     m_tableSet.insert(ts.begin(), ts.end());
  155.     // set alias
  156.     m_alias = m_expr->getAlias();
  157.     return this;
  158. }
  159. Exec_base*
  160. Plan_expr_conv::codegen(Ctx& ctx, Ctl& ctl)
  161. {
  162.     if (m_exec != 0)
  163. return m_exec;
  164.     Exec_expr_conv* exec = new Exec_expr_conv(ctl.m_execRoot);
  165.     ctl.m_execRoot->saveNode(exec);
  166.     // create code for subexpression
  167.     ctx_assert(m_expr != 0);
  168.     Exec_expr* execExpr = static_cast<Exec_expr*>(m_expr->codegen(ctx, ctl));
  169.     if (! ctx.ok())
  170. return 0;
  171.     exec->setExpr(execExpr);
  172.     // create the code
  173.     SqlSpec sqlSpec(sqlType(), SqlSpec::Physical);
  174.     Exec_expr_conv::Code& code = *new Exec_expr_conv::Code(sqlSpec);
  175.     exec->setCode(code);
  176.     m_exec = exec;
  177.     return exec;
  178. }
  179. void
  180. Plan_expr_conv::print(Ctx& ctx)
  181. {
  182.     ctx.print(" [expr_conv ");
  183.     char buf[100];
  184.     m_sqlType.print(buf, sizeof(buf));
  185.     ctx.print("%s", buf);
  186.     Plan_base* a[] = { m_expr };
  187.     printList(ctx, a, 1);
  188.     ctx.print("]");
  189. }
  190. bool
  191. Plan_expr_conv::isEqual(const Plan_expr* expr) const
  192. {
  193.     ctx_assert(expr != 0);
  194.     if (expr->type() != Plan_expr::TypeConv)
  195. return false;
  196.     const Plan_expr_conv* expr2 = static_cast<const Plan_expr_conv*>(expr);
  197.     if (! m_sqlType.equal(expr2->m_sqlType))
  198. return false;
  199.     ctx_assert(m_expr != 0 && expr2->m_expr != 0);
  200.     if (! m_expr->isEqual(expr2->m_expr))
  201. return false;
  202.     return true;
  203. }
  204. bool
  205. Plan_expr_conv::isGroupBy(const Plan_expr_row* row) const
  206. {
  207.     if (isAnyEqual(row))
  208. return true;
  209.     ctx_assert(m_expr != 0);
  210.     if (m_expr->isGroupBy(row))
  211. return true;
  212.     return false;
  213. }
  214. // Code_expr_conv
  215. Exec_expr_conv::Code::~Code()
  216. {
  217. }
  218. Exec_expr_conv::Data::~Data()
  219. {
  220. }
  221. Exec_expr_conv::~Exec_expr_conv()
  222. {
  223. }
  224. void
  225. Exec_expr_conv::alloc(Ctx& ctx, Ctl& ctl)
  226. {
  227.     if (m_data != 0)
  228. return;
  229.     const Code& code = getCode();
  230.     // allocate subexpression
  231.     ctx_assert(m_expr != 0);
  232.     m_expr->alloc(ctx, ctl);
  233.     if (! ctx.ok())
  234. return;
  235.     SqlField sqlField(code.m_sqlSpec);
  236.     Data& data = *new Data(sqlField);
  237.     setData(data);
  238. }
  239. void
  240. Exec_expr_conv::close(Ctx& ctx)
  241. {
  242.     ctx_assert(m_expr != 0);
  243.     m_expr->close(ctx);
  244.     Data& data = getData();
  245.     data.m_groupField.clear();
  246. }
  247. void
  248. Exec_expr_conv::print(Ctx& ctx)
  249. {
  250.     const Code& code = getCode();
  251.     ctx.print(" [expr_conv");
  252.     Exec_base* a[] = { m_expr };
  253.     printList(ctx, a, sizeof(a)/sizeof(a[0]));
  254.     ctx.print("]");
  255. }