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

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_conv.hpp>
  14. void
  15. Exec_expr_conv::evaluate(Ctx& ctx, Ctl& ctl)
  16. {
  17.     const Code& code = getCode();
  18.     Data& data = getData();
  19.     const SqlType& t1 = code.sqlSpec().sqlType();
  20.     SqlField& f1 = ctl.m_groupIndex == 0 ? data.m_sqlField : data.groupField(code.sqlSpec().sqlType() , ctl.m_groupIndex, ctl.m_groupInit);
  21.     // evaluate the subexpression
  22.     ctx_assert(m_expr != 0);
  23.     m_expr->evaluate(ctx, ctl);
  24.     if (! ctx.ok())
  25. return;
  26.     if (ctl.m_postEval)
  27. return;
  28.     const SqlType& t2 = m_expr->getCode().sqlSpec().sqlType();
  29.     const SqlField& f2 = ctl.m_groupIndex == 0 ? m_expr->getData().sqlField() : m_expr->getData().groupField(ctl.m_groupIndex);
  30.     // conversion to null type
  31.     if (t1.type() == SqlType::Null) {
  32. f1.sqlNull(true);
  33. return;
  34.     }
  35.     // conversion of null data
  36.     if (f2.sqlNull()) {
  37. f1.sqlNull(true);
  38. return;
  39.     }
  40.     // try to convert
  41.     if (! f2.cast(ctx, f1)) {
  42. char b1[40], b2[40], b3[40];
  43. t1.print(b1, sizeof(b1));
  44. t2.print(b2, sizeof(b2));
  45. f2.print(b3, sizeof(b3));
  46. ctx.pushStatus(Sqlstate::_22003, Error::Gen, "cannot convert %s [%s] to %s", b2, b3, b1);
  47. return;
  48.     }
  49. }