Code_expr_param.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 "Code_expr_param.hpp"
  14. #include "Code_root.hpp"
  15. // Plan_expr_param
  16. Plan_expr_param::~Plan_expr_param()
  17. {
  18. }
  19. Plan_base*
  20. Plan_expr_param::analyze(Ctx& ctx, Ctl& ctl)
  21. {
  22.     m_exec = 0;
  23.     ctx_assert(m_paramNumber != 0);
  24.     ctx_assert(m_paramNumber < m_root->m_paramList.size());
  25.     m_root->m_paramList[m_paramNumber] = this;
  26.     m_sqlType.setType(ctx, SqlType::Unbound);
  27.     // check if type is bound now
  28.     DescArea& ipd = descArea(Desc_usage_IPD);
  29.     if (m_paramNumber <= ipd.getCount()) {
  30. DescRec& rec = ipd.getRecord(m_paramNumber);
  31. OdbcData descData;
  32. rec.getField(ctx, SQL_DESC_TYPE, descData);
  33. if (descData.type() != OdbcData::Undef) {
  34.     SQLSMALLINT desc_TYPE = descData.smallint();
  35.     // XXX wrong but fixes sun.jdbc.odbc
  36.     if (desc_TYPE == SQL_CHAR)
  37. desc_TYPE = SQL_VARCHAR;
  38.     if (desc_TYPE == SQL_CHAR) {
  39. rec.getField(ctx, SQL_DESC_LENGTH, descData);
  40. if (descData.type() != OdbcData::Undef) {
  41.     unsigned desc_LENGTH = descData.uinteger();
  42.     m_sqlType.setType(ctx, SqlType::Char, desc_LENGTH);
  43. }
  44.     } else if (desc_TYPE == SQL_VARCHAR) {
  45. rec.getField(ctx, SQL_DESC_LENGTH, descData);
  46. if (descData.type() != OdbcData::Undef) {
  47.     unsigned desc_LENGTH = descData.uinteger();
  48.     m_sqlType.setType(ctx, SqlType::Varchar, desc_LENGTH);
  49. }
  50.     } else if (desc_TYPE == SQL_BINARY) {
  51. rec.getField(ctx, SQL_DESC_LENGTH, descData);
  52. if (descData.type() != OdbcData::Undef) {
  53.     unsigned desc_LENGTH = descData.uinteger();
  54.     m_sqlType.setType(ctx, SqlType::Binary, desc_LENGTH);
  55. }
  56.     } else if (desc_TYPE == SQL_VARBINARY) {
  57. rec.getField(ctx, SQL_DESC_LENGTH, descData);
  58. if (descData.type() != OdbcData::Undef) {
  59.     unsigned desc_LENGTH = descData.uinteger();
  60.     m_sqlType.setType(ctx, SqlType::Varbinary, desc_LENGTH);
  61. } else {
  62.     // XXX BLOB hack
  63.     unsigned desc_LENGTH = FAKE_BLOB_SIZE;
  64.     m_sqlType.setType(ctx, SqlType::Varbinary, desc_LENGTH);
  65. }
  66.     } else if (desc_TYPE == SQL_SMALLINT) {
  67. m_sqlType.setType(ctx, SqlType::Smallint);
  68.     } else if (desc_TYPE == SQL_INTEGER) {
  69. m_sqlType.setType(ctx, SqlType::Integer);
  70.     } else if (desc_TYPE == SQL_BIGINT) {
  71. m_sqlType.setType(ctx, SqlType::Bigint);
  72.     } else if (desc_TYPE == SQL_REAL) {
  73. m_sqlType.setType(ctx, SqlType::Real);
  74.     } else if (desc_TYPE == SQL_DOUBLE) {
  75. m_sqlType.setType(ctx, SqlType::Double);
  76.     } else if (desc_TYPE == SQL_TYPE_TIMESTAMP) {
  77. m_sqlType.setType(ctx, SqlType::Datetime);
  78.     // XXX BLOB hack
  79.     } else if (desc_TYPE == SQL_LONGVARBINARY) {
  80. m_sqlType.setType(ctx, SqlType::Varbinary, (unsigned)FAKE_BLOB_SIZE);
  81.     } else {
  82. ctx.pushStatus(Error::Gen, "parameter %u unsupported SQL type %d", m_paramNumber, (int)desc_TYPE);
  83. return 0;
  84.     }
  85.     char buf[100];
  86.     m_sqlType.print(buf, sizeof(buf));
  87.     ctx_log2(("parameter %u SQL type bound to %s", m_paramNumber, buf));
  88. }
  89.     }
  90.     return this;
  91. }
  92. void
  93. Plan_expr_param::describe(Ctx& ctx)
  94. {
  95.     DescArea& ipd = descArea(Desc_usage_IPD);
  96.     if (ipd.getCount() < m_paramNumber)
  97. ipd.setCount(ctx, m_paramNumber);
  98.     // XXX describe if possible
  99.     DescRec& rec = ipd.getRecord(m_paramNumber);
  100. }
  101. Exec_base*
  102. Plan_expr_param::codegen(Ctx& ctx, Ctl& ctl)
  103. {
  104.     if (m_exec != 0)
  105. return m_exec;
  106.     SqlSpec sqlSpec(m_sqlType, SqlSpec::Physical);
  107.     // create code
  108.     Exec_expr_param* exec = new Exec_expr_param(ctl.m_execRoot);
  109.     ctl.m_execRoot->saveNode(exec);
  110.     ctx_assert(m_paramNumber != 0);
  111.     Exec_expr_param::Code& code = *new Exec_expr_param::Code(sqlSpec, m_paramNumber);
  112.     exec->setCode(code);
  113.     m_exec = exec;
  114.     return exec;
  115. }
  116. void
  117. Plan_expr_param::print(Ctx& ctx)
  118. {
  119.     ctx.print(" [param %u]", m_paramNumber);
  120. }
  121. bool
  122. Plan_expr_param::isEqual(const Plan_expr* expr) const
  123. {
  124.     ctx_assert(expr != 0);
  125.     if (expr->type() != Plan_expr::TypeParam)
  126. return false;
  127.     const Plan_expr_param* expr2 = static_cast<const Plan_expr_param*>(expr);
  128.     // params are not equal ever
  129.     return false;
  130. }
  131. bool
  132. Plan_expr_param::isGroupBy(const Plan_expr_row* row) const
  133. {
  134.     // params are constants
  135.     return true;
  136. }
  137. // Exec_expr_param
  138. Exec_expr_param::Code::~Code()
  139. {
  140. }
  141. Exec_expr_param::Data::~Data()
  142. {
  143.     delete m_extField;
  144.     m_extField = 0;
  145. }
  146. Exec_expr_param::~Exec_expr_param()
  147. {
  148. }
  149. void
  150. Exec_expr_param::alloc(Ctx& ctx, Ctl& ctl)
  151. {
  152.     if (m_data != 0)
  153. return;
  154.     const Code& code = getCode();
  155.     SqlField sqlField(code.sqlSpec());
  156.     Data& data = *new Data(sqlField);
  157.     setData(data);
  158. }
  159. void
  160. Exec_expr_param::bind(Ctx& ctx)
  161. {
  162.     const Code& code = getCode();
  163.     Data& data = getData();
  164.     DescArea& apd = descArea(Desc_usage_APD);
  165.     if (apd.getCount() < code.m_paramNumber) {
  166. ctx_log1(("parameter %u is not bound", code.m_paramNumber));
  167. return;
  168.     }
  169.     const unsigned paramNumber = code.m_paramNumber;
  170.     DescRec& rec = apd.getRecord(paramNumber);
  171.     OdbcData descData;
  172.     // create type
  173.     rec.getField(ctx, SQL_DESC_TYPE, descData);
  174.     if (descData.type() == OdbcData::Undef) {
  175. ctx.pushStatus(Error::Gen, "parameter %u external type not defined", paramNumber);
  176. return;
  177.     }
  178.     ExtType extType;
  179.     SQLSMALLINT desc_TYPE = descData.smallint();
  180.     switch (desc_TYPE) {
  181.     case SQL_C_CHAR:
  182.     case SQL_C_SHORT: // for sun.jdbc.odbc
  183.     case SQL_C_SSHORT:
  184.     case SQL_C_USHORT:
  185.     case SQL_C_LONG: // for sun.jdbc.odbc
  186.     case SQL_C_SLONG:
  187.     case SQL_C_ULONG:
  188.     case SQL_C_SBIGINT:
  189.     case SQL_C_UBIGINT:
  190.     case SQL_C_FLOAT:
  191.     case SQL_C_DOUBLE:
  192.     case SQL_C_TYPE_TIMESTAMP:
  193.     case SQL_C_BINARY: // XXX BLOB hack
  194. break;
  195.     default:
  196. ctx.pushStatus(Error::Gen, "parameter %u unsupported external type %d", paramNumber, (int)desc_TYPE);
  197. return;
  198.     }
  199.     extType.setType(ctx, static_cast<ExtType::Type>(desc_TYPE));
  200.     ExtSpec extSpec(extType);
  201.     // create data field
  202.     rec.getField(ctx, SQL_DESC_DATA_PTR, descData);
  203.     if (descData.type() == OdbcData::Undef) {
  204. ctx.pushStatus(Error::Gen, "parameter %u data address not defined", paramNumber);
  205. return;
  206.     }
  207.     SQLPOINTER desc_DATA_PTR = descData.pointer();
  208.     rec.getField(ctx, SQL_DESC_OCTET_LENGTH, descData);
  209.     if (descData.type() == OdbcData::Undef) {
  210. ctx.pushStatus(Error::Gen, "parameter %u data length not defined", paramNumber);
  211. return;
  212.     }
  213.     SQLINTEGER desc_OCTET_LENGTH = descData.integer();
  214.     rec.getField(ctx, SQL_DESC_INDICATOR_PTR, descData);
  215.     if (descData.type() == OdbcData::Undef) {
  216. ctx.pushStatus(Error::Gen, "parameter %u indicator address not defined", paramNumber);
  217. return;
  218.     }
  219.     SQLINTEGER* desc_INDICATOR_PTR = descData.integerPtr();
  220.     ctx_log4(("parameter %u bind to 0x%x %d 0x%x", paramNumber, (unsigned)desc_DATA_PTR, (int)desc_OCTET_LENGTH, (unsigned)desc_INDICATOR_PTR));
  221.     ExtField& extField = *new ExtField(extSpec, desc_DATA_PTR, desc_OCTET_LENGTH, desc_INDICATOR_PTR, paramNumber);
  222.     data.m_atExec = false;
  223.     if (desc_INDICATOR_PTR != 0 && *desc_INDICATOR_PTR < 0) {
  224. if (*desc_INDICATOR_PTR == SQL_NULL_DATA) {
  225.     ;
  226. } else if (*desc_INDICATOR_PTR == SQL_DATA_AT_EXEC) {
  227.     data.m_atExec = true;
  228. } else if (*desc_INDICATOR_PTR <= SQL_LEN_DATA_AT_EXEC(0)) {
  229.     data.m_atExec = true;
  230. }
  231.     }
  232.     delete data.m_extField;
  233.     data.m_extField = &extField;
  234. }
  235. void
  236. Exec_expr_param::evaluate(Ctx& ctx, Ctl& ctl)
  237. {
  238.     if (ctl.m_postEval)
  239. return;
  240.     const Code& code = getCode();
  241.     Data& data = getData();
  242.     if (data.m_atExec)
  243. return;
  244.     ctx_assert(data.m_extField != 0);
  245.     data.m_sqlField.copyin(ctx, *data.m_extField);
  246. }
  247. void
  248. Exec_expr_param::close(Ctx& ctx)
  249. {
  250.     Data& data = getData();
  251.     data.m_extPos = -1;
  252. }
  253. void
  254. Exec_expr_param::print(Ctx& ctx)
  255. {
  256.     const Code& code = getCode();
  257.     ctx.print(" [param %u]", code.m_paramNumber);
  258. }