Exec_expr_op.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 <codegen/Code_expr_op.hpp>
  14. void
  15. Exec_expr_op::evaluate(Ctx& ctx, Ctl& ctl)
  16. {
  17.     const Code& code = getCode();
  18.     Data& data = getData();
  19.     const SqlType& t = code.sqlSpec().sqlType();
  20.     SqlField& f = ctl.m_groupIndex == 0 ? data.m_sqlField : data.groupField(code.sqlSpec().sqlType(), ctl.m_groupIndex, ctl.m_groupInit);
  21.     if (code.m_op.arity() == 1) {
  22. // evaluate sub-expression
  23. ctx_assert(m_expr[1] != 0);
  24. m_expr[1]->evaluate(ctx, ctl);
  25. if (! ctx.ok())
  26.     return;
  27. if (ctl.m_postEval)
  28.     return;
  29. const SqlField& f1 = ctl.m_groupIndex == 0 ? m_expr[1]->getData().sqlField() : m_expr[1]->getData().groupField(ctl.m_groupIndex);
  30. // handle null
  31. if (f1.sqlNull()) {
  32.     f.sqlNull(true);
  33.     return;
  34. }
  35. if (t.type() == SqlType::Bigint) {
  36.     SqlBigint v = 0;
  37.     SqlBigint v1 = f1.sqlBigint();
  38.     switch (code.m_op.m_opcode) {
  39.     case Expr_op::Plus:
  40. v = v1;
  41. break;
  42.     case Expr_op::Minus:
  43. v = - v1;
  44. break;
  45.     default:
  46. ctx_assert(false);
  47. break;
  48.     }
  49.     f.sqlBigint(v);
  50. } else if (t.type() == SqlType::Double) {
  51.     SqlDouble v = 0;
  52.     SqlDouble v1 = f1.sqlDouble();
  53.     switch (code.m_op.m_opcode) {
  54.     case Expr_op::Plus:
  55. v = v1;
  56. break;
  57.     case Expr_op::Minus:
  58. v = - v1;
  59. break;
  60.     default:
  61. ctx_assert(false);
  62. break;
  63.     }
  64.     f.sqlDouble(v);
  65. } else {
  66.     ctx_assert(false);
  67. }
  68.     } else if (code.m_op.arity() == 2) {
  69. // evaluate sub-expressions
  70. ctx_assert(m_expr[1] != 0 && m_expr[2] != 0);
  71. m_expr[1]->evaluate(ctx, ctl);
  72. if (! ctx.ok())
  73.     return;
  74. m_expr[2]->evaluate(ctx, ctl);
  75. if (! ctx.ok())
  76.     return;
  77. if (ctl.m_postEval)
  78.     return;
  79. const SqlField& f1 = ctl.m_groupIndex == 0 ? m_expr[1]->getData().sqlField() : m_expr[1]->getData().groupField(ctl.m_groupIndex);
  80. const SqlField& f2 = ctl.m_groupIndex == 0 ? m_expr[2]->getData().sqlField() : m_expr[2]->getData().groupField(ctl.m_groupIndex);
  81. // handle null
  82. if (f1.sqlNull() || f2.sqlNull()) {
  83.     f.sqlNull(true);
  84.     return;
  85. }
  86. if (t.type() == SqlType::Bigint) {
  87.     SqlBigint v = 0;
  88.     SqlBigint v1 = f1.sqlBigint();
  89.     SqlBigint v2 = f2.sqlBigint();
  90.     switch (code.m_op.m_opcode) {
  91.     case Expr_op::Add:
  92. v = v1 + v2;
  93. break;
  94.     case Expr_op::Subtract:
  95. v = v1 - v2;
  96. break;
  97.     case Expr_op::Multiply:
  98. v = v1 * v2;
  99. break;
  100.     case Expr_op::Divide:
  101. if (v2 == 0) {
  102.     ctx.pushStatus(Sqlstate::_22012, Error::Gen, "integer division by zero");
  103.     return;
  104. }
  105. v = v1 / v2;
  106. break;
  107.     default:
  108. ctx_assert(false);
  109. break;
  110.     }
  111.     f.sqlBigint(v);
  112. } else if (t.type() == SqlType::Double) {
  113.     SqlDouble v = 0;
  114.     SqlDouble v1 = f1.sqlDouble();
  115.     SqlDouble v2 = f2.sqlDouble();
  116.     switch (code.m_op.m_opcode) {
  117.     case Expr_op::Add:
  118. v = v1 + v2;
  119. break;
  120.     case Expr_op::Subtract:
  121. v = v1 - v2;
  122. break;
  123.     case Expr_op::Multiply:
  124. v = v1 * v2;
  125. break;
  126.     case Expr_op::Divide:
  127. v = v1 / v2;
  128. break;
  129.     default:
  130. ctx_assert(false);
  131. break;
  132.     }
  133.     f.sqlDouble(v); // XXX isnan()
  134. } else {
  135.     ctx_assert(false);
  136. }
  137.     } else {
  138. ctx_assert(false);
  139.     }
  140.     // result is not null
  141.     f.sqlNull(false);
  142. }