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

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 <NdbScanFilter.hpp>
  14. #include <NdbSqlUtil.hpp>
  15. #include <codegen/Code_comp_op.hpp>
  16. void
  17. Exec_comp_op::execInterp(Ctx& ctx, Ctl& ctl)
  18. {
  19.     const Code& code = getCode();
  20.     const unsigned arity = code.m_op.arity();
  21.     const Comp_op::Opcode opcode = code.m_op.m_opcode;
  22.     Data& data = getData();
  23.     ctx_assert(ctl.m_scanFilter != 0);
  24.     NdbScanFilter& scanFilter = *ctl.m_scanFilter;
  25.     if (code.m_interpColumn == 0) {
  26. // args are constant on this level so evaluate entire predicate
  27. evaluate(ctx, ctl);
  28. if (! ctx.ok())
  29.     return;
  30. if (data.m_value == Pred_value_true)
  31.     scanFilter.istrue();
  32. else
  33.     scanFilter.isfalse();
  34. return;
  35.     }
  36.     const NdbAttrId interpAttrId = code.m_interpAttrId;
  37.     if (arity == 1) {
  38. ctx_assert(m_expr[1] != 0);
  39. const SqlType& t1 = m_expr[1]->getCode().sqlSpec().sqlType();
  40. const SqlField& f1 = m_expr[1]->getData().sqlField();
  41. switch (code.m_op.m_opcode) {
  42. case Comp_op::Isnull:
  43.     scanFilter.isnull(interpAttrId);
  44.     break;
  45. case Comp_op::Isnotnull:
  46.     scanFilter.isnotnull(interpAttrId);
  47.     break;
  48. default:
  49.     ctx_assert(false);
  50.     break;
  51. }
  52.     } else if (arity == 2) {
  53. ctx_assert(m_expr[1] != 0 && m_expr[2] != 0);
  54. // one is column and the other is constant at this level
  55. ctx_assert(code.m_interpColumn == 1 || code.m_interpColumn == 2);
  56. const unsigned i = code.m_interpColumn;
  57. const unsigned j = 3 - i;
  58. // evaluate the constant
  59. m_expr[j]->evaluate(ctx, ctl);
  60. if (! ctx.ok())
  61.     return;
  62. const SqlType& t1 = m_expr[i]->getCode().sqlSpec().sqlType();
  63. const SqlField& f1 = m_expr[i]->getData().sqlField();
  64. const SqlType& t2 = m_expr[j]->getCode().sqlSpec().sqlType();
  65. const SqlField& f2 = m_expr[j]->getData().sqlField();
  66. // handle null constant
  67. if (f2.sqlNull()) {
  68.     scanFilter.isfalse();
  69.     return;
  70. }
  71. // handle null in interpreter
  72. scanFilter.begin(NdbScanFilter::AND);
  73. scanFilter.isnotnull(interpAttrId);
  74. if (t1.type() == SqlType::Char || t1.type() == SqlType::Varchar) {
  75.     const char* v2 = 0;
  76.     unsigned n2 = 0;
  77.     bool nopad = false;
  78.     if (t1.type() == SqlType::Char && t2.type() == SqlType::Char) {
  79. v2 = reinterpret_cast<const char*>(f2.sqlChar());
  80. n2 = t2.length();
  81. nopad = false;
  82.     } else if (t1.type() == SqlType::Char && t2.type() == SqlType::Varchar) {
  83. v2 = reinterpret_cast<const char*>(f2.sqlVarchar(&n2));
  84. nopad = true;
  85.     } else if (t1.type() == SqlType::Varchar && t2.type() == SqlType::Char) {
  86. v2 = reinterpret_cast<const char*>(f2.sqlChar());
  87. n2 = t2.length();
  88. nopad = true;
  89.     } else if (t1.type() == SqlType::Varchar && t2.type() == SqlType::Varchar) {
  90. v2 = reinterpret_cast<const char*>(f2.sqlVarchar(&n2));
  91. nopad = true;
  92.     } else {
  93. ctx_assert(false);
  94.     }
  95.     switch (opcode) {
  96.     case Comp_op::Eq:
  97. scanFilter.eq(interpAttrId, v2, n2, nopad);
  98. break;
  99.     case Comp_op::Noteq:
  100. scanFilter.ne(interpAttrId, v2, n2, nopad);
  101. break;
  102.     case Comp_op::Lt:
  103. if (i == 1) {
  104.     scanFilter.lt(interpAttrId, v2, n2, nopad);
  105. } else {
  106.     scanFilter.gt(interpAttrId, v2, n2, nopad);
  107. }
  108. break;
  109.     case Comp_op::Lteq:
  110. if (i == 1) {
  111.     scanFilter.le(interpAttrId, v2, n2, nopad);
  112. } else {
  113.     scanFilter.ge(interpAttrId, v2, n2, nopad);
  114. }
  115. break;
  116.     case Comp_op::Gt:
  117. if (i == 1) {
  118.     scanFilter.gt(interpAttrId, v2, n2, nopad);
  119. } else {
  120.     scanFilter.lt(interpAttrId, v2, n2, nopad);
  121. }
  122. break;
  123.     case Comp_op::Gteq:
  124. if (i == 1) {
  125.     scanFilter.ge(interpAttrId, v2, n2, nopad);
  126. } else {
  127.     scanFilter.le(interpAttrId, v2, n2, nopad);
  128. }
  129. break;
  130.     case Comp_op::Like:
  131. scanFilter.like(interpAttrId, v2, n2, nopad);
  132. break;
  133.     case Comp_op::Notlike:
  134. scanFilter.notlike(interpAttrId, v2, n2, nopad);
  135. break;
  136.     default:
  137. ctx_assert(false);
  138. break;
  139.     }
  140. } else if (t1.type() == SqlType::Smallint || t1.type() == SqlType::Integer || t1.type() == SqlType::Bigint) {
  141.     ctx_assert(t1.unSigned());
  142.     bool s2 = ! t2.unSigned();
  143.     SqlBigint v2;
  144.     SqlUbigint uv2;
  145.     if (s2) {
  146. v2 =
  147.     t2.type() == SqlType::Smallint ? f2.sqlSmallint() :
  148.     t2.type() == SqlType::Integer ? f2.sqlInteger() : f2.sqlBigint();
  149. uv2 = v2;
  150.     } else {
  151. uv2 =
  152.     t2.type() == SqlType::Smallint ? (SqlUsmallint)f2.sqlSmallint() :
  153.     t2.type() == SqlType::Integer ? (SqlUinteger)f2.sqlInteger() : (SqlUbigint)f2.sqlBigint();
  154. v2 = uv2;
  155.     }
  156.     switch (code.m_op.m_opcode) {
  157.     case Comp_op::Eq:
  158. if (s2 && v2 < 0)
  159.     scanFilter.isfalse();
  160. else
  161.     scanFilter.eq(interpAttrId, uv2);
  162. break;
  163.     case Comp_op::Noteq:
  164. if (s2 && v2 < 0)
  165.     scanFilter.istrue();
  166. else
  167.     scanFilter.ne(interpAttrId, uv2);
  168. break;
  169.     case Comp_op::Lt:
  170. if (i == 1) {
  171.     if (s2 && v2 < 0)
  172. scanFilter.isfalse();
  173.     else
  174. scanFilter.lt(interpAttrId, uv2);
  175. } else {
  176.     if (s2 && v2 < 0)
  177. scanFilter.istrue();
  178.     else
  179. scanFilter.gt(interpAttrId, uv2);
  180. }
  181. break;
  182.     case Comp_op::Lteq:
  183. if (i == 1) {
  184.     if (s2 && v2 < 0)
  185. scanFilter.isfalse();
  186.     else
  187. scanFilter.le(interpAttrId, uv2);
  188. } else {
  189.     if (s2 && v2 < 0)
  190. scanFilter.istrue();
  191.     else
  192. scanFilter.ge(interpAttrId, uv2);
  193. }
  194. break;
  195.     case Comp_op::Gt:
  196. if (i == 1) {
  197.     if (s2 && v2 < 0)
  198. scanFilter.istrue();
  199.     else
  200. scanFilter.gt(interpAttrId, uv2);
  201. } else {
  202.     if (s2 && v2 < 0)
  203. scanFilter.isfalse();
  204.     else
  205. scanFilter.lt(interpAttrId, uv2);
  206. }
  207. break;
  208.     case Comp_op::Gteq:
  209. if (i == 1) {
  210.     if (s2 && v2 < 0)
  211. scanFilter.istrue();
  212.     else
  213. scanFilter.ge(interpAttrId, uv2);
  214. } else {
  215.     if (s2 && v2 < 0)
  216. scanFilter.isfalse();
  217.     else
  218. scanFilter.le(interpAttrId, uv2);
  219. }
  220. break;
  221.     default:
  222. ctx_assert(false);
  223. break;
  224.     }
  225. } else {
  226.     ctx_assert(false);
  227. }
  228. // end null guard
  229. scanFilter.end();
  230.     } else {
  231. ctx_assert(false);
  232.     }
  233. }
  234. static bool
  235. do_sqlchar_comp(Comp_op::Opcode opcode, const SqlChar* s1, unsigned n1, const SqlChar* s2, unsigned n2, bool padded)
  236. {
  237.     int ret = NdbSqlUtil::char_compare(reinterpret_cast<const char*>(s1), n1, reinterpret_cast<const char *>(s2), n2, padded);
  238.     switch (opcode) {
  239.     case Comp_op::Eq:
  240. return ret == 0;
  241.     case Comp_op::Noteq:
  242. return ret != 0;
  243.     case Comp_op::Lt:
  244. return ret < 0;
  245.     case Comp_op::Lteq:
  246. return ret <= 0;
  247.     case Comp_op::Gt:
  248. return ret > 0;
  249.     case Comp_op::Gteq:
  250. return ret >= 0;
  251.     default:
  252. break;
  253.     }
  254.     ctx_assert(false);
  255.     return false;
  256. }
  257. static bool
  258. do_sqlchar_like(const SqlChar* s1, unsigned n1, const SqlChar* s2, unsigned n2, bool padded)
  259. {
  260.     bool ret = NdbSqlUtil::char_like(reinterpret_cast<const char*>(s1), n1, reinterpret_cast<const char *>(s2), n2, padded);
  261.     return ret;
  262. }
  263. static bool
  264. do_datetime_comp(Comp_op::Opcode opcode, SqlDatetime v1, SqlDatetime v2)
  265. {
  266.     int k = v1.less(v2) ? -1 : v2.less(v1) ? 1 : 0;
  267.     switch (opcode) {
  268.     case Comp_op::Eq:
  269. return k == 0;
  270.     case Comp_op::Noteq:
  271. return k != 0;
  272.     case Comp_op::Lt:
  273. return k < 0;
  274.     case Comp_op::Lteq:
  275. return k <= 0;
  276.     case Comp_op::Gt:
  277. return k > 0;
  278.     case Comp_op::Gteq:
  279. return k >= 0;
  280.     default:
  281. break;
  282.     }
  283.     ctx_assert(false);
  284.     return false;
  285. }
  286. void
  287. Exec_comp_op::evaluate(Ctx& ctx, Ctl& ctl)
  288. {
  289.     const Code& code = getCode();
  290.     const unsigned arity = code.m_op.arity();
  291.     const Comp_op::Opcode opcode = code.m_op.m_opcode;
  292.     Data& data = getData();
  293.     Pred_value v = Pred_value_unknown;
  294.     if (arity == 1) {
  295. // evaluate sub-expression
  296. ctx_assert(m_expr[1] != 0);
  297. m_expr[1]->evaluate(ctx, ctl);
  298. if (! ctx.ok())
  299.     return;
  300. if (ctl.m_postEval)
  301.     return;
  302. // get type and value
  303. const SqlType& t1 = m_expr[1]->getCode().sqlSpec().sqlType();
  304. const SqlField& f1 = ctl.m_groupIndex == 0 ? m_expr[1]->getData().sqlField() : m_expr[1]->getData().groupField(ctl.m_groupIndex);
  305. switch (code.m_op.m_opcode) {
  306. case Comp_op::Isnull:
  307.     v = f1.sqlNull() ? Pred_value_true : Pred_value_false;
  308.     break;
  309. case Comp_op::Isnotnull:
  310.     v = f1.sqlNull() ? Pred_value_false : Pred_value_true;
  311.     break;
  312. default:
  313.     ctx_assert(false);
  314.     break;
  315. }
  316.     } else if (arity == 2) {
  317. // evaluate sub-expressions
  318. ctx_assert(m_expr[1] != 0 && m_expr[2] != 0);
  319. m_expr[1]->evaluate(ctx, ctl);
  320. if (! ctx.ok())
  321.     return;
  322. m_expr[2]->evaluate(ctx, ctl);
  323. if (! ctx.ok())
  324.     return;
  325. if (ctl.m_postEval)
  326.     return;
  327. // get types and values
  328. const SqlType& t1 = m_expr[1]->getCode().sqlSpec().sqlType();
  329. const SqlType& t2 = m_expr[2]->getCode().sqlSpec().sqlType();
  330. const SqlField& f1 = ctl.m_groupIndex == 0 ? m_expr[1]->getData().sqlField() : m_expr[1]->getData().groupField(ctl.m_groupIndex);
  331. const SqlField& f2 = ctl.m_groupIndex == 0 ? m_expr[2]->getData().sqlField() : m_expr[2]->getData().groupField(ctl.m_groupIndex);
  332. // handle null
  333. if (f1.sqlNull() || f2.sqlNull()) {
  334.     v = Pred_value_unknown;
  335. } else if (t1.type() == SqlType::Char) {
  336.     const SqlChar* v1 = f1.sqlChar();
  337.     unsigned n1 = t1.length();
  338.     if (t2.type() == SqlType::Char) {
  339. unsigned n2 = t2.length();
  340. const SqlChar* v2 = f2.sqlChar();
  341. bool b;
  342. switch (opcode) {
  343. case Comp_op::Like:
  344.     b = do_sqlchar_like(v1, n1, v2, n2, true);
  345.     break;
  346. case Comp_op::Notlike:
  347.     b = ! do_sqlchar_like(v1, n1, v2, n2, true);
  348.     break;
  349. default:
  350.     b = do_sqlchar_comp(opcode, v1, n1, v2, n2, true);
  351.     break;
  352. }
  353. v = b ? Pred_value_true : Pred_value_false;
  354.     } else if (t2.type() == SqlType::Varchar) {
  355. unsigned n2 = 0;
  356. const SqlChar* v2 = f2.sqlVarchar(&n2);
  357. bool b;
  358. switch (opcode) {
  359. case Comp_op::Like:
  360.     b = do_sqlchar_like(v1, n1, v2, n2, true);
  361.     break;
  362. case Comp_op::Notlike:
  363.     b = ! do_sqlchar_like(v1, n1, v2, n2, true);
  364.     break;
  365. default:
  366.     b = do_sqlchar_comp(opcode, v1, n1, v2, n2, false);
  367.     break;
  368. }
  369. v = b ? Pred_value_true : Pred_value_false;
  370.     } else {
  371. ctx_assert(false);
  372.     }
  373. } else if (t1.type() == SqlType::Varchar) {
  374.     unsigned n1 = 0;
  375.     const SqlChar* v1 = f1.sqlVarchar(&n1);
  376.     if (t2.type() == SqlType::Char) {
  377. unsigned n2 = t2.length();
  378. const SqlChar* v2 = f2.sqlChar();
  379. bool b;
  380. switch (opcode) {
  381. case Comp_op::Like:
  382.     b = do_sqlchar_like(v1, n1, v2, n2, false);
  383.     break;
  384. case Comp_op::Notlike:
  385.     b = ! do_sqlchar_like(v1, n1, v2, n2, false);
  386.     break;
  387. default:
  388.     b = do_sqlchar_comp(opcode, v1, n1, v2, n2, false);
  389.     break;
  390. }
  391. v = b ? Pred_value_true : Pred_value_false;
  392.     } else if (t2.type() == SqlType::Varchar) {
  393. unsigned n2 = 0;
  394. const SqlChar* v2 = f2.sqlVarchar(&n2);
  395. bool b;
  396. switch (opcode) {
  397. case Comp_op::Like:
  398.     b = do_sqlchar_like(v1, n1, v2, n2, false);
  399.     break;
  400. case Comp_op::Notlike:
  401.     b = ! do_sqlchar_like(v1, n1, v2, n2, false);
  402.     break;
  403. default:
  404.     b = do_sqlchar_comp(opcode, v1, n1, v2, n2, false);
  405.     break;
  406. }
  407. v = b ? Pred_value_true : Pred_value_false;
  408.     } else {
  409. ctx_assert(false);
  410.     }
  411. } else if (t1.type() == SqlType::Smallint || t1.type() == SqlType::Integer || t1.type() == SqlType::Bigint) {
  412.     // convert to bigint
  413.     bool s1 = ! t1.unSigned();
  414.     bool s2 = ! t2.unSigned();
  415.     SqlBigint v1, v2;
  416.     SqlUbigint uv1, uv2;
  417.     if (s1) {
  418. v1 =
  419.     t1.type() == SqlType::Smallint ? f1.sqlSmallint() :
  420.     t1.type() == SqlType::Integer ? f1.sqlInteger() : f1.sqlBigint();
  421. uv1 = v1;
  422.     } else {
  423. uv1 =
  424.     t1.type() == SqlType::Smallint ? (SqlUsmallint)f1.sqlSmallint() :
  425.     t1.type() == SqlType::Integer ? (SqlUinteger)f1.sqlInteger() : (SqlUbigint)f1.sqlBigint();
  426. v1 = uv1;
  427.     }
  428.     if (s2) {
  429. v2 =
  430.     t2.type() == SqlType::Smallint ? f2.sqlSmallint() :
  431.     t2.type() == SqlType::Integer ? f2.sqlInteger() : f2.sqlBigint();
  432. uv2 = v2;
  433.     } else {
  434. uv2 =
  435.     t2.type() == SqlType::Smallint ? (SqlUsmallint)f2.sqlSmallint() :
  436.     t2.type() == SqlType::Integer ? (SqlUinteger)f2.sqlInteger() : (SqlUbigint)f2.sqlBigint();
  437. v2 = uv2;
  438.     }
  439.     bool b;
  440.     switch (opcode) {
  441.     case Comp_op::Eq:
  442. b = s1 && s2 ? (v1 == v2) : s1 ? (v1 < 0 ? false : uv1 == uv2) : s2 ? (v2 < 0 ? false : uv1 == uv2) : (uv1 == uv2);
  443. break;
  444.     case Comp_op::Noteq:
  445. b = s1 && s2 ? (v1 == v2) : s1 ? (v1 < 0 ? true : uv1 != uv2) : s2 ? (v2 < 0 ? true : uv1 != uv2) : (uv1 != uv2);
  446. break;
  447.     case Comp_op::Lt:
  448. b = s1 && s2 ? (v1 < v2) : s1 ? (v1 < 0 ? true : uv1 < uv2) : s2 ? (v2 < 0 ? false : uv1 < uv2) : (uv1 < uv2);
  449. break;
  450.     case Comp_op::Lteq:
  451. b = s1 && s2 ? (v1 <= v2) : s1 ? (v1 < 0 ? true : uv1 <= uv2) : s2 ? (v2 < 0 ? false : uv1 <= uv2) : (uv1 <= uv2);
  452. break;
  453.     case Comp_op::Gt:
  454. b = s1 && s2 ? (v1 > v2) : s1 ? (v1 < 0 ? false : uv1 > uv2) : s2 ? (v2 < 0 ? true : uv1 > uv2) : (uv1 > uv2);
  455. break;
  456.     case Comp_op::Gteq:
  457. b = s1 && s2 ? (v1 >= v2) : s1 ? (v1 < 0 ? false : uv1 >= uv2) : s2 ? (v2 < 0 ? true : uv1 >= uv2) : (uv1 >= uv2);
  458. break;
  459.     default:
  460. ctx_assert(false);
  461. break;
  462.     }
  463.     v = b ? Pred_value_true : Pred_value_false;
  464. } else if (t1.type() == SqlType::Double) {
  465.     SqlDouble v1 = f1.sqlDouble();
  466.     SqlDouble v2 = f2.sqlDouble();
  467.     bool b;
  468.     switch (opcode) {
  469.     case Comp_op::Eq:
  470. b = (v1 == v2);
  471. break;
  472.     case Comp_op::Noteq:
  473. b = (v1 != v2);
  474. break;
  475.     case Comp_op::Lt:
  476. b = (v1 < v2);
  477. break;
  478.     case Comp_op::Lteq:
  479. b = (v1 <= v2);
  480. break;
  481.     case Comp_op::Gt:
  482. b = (v1 > v2);
  483. break;
  484.     case Comp_op::Gteq:
  485. b = (v1 >= v2);
  486. break;
  487.     default:
  488. ctx_assert(false);
  489. break;
  490.     }
  491.     v = b ? Pred_value_true : Pred_value_false;
  492. } else if (t1.type() == SqlType::Datetime) {
  493.     SqlDatetime v1 = f1.sqlDatetime();
  494.     SqlDatetime v2 = f2.sqlDatetime();
  495.     bool b;
  496.     b = do_datetime_comp(opcode, v1, v2);
  497.     v = b ? Pred_value_true : Pred_value_false;
  498. } else {
  499.     ctx_assert(false);
  500. }
  501.     } else {
  502. ctx_assert(false);
  503.     }
  504.     // set result
  505.     if (ctl.m_groupIndex == 0)
  506. data.m_value = v;
  507.     else
  508. data.groupValue(ctl.m_groupIndex, ctl.m_groupInit) = v;
  509. }