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

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 <time.h>
  14. #include <NdbTick.h>
  15. #include <codegen/Code_expr_func.hpp>
  16. void
  17. Exec_expr_func::init(Ctx& ctx, Ctl& ctl)
  18. {
  19.     const Code& code = getCode();
  20.     Data& data = getData();
  21.     const SqlType& t = code.sqlSpec().sqlType();
  22.     SqlField& f = ctl.m_groupIndex == 0 ? data.m_sqlField : data.groupField(code.sqlSpec().sqlType(), ctl.m_groupIndex, ctl.m_groupInit);
  23.     if (ctl.m_groupIndex >= data.m_groupAcc.size())
  24. data.m_groupAcc.resize(1 + ctl.m_groupIndex);
  25.     Data::Acc& acc = data.m_groupAcc[ctl.m_groupIndex];
  26.     acc.m_count = 0;
  27.     Expr_func::Code fc = code.m_func.m_code;
  28.     if (fc == Expr_func::Substr || fc == Expr_func::Left || fc == Expr_func::Right) {
  29.     } else if (fc == Expr_func::Count) {
  30. f.sqlBigint(0);
  31.     } else if (fc == Expr_func::Min || fc == Expr_func::Max) {
  32. f.sqlNull(true);
  33.     } else if (fc == Expr_func::Sum) {
  34. f.sqlNull(true);
  35. switch (t.type()) {
  36. case SqlType::Bigint:
  37.     acc.m_bigint = 0;
  38.     break;
  39. case SqlType::Double:
  40.     acc.m_double = 0;
  41.     break;
  42. default:
  43.     ctx_assert(false);
  44.     break;
  45. }
  46.     } else if (fc == Expr_func::Avg) {
  47. f.sqlNull(true);
  48. switch (t.type()) {
  49. case SqlType::Double:
  50.     acc.m_double = 0.0;
  51.     break;
  52. default:
  53.     ctx_assert(false);
  54.     break;
  55. }
  56.     } else if (fc == Expr_func::Rownum) {
  57. // uses only m_count
  58.     } else if (fc == Expr_func::Sysdate) {
  59. // set time once
  60. NDB_TICKS secs = 0;
  61. Uint32 micros = 0;
  62. NdbTick_CurrentMicrosecond(&secs, &micros);
  63. time_t clock = secs;
  64. struct tm* t = gmtime(&clock);
  65. SqlDatetime& d = acc.m_sysdate;
  66. d.cc((1900 + t->tm_year) / 100);
  67. d.yy((1900 + t->tm_year) % 100);
  68. d.mm(1 + t->tm_mon);
  69. d.dd(t->tm_mday);
  70. d.HH(t->tm_hour);
  71. d.MM(t->tm_min);
  72. d.SS(t->tm_sec);
  73. d.ff(1000 * micros);
  74.     } else {
  75. ctx_assert(false);
  76.     }
  77. }
  78. void
  79. Exec_expr_func::evaluate(Ctx& ctx, Ctl& ctl)
  80. {
  81.     const Code& code = getCode();
  82.     Data& data = getData();
  83.     const SqlType& t = code.sqlSpec().sqlType();
  84.     if (ctl.m_groupInit)
  85. init(ctx, ctl);
  86.     SqlField& f = ctl.m_groupIndex == 0 ? data.m_sqlField : data.groupField(code.sqlSpec().sqlType(), ctl.m_groupIndex, false);
  87.     Data::Acc& acc = data.m_groupAcc[ctl.m_groupIndex];
  88.     Expr_func::Code fc = code.m_func.m_code;
  89.     const unsigned narg = code.m_narg;
  90.     Exec_expr** args = code.m_args;
  91.     ctx_assert(args != 0);
  92.     // evaluate arguments
  93.     for (unsigned i = 1; i <= narg; i++) {
  94. ctx_assert(args[i] != 0);
  95. unsigned save = ctl.m_groupIndex;
  96. if (code.m_func.m_aggr)
  97.     ctl.m_groupIndex = 0;
  98. args[i]->evaluate(ctx, ctl);
  99. if (! ctx.ok())
  100.     return;
  101. ctl.m_groupIndex = save;
  102.     }
  103.     if (fc == Expr_func::Substr || fc == Expr_func::Left || fc == Expr_func::Right) {
  104. ctx_assert((narg == (unsigned)2) || (narg == (unsigned)(fc == Expr_func::Substr ? 3 : 2)));
  105. const SqlType& t1 = args[1]->getCode().sqlSpec().sqlType();
  106. const SqlField& f1 = args[1]->getData().sqlField();
  107. int pos, len;
  108. for (unsigned i = 2; i <= narg; i++) {
  109.     int& num = (fc == Expr_func::Substr ? (i == 2 ? pos : len) : len);
  110.     const SqlType& t2 = args[i]->getCode().sqlSpec().sqlType();
  111.     const SqlField& f2 = args[i]->getData().sqlField();
  112.     switch (t2.type()) {
  113.     case SqlType::Smallint:
  114. num = static_cast<int>(f2.sqlSmallint());
  115. break;
  116.     case SqlType::Integer:
  117. num = static_cast<int>(f2.sqlInteger());
  118. break;
  119.     case SqlType::Bigint:
  120. num = static_cast<int>(f2.sqlBigint());
  121. break;
  122.     default:
  123. ctx_assert(false);
  124. break;
  125.     }
  126. }
  127. int length = 0;
  128. const SqlChar* data = 0;
  129. switch (t1.type()) {
  130. case SqlType::Char:
  131.     length = t1.length();
  132.     data = f1.sqlChar();
  133.     break;
  134. case SqlType::Varchar:
  135.     unsigned ulength;
  136.     data = f1.sqlVarchar(&ulength);
  137.     length = ulength;
  138.     break;
  139. default:
  140.     ctx_assert(false);
  141.     break;
  142. }
  143. if (fc == Expr_func::Left)
  144.     pos = 1;
  145. else if (fc == Expr_func::Right)
  146.     pos = len > length ? 1 : length - len + 1;
  147. else if (pos < 0)
  148.     pos += length + 1;
  149. if (pos <= 0 || pos > length || len <= 0) {
  150.     f.sqlNull(true); // oracle-ish
  151.     return;
  152. }
  153. if (len > length - pos + 1)
  154.     len = length - pos + 1;
  155. switch (t1.type()) {
  156. case SqlType::Char:
  157.     f.sqlChar(data + (pos - 1), len);
  158.     break;
  159. case SqlType::Varchar:
  160.     f.sqlVarchar(data + (pos - 1), len);
  161.     break;
  162. default:
  163.     ctx_assert(false);
  164.     break;
  165. }
  166.     } else if (fc == Expr_func::Count) {
  167. ctx_assert(narg == 0 || narg == 1);
  168. if (ctl.m_postEval)
  169.     return;
  170. if (narg == 1) {
  171.     const SqlField& f1 = args[1]->getData().sqlField();
  172.     if (f1.sqlNull())
  173. return;
  174. }
  175. f.sqlBigint(++acc.m_count);
  176.     } else if (fc == Expr_func::Min) {
  177. ctx_assert(narg == 1);
  178. if (ctl.m_postEval)
  179.     return;
  180. const SqlField& f1 = args[1]->getData().sqlField();
  181. if (f1.sqlNull())
  182.     return;
  183. if (f.sqlNull() || f1.less(f))
  184.     f1.copy(ctx, f);
  185.     } else if (fc == Expr_func::Max) {
  186. ctx_assert(narg == 1);
  187. if (ctl.m_postEval)
  188.     return;
  189. const SqlField& f1 = args[1]->getData().sqlField();
  190. if (f1.sqlNull())
  191.     return;
  192. if (f.sqlNull() || f.less(f1))
  193.     f1.copy(ctx, f);
  194.     } else if (fc == Expr_func::Sum) {
  195. ctx_assert(narg == 1);
  196. if (ctl.m_postEval)
  197.     return;
  198. const SqlType& t1 = args[1]->getCode().sqlSpec().sqlType();
  199. const SqlField& f1 = args[1]->getData().sqlField();
  200. if (f1.sqlNull())
  201.     return;
  202. switch (t.type()) {
  203. case SqlType::Bigint:
  204.     switch (t1.type()) {
  205.     case SqlType::Integer:
  206. acc.m_bigint += f1.sqlInteger();
  207. break;
  208.     case SqlType::Bigint:
  209. acc.m_bigint += f1.sqlBigint();
  210. break;
  211.     default:
  212. ctx_assert(false);
  213. break;
  214.     }
  215.     f.sqlBigint(acc.m_bigint);
  216.     break;
  217. case SqlType::Double:
  218.     switch (t1.type()) {
  219.     case SqlType::Real:
  220. acc.m_double += f1.sqlReal();
  221. break;
  222.     case SqlType::Double:
  223. acc.m_double += f1.sqlDouble();
  224. break;
  225.     default:
  226. ctx_assert(false);
  227. break;
  228.     }
  229.     f.sqlDouble(acc.m_double);
  230.     break;
  231. default:
  232.     ctx_assert(false);
  233.     break;
  234. }
  235.     } else if (fc == Expr_func::Avg) {
  236. ctx_assert(narg == 1);
  237. if (ctl.m_postEval)
  238.     return;
  239. const SqlType& t1 = args[1]->getCode().sqlSpec().sqlType();
  240. const SqlField& f1 = args[1]->getData().sqlField();
  241. if (f1.sqlNull())
  242.     return;
  243. switch (t1.type()) {
  244. case SqlType::Smallint:
  245.     acc.m_bigint += f1.sqlSmallint();
  246.     break;
  247. case SqlType::Integer:
  248.     acc.m_bigint += f1.sqlInteger();
  249.     break;
  250. case SqlType::Bigint:
  251.     acc.m_bigint += f1.sqlBigint();
  252.     break;
  253. case SqlType::Real:
  254.     acc.m_double += f1.sqlReal();
  255.     break;
  256. case SqlType::Double:
  257.     acc.m_double += f1.sqlDouble();
  258.     break;
  259. default:
  260.     ctx_assert(false);
  261.     break;
  262. }
  263. f.sqlDouble(acc.m_double / (SqlDouble)++acc.m_count);
  264.     } else if (fc == Expr_func::Rownum) {
  265. ctx_assert(narg == 0);
  266. if (! ctl.m_postEval)
  267.     f.sqlBigint(1 + acc.m_count);
  268. else
  269.     acc.m_count++;
  270.     } else if (fc == Expr_func::Sysdate) {
  271. ctx_assert(narg == 0);
  272. if (ctl.m_postEval)
  273.     return;
  274. f.sqlDatetime(acc.m_sysdate);
  275.     } else {
  276. ctx_assert(false);
  277.     }
  278. }