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

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_func.hpp"
  15. #include "Code_expr_conv.hpp"
  16. #include "Code_root.hpp"
  17. #include "PortDefs.h"
  18. // Expr_func
  19. static const struct { const char* alias; const char* name; }
  20. expr_func_alias[] = {
  21.     { "SUBSTRING", "SUBSTR" },
  22.     { 0, 0 }
  23. };
  24. static const Expr_func
  25. expr_func[] = {
  26.     Expr_func(Expr_func::Substr, "SUBSTR", false ),
  27.     Expr_func(Expr_func::Left, "LEFT", false ),
  28.     Expr_func(Expr_func::Right, "RIGHT", false ),
  29.     Expr_func(Expr_func::Count, "COUNT", true ),
  30.     Expr_func(Expr_func::Max, "MAX", true ),
  31.     Expr_func(Expr_func::Min, "MIN", true ),
  32.     Expr_func(Expr_func::Sum, "SUM", true ),
  33.     Expr_func(Expr_func::Avg, "AVG", true ),
  34.     Expr_func(Expr_func::Rownum, "ROWNUM", false ),
  35.     Expr_func(Expr_func::Sysdate, "SYSDATE", false ),
  36.     Expr_func(Expr_func::Undef, 0, false )
  37. };
  38. const Expr_func&
  39. Expr_func::find(const char* name)
  40. {
  41.     for (unsigned i = 0; expr_func_alias[i].alias != 0; i++) {
  42. if (strcasecmp(expr_func_alias[i].alias, name) == 0) {
  43.     name = expr_func_alias[i].name;
  44.     break;
  45. }
  46.     }
  47.     const Expr_func* p;
  48.     for (p = expr_func; p->m_name != 0; p++) {
  49. if (strcasecmp(p->m_name, name) == 0)
  50.     break;
  51.     }
  52.     return *p;
  53. }
  54. // Plan_expr_func
  55. Plan_expr_func::~Plan_expr_func()
  56. {
  57.     delete[] m_conv;
  58.     m_conv = 0;
  59. }
  60. Plan_base*
  61. Plan_expr_func::analyze(Ctx& ctx, Ctl& ctl)
  62. {
  63.     m_exec = 0;
  64.     ctx_assert(m_narg == 0 || m_args != 0);
  65.     // aggregate check
  66.     if (m_func.m_aggr) {
  67. if (! ctl.m_aggrok) {
  68.     ctx.pushStatus(Error::Gen, "%s: invalid use of aggregate function", m_func.m_name);
  69.     return 0;
  70. }
  71. if (ctl.m_aggrin) {
  72.     // XXX actually possible with group-by but too hard
  73.     ctx.pushStatus(Error::Gen, "%s: nested aggregate function", m_func.m_name);
  74.     return 0;
  75. }
  76. ctl.m_aggrin = true;
  77. m_isAggr = true;
  78. m_isBound = true;
  79.     }
  80.     // analyze argument expressions
  81.     if (m_func.m_code != Expr_func::Rownum)
  82. m_isBound = true;
  83.     for (unsigned i = 1; i <= m_narg; i++) {
  84. Plan_expr* expr = m_args->getExpr(i);
  85. expr = static_cast<Plan_expr*>(expr->analyze(ctx, ctl));
  86. if (! ctx.ok())
  87.     return 0;
  88. ctx_assert(expr != 0);
  89. if (expr->m_isAggr)
  90.     m_isAggr = true;
  91. if (! m_func.m_aggr && ! expr->m_isBound)
  92.     m_isBound = false;
  93.     }
  94.     if (m_func.m_aggr)
  95. ctl.m_aggrin = false;
  96.     // find result type and conversion types
  97.     SqlType res;
  98.     const Expr_func::Code fc = m_func.m_code;
  99.     const char* const invalidArgCount = "%s: argument count %u is invalid";
  100.     const char* const invalidArgType = "%s: argument %u has invalid type";
  101.     if (fc == Expr_func::Substr || fc == Expr_func::Left || fc == Expr_func::Right) {
  102. if ((m_narg != (unsigned)2) && (m_narg != (unsigned)(fc == Expr_func::Substr ? 3 : 2))) {
  103.     ctx.pushStatus(Error::Gen, invalidArgCount, m_func.m_name, m_narg);
  104.     return 0;
  105. }
  106. const SqlType& t1 = m_args->getExpr(1)->sqlType();
  107. switch (t1.type()) {
  108. case SqlType::Char:
  109.     {
  110. // XXX convert to varchar for now to get length right
  111. SqlType tx(SqlType::Varchar, t1.length());
  112. res = m_conv[1] = tx;
  113.     }
  114.     break;
  115. case SqlType::Varchar:
  116. case SqlType::Unbound:
  117.     res = m_conv[1] = t1;
  118.     break;
  119. default:
  120.     ctx.pushStatus(Error::Gen, invalidArgType, m_func.m_name, 1);
  121.     return 0;
  122. }
  123. for (unsigned i = 2; i <= m_narg; i++) {
  124.     const SqlType& t2 = m_args->getExpr(i)->sqlType();
  125.     switch (t2.type()) {
  126.     case SqlType::Smallint:
  127.     case SqlType::Integer:
  128.     case SqlType::Bigint:
  129.     case SqlType::Unbound:
  130. m_conv[i] = t2;
  131. break;
  132.     default:
  133. ctx.pushStatus(Error::Gen, invalidArgType, m_func.m_name, i);
  134. return 0;
  135.     }
  136. }
  137.     } else if (fc == Expr_func::Count) {
  138. ctx_assert(m_args != 0);
  139. if (m_args->getAsterisk()) {
  140.     ctx_assert(m_narg == 0);
  141. } else {
  142.     if (m_narg != 1) {
  143. ctx.pushStatus(Error::Gen, invalidArgCount, m_func.m_name, m_narg);
  144. return 0;
  145.     }
  146.     m_conv[1] = m_args->getExpr(1)->sqlType();
  147. }
  148. res.setType(ctx, SqlType::Bigint);
  149.     } else if (fc == Expr_func::Min || fc == Expr_func::Max) {
  150. if (m_narg != 1) {
  151.     ctx.pushStatus(Error::Gen, invalidArgCount, m_func.m_name, m_narg);
  152.     return 0;
  153. }
  154. const SqlType& t1 = m_args->getExpr(1)->sqlType();
  155. res = m_conv[1] = t1;
  156.     } else if (fc == Expr_func::Sum) {
  157. if (m_narg != 1) {
  158.     ctx.pushStatus(Error::Gen, invalidArgCount, m_func.m_name, m_narg);
  159.     return 0;
  160. }
  161. const SqlType& t1 = m_args->getExpr(1)->sqlType();
  162. switch (t1.type()) {
  163. case SqlType::Smallint:
  164. case SqlType::Integer:
  165. case SqlType::Bigint:
  166.     res.setType(ctx, SqlType::Bigint);
  167.     m_conv[1] = res;
  168.     break;
  169. case SqlType::Real:
  170. case SqlType::Double:
  171.     res.setType(ctx, SqlType::Double);
  172.     m_conv[1] = res;
  173.     break;
  174. case SqlType::Unbound:
  175.     res = m_conv[1] = t1;
  176.     break;
  177. default:
  178.     ctx.pushStatus(Error::Gen, invalidArgType, m_func.m_name, 1);
  179.     return 0;
  180. }
  181.     } else if (fc == Expr_func::Avg) {
  182. if (m_narg != 1) {
  183.     ctx.pushStatus(Error::Gen, invalidArgCount, m_func.m_name, m_narg);
  184.     return 0;
  185. }
  186. const SqlType& t1 = m_args->getExpr(1)->sqlType();
  187. switch (t1.type()) {
  188. case SqlType::Smallint:
  189. case SqlType::Integer:
  190. case SqlType::Bigint:
  191. case SqlType::Real:
  192. case SqlType::Double:
  193.     res.setType(ctx, SqlType::Double);
  194.     m_conv[1] = res;
  195.     break;
  196. case SqlType::Unbound:
  197.     res = m_conv[1] = t1;
  198.     break;
  199. default:
  200.     ctx.pushStatus(Error::Gen, invalidArgType, m_func.m_name, 1);
  201.     return 0;
  202. }
  203.     } else if (fc == Expr_func::Rownum) {
  204. ctx_assert(m_narg == 0 && m_args == 0);
  205. res.setType(ctx, SqlType::Bigint);
  206.     } else if (fc == Expr_func::Sysdate) {
  207. ctx_assert(m_narg == 0 && m_args == 0);
  208. res.setType(ctx, SqlType::Datetime);
  209.     } else {
  210. ctx_assert(false);
  211.     }
  212.     // insert required conversions
  213.     for (unsigned i = 1; i <= m_narg; i++) {
  214. if (m_conv[i].type() == SqlType::Unbound) {
  215.     // parameter type not yet bound
  216.     continue;
  217. }
  218. Plan_expr_conv* exprConv = new Plan_expr_conv(m_root, m_conv[i]);
  219. m_root->saveNode(exprConv);
  220. exprConv->setExpr(m_args->getExpr(i));
  221. Plan_expr* expr = static_cast<Plan_expr*>(exprConv->analyze(ctx, ctl));
  222. if (! ctx.ok())
  223.     return 0;
  224. m_args->setExpr(i, expr);
  225.     }
  226.     // set result type
  227.     m_sqlType = res;
  228.     // set table dependencies
  229.     for (unsigned i = 1; i <= m_narg; i++) {
  230. const TableSet& ts = m_args->getExpr(i)->tableSet();
  231. m_tableSet.insert(ts.begin(), ts.end());
  232.     }
  233.     // set alias name
  234.     m_alias.assign(m_func.m_name);
  235.     if (m_narg == 0) {
  236. if (fc == Expr_func::Count)
  237.     m_alias.append("(*)");
  238.     } else {
  239. m_alias.append("(");
  240. for (unsigned i = 1; i <= m_narg; i++) {
  241.     if (i > 1)
  242. m_alias.append(",");
  243.     m_alias.append(m_args->getExpr(i)->getAlias());
  244. }
  245. m_alias.append(")");
  246.     }
  247.     return this;
  248. }
  249. Exec_base*
  250. Plan_expr_func::codegen(Ctx& ctx, Ctl& ctl)
  251. {
  252.     if (m_exec != 0)
  253. return m_exec;
  254.     Exec_expr_func* exec = new Exec_expr_func(ctl.m_execRoot);
  255.     ctl.m_execRoot->saveNode(exec);
  256.     SqlSpec sqlSpec(sqlType(), SqlSpec::Physical);
  257.     Exec_expr_func::Code& code = *new Exec_expr_func::Code(m_func, sqlSpec);
  258.     exec->setCode(code);
  259.     code.m_narg = m_narg;
  260.     code.m_args = new Exec_expr* [1 + m_narg];
  261.     for (unsigned i = 0; i <= m_narg; i++)
  262. code.m_args[i] = 0;
  263.     // create code for arguments
  264.     for (unsigned i = 1; i <= m_narg; i++) {
  265. Plan_expr* expr = m_args->getExpr(i);
  266. ctx_assert(expr != 0);
  267. Exec_expr* execExpr = static_cast<Exec_expr*>(expr->codegen(ctx, ctl));
  268. if (! ctx.ok())
  269.     return 0;
  270. ctx_assert(execExpr != 0);
  271. code.m_args[i] = execExpr;
  272.     }
  273.     m_exec = exec;
  274.     return exec;
  275. }
  276. void
  277. Plan_expr_func::print(Ctx& ctx)
  278. {
  279.     ctx.print(" [%s", m_func.m_name);
  280.     Plan_base* a[] = { m_args };
  281.     printList(ctx, a, sizeof(a)/sizeof(a[1]));
  282.     ctx.print("]");
  283. }
  284. bool
  285. Plan_expr_func::isEqual(const Plan_expr* expr) const
  286. {
  287.     ctx_assert(expr != 0);
  288.     if (expr->type() != Plan_expr::TypeFunc)
  289. return false;
  290.     const Plan_expr_func* expr2 = static_cast<const Plan_expr_func*>(expr);
  291.     if (m_func.m_code != expr2->m_func.m_code)
  292. return false;
  293.     if (m_narg != expr2->m_narg)
  294. return false;
  295.     ctx_assert(m_args != 0 && expr2->m_args != 0);
  296.     for (unsigned i = 1; i <= m_narg; i++) {
  297. if (! m_args->getExpr(i)->isEqual(expr2->m_args->getExpr(i)))
  298.     return false;
  299.     }
  300.     return true;
  301. }
  302. bool
  303. Plan_expr_func::isGroupBy(const Plan_expr_row* row) const
  304. {
  305.     if (m_func.m_aggr)
  306. return true;
  307.     switch (m_func.m_code) {
  308.     case Expr_func::Substr:
  309.     case Expr_func::Left:
  310.     case Expr_func::Right:
  311. ctx_assert(m_narg >= 1);
  312. if (m_args->getExpr(1)->isGroupBy(row))
  313.     return true;
  314. break;
  315.     case Expr_func::Sysdate:
  316. return true;
  317.     default:
  318. break;
  319.     }
  320.     if (isAnyEqual(row))
  321. return true;
  322.     return false;
  323. }
  324. // Exec_expr_func
  325. Exec_expr_func::Code::~Code()
  326. {
  327.     delete[] m_args;
  328.     m_args = 0;
  329. }
  330. Exec_expr_func::Data::~Data()
  331. {
  332. }
  333. Exec_expr_func::~Exec_expr_func()
  334. {
  335. }
  336. void
  337. Exec_expr_func::alloc(Ctx& ctx, Ctl& ctl)
  338. {
  339.     if (m_data != 0)
  340. return;
  341.     const Code& code = getCode();
  342.     // allocate arguments
  343.     for (unsigned i = 1; i <= code.m_narg; i++) {
  344. ctx_assert(code.m_args != 0 && code.m_args[i] != 0);
  345. code.m_args[i]->alloc(ctx, ctl);
  346. if (! ctx.ok())
  347.     return;
  348.     }
  349.     SqlField sqlField(code.m_sqlSpec);
  350.     Data& data = *new Data(sqlField);
  351.     setData(data);
  352.     ctx_assert(ctl.m_groupIndex == 0);
  353.     init(ctx, ctl);
  354. }
  355. void
  356. Exec_expr_func::close(Ctx& ctx)
  357. {
  358.     const Code& code = getCode();
  359.     Data& data = getData();
  360.     for (unsigned i = 1; i <= code.m_narg; i++) {
  361. ctx_assert(code.m_args != 0 && code.m_args[i] != 0);
  362. code.m_args[i]->close(ctx);
  363.     }
  364.     data.m_groupField.clear();
  365.     Ctl ctl(0);
  366.     init(ctx, ctl);
  367. }
  368. void
  369. Exec_expr_func::print(Ctx& ctx)
  370. {
  371.     const Code& code = getCode();
  372.     ctx.print(" [%s", code.m_func.m_name);
  373.     for (unsigned i = 1; i <= code.m_narg; i++) {
  374. Exec_base* a[] = { code.m_args[i] };
  375. printList(ctx, a, sizeof(a)/sizeof(a[0]));
  376.     }
  377.     ctx.print("]");
  378. }