Esempio n. 1
0
void SqlCompiler::checkExpressionType(InsertColumnExpression &col) {
  const SyntaxNode *p = findFirstTableReference(col.m_expr);
  if(p != NULL)
    syntaxError(p,SQL_INVALID_EXPR_TYPE,_T("Columnnames not allowed in valuelist"));

  p = findFirstAggregateFunction(col.m_expr);
  if(p != NULL)
    syntaxError(p,SQL_INVALID_EXPR_TYPE,_T("Aggregation not allowed in valuelist"));

  DbMainType exprtype = checkValueExpressionMainType(col.m_expr);
  DbMainType coltype  = getMainType(col.getType());
  if(!isCompatibleType(exprtype,coltype)) {
    switch(coltype) {
    case MAINTYPE_NUMERIC  :
      syntaxError(col.m_expr,SQL_INVALID_EXPR_TYPE,_T("Illegal type of expression. Must be numeric"));
      break;
    case MAINTYPE_STRING   :
    case MAINTYPE_VARCHAR  :
      syntaxError(col.m_expr,SQL_INVALID_EXPR_TYPE,_T("Illegal type of expression. Must be String"));
      break;
    case MAINTYPE_DATE     :
      syntaxError(col.m_expr,SQL_INVALID_EXPR_TYPE,_T("Illegal type of expression. Must be Date"));
      break;
    case MAINTYPE_TIME     :
      syntaxError(col.m_expr,SQL_INVALID_EXPR_TYPE,_T("Illegal type of expression. Must be time"));
      break;
    case MAINTYPE_TIMESTAMP:
      syntaxError(col.m_expr,SQL_INVALID_EXPR_TYPE,_T("Illegal type of expression. Must be Timestamp"));
      break;
    default                :
      stopcomp(col.m_expr);
    }
  }
}
Esempio n. 2
0
bool vesUniform::getElement(unsigned int index, vesMatrix4x4f &value) const
{
  if (index >= this->m_numberElements || !isCompatibleType(FloatMat4))
    return false;

  for (unsigned int i = 0; i < 16; ++i)
    value.data()[i] = (&m_floatArray->front())[i];

  return true;
}
Esempio n. 3
0
bool vesUniform::getElement(unsigned int index, float &value) const
{
  if (index >= this->m_numberElements || !isCompatibleType(Float))
    return false;

  unsigned int j = index * getTypeNumberOfComponents(this->m_type);

  value = (*this->m_floatArray)[j];
  return true;
}
Esempio n. 4
0
bool vesUniform::setElement(unsigned int index, bool value)
{
  if (index >= this->m_numberElements || !isCompatibleType(Bool))
    return false;

    unsigned int j = index * getTypeNumberOfComponents(getType());

    (*this->m_intArray)[j] = value;

    // \todo: Make state dirty.

    return true;
}
Esempio n. 5
0
bool vesUniform::setElement(unsigned int index, const vesMatrix4x4f &matrix)
{
  if (index >= this->m_numberElements || !isCompatibleType(FloatMat4))
    return false;

  unsigned int j = index * getTypeNumberOfComponents(this->m_type);

  for (int i = 0; i < 16; ++i)
    (*this->m_floatArray)[j+i] = matrix.data()[i];

  // \todo: Make state dirty.

  return true;
}
Esempio n. 6
0
bool vesUniform::setElement(unsigned int index, const vesVector2f &vector)
{
  if (index >= this->m_numberElements || !isCompatibleType(FloatVec2))
    return false;

  unsigned int j = index * getTypeNumberOfComponents(this->m_type);

  (*this->m_floatArray)[j]   = vector[0];
  (*this->m_floatArray)[j+1] = vector[1];

  // \todo: Make state dirty.

  return true;
}
TableCursorKey::TableCursorKey(const KeyFileDefinition &keydef, const Tuple *keytuple, UINT fieldCount, RelationType relop) : m_keydef(keydef) {
  m_fieldCount = fieldCount;
  m_key.init();
  m_relop = relop;
  if(relop == RELOP_FALSE || relop == RELOP_TRUE) return;
  if(relop == RELOP_NQ) {
    m_relop = RELOP_TRUE;
    m_fieldCount = 0;
    return;
  }
  if(fieldCount == 0) {
    return;
  }
  if(keytuple == NULL) {
    throwSqlError(SQL_FATAL_ERROR,_T("TableCursorKey:No Tuple specified but field = %d"),fieldCount);
  }
  const Tuple &tuple = *keytuple;
  if(fieldCount > tuple.size()) {
    throwSqlError(SQL_FATAL_ERROR,_T("TableCursorKey:invalid fieldCount (=%d) specified. Tuple.size = %zd")
                                 ,fieldCount,tuple.size());
  }
  for(UINT i = 0; i < fieldCount; i++) {
    DbFieldType tupleType = tuple[i].getType();
    DbFieldType keyType = keydef.getFieldDef(i).getType();

    if(!isCompatibleType(keyType,tupleType)) {
       throwSqlError(SQL_TYPEMISMATCH,_T("Incompatible types in keydefinition(%s) and tupledefinition(%s)")
                     ,getTypeString(keyType)
                     ,getTypeString(tupleType));
    }

    const TupleField &tupField = tuple[i];
    switch(getMainType(tupleType)) {
    case MAINTYPE_NUMERIC :
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        double d;
        tupField.get(d);
        if(putField(i,d)) return;
        break;
      }

    case MAINTYPE_STRING  :
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        String str;
        tupField.get(str);
        switch(getMainType(keyType)) {
        case MAINTYPE_STRING:
          if(putField(i,str)) return;
          break;
        case MAINTYPE_VARCHAR:
          { varchar vch(str.cstr());
            if(putField(i,vch)) return;
          }
        }
      }
      break;

    case MAINTYPE_VARCHAR :
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        varchar vch;
        tupField.get(vch);

        switch(getMainType(keyType)) {
        case MAINTYPE_STRING:
          { String    str((TCHAR*)vch.data());
            if(putField(i,str)) return;
            break;
          }
        case MAINTYPE_VARCHAR:
          if(putField(i,vch)) return;
          break;
        }
      }
      break;

    case MAINTYPE_DATE    :
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        Date d;
        tupField.get(d);
        keydef.put(m_key, i, d);
      }
      break;

    case MAINTYPE_TIME    :
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        Time d;
        tupField.get(d);
        keydef.put(m_key, i, d);
      }
      break;

    case MAINTYPE_TIMESTAMP:
      { if(!tupField.isDefined()) {
          setUndefinedField(i);
          return;
        }
        Timestamp d;
        tupField.get(d);
        keydef.put(m_key, i, d);
      }
      break;

    default:
      throwSqlError(SQL_FATAL_ERROR,_T("TableCursorKey:Invalid DbMainType :%d")
                                   ,getMainType(tupleType));
      break;
    }
  }
}
Esempio n. 8
0
DbMainType SqlCompiler::checkValueExpressionMainType(const SyntaxNode *expr) {
  DbMainType m1,m2,m3;
  int i;
  switch(expr->token()) {
  case MULT     :
  case DIVOP    :
  case MODOP    :
  case EXPO     :
    m1 = checkValueExpressionMainType(expr->child(0));
    m2 = checkValueExpressionMainType(expr->child(1));
    if(m1 != MAINTYPE_NUMERIC && m1 != MAINTYPE_VOID)
      syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    if(m2 != MAINTYPE_NUMERIC && m2 != MAINTYPE_VOID)
      syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    return MAINTYPE_NUMERIC;

  case PLUS     :
    switch(checkValueExpressionMainType(expr->child(0))) {
    case MAINTYPE_NUMERIC:
      m2 = checkValueExpressionMainType(expr->child(1));
      if(m2 != MAINTYPE_NUMERIC && m2 != MAINTYPE_VOID)
        syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
      return MAINTYPE_NUMERIC;

    case MAINTYPE_STRING :
    case MAINTYPE_VARCHAR:
      syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
      return MAINTYPE_NUMERIC;

    case MAINTYPE_DATE   :
      switch(checkValueExpressionMainType(expr->child(1))) {
      case MAINTYPE_NUMERIC:
        return MAINTYPE_DATE;

      case MAINTYPE_STRING :
      case MAINTYPE_VARCHAR:
        syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
        return MAINTYPE_DATE;

      case MAINTYPE_DATE   :
        syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
        return MAINTYPE_DATE;

      case MAINTYPE_VOID   :
        return MAINTYPE_VOID;
      }
      break;

    case MAINTYPE_VOID:
      m2 = checkValueExpressionMainType(expr->child(1));
      if(m2 != MAINTYPE_NUMERIC && m2 != MAINTYPE_VOID)
        syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
      return MAINTYPE_VOID;
    }
    break;
  case MINUS    :
    if(expr->childCount() < 2) {
      switch(checkValueExpressionMainType(expr->child(0))) {
      case MAINTYPE_NUMERIC:
        return MAINTYPE_NUMERIC;

      case MAINTYPE_STRING :
      case MAINTYPE_VARCHAR:
        syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
        return MAINTYPE_NUMERIC;

      case MAINTYPE_DATE   :
        syntaxError(expr,SQL_INVALID_EXPR_TYPE,_T("Unary minus not allowed on Date"));
        return MAINTYPE_DATE;

      case MAINTYPE_VOID   :
        return MAINTYPE_VOID;
      }
    }
    else {
      switch(checkValueExpressionMainType(expr->child(0))) {
      case MAINTYPE_NUMERIC:
        if(checkValueExpressionMainType(expr->child(1)) != MAINTYPE_NUMERIC)
          syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
        return MAINTYPE_NUMERIC;

      case MAINTYPE_STRING :
      case MAINTYPE_VARCHAR:
        syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
        return MAINTYPE_NUMERIC;

      case MAINTYPE_DATE   :
        switch(checkValueExpressionMainType(expr->child(1))) {
        case MAINTYPE_NUMERIC:
          return MAINTYPE_DATE;

        case MAINTYPE_STRING :
        case MAINTYPE_VARCHAR:
          syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
          return MAINTYPE_DATE;

        case MAINTYPE_DATE   :
          return MAINTYPE_NUMERIC;

        case MAINTYPE_VOID   :
          return MAINTYPE_VOID;
        }
        break;

      case MAINTYPE_VOID:
        return MAINTYPE_VOID;
      }
    }
    break;

  case SUBSTRING:
    m1 = checkValueExpressionMainType(expr->child(0));
    m2 = checkValueExpressionMainType(expr->child(1));
    m3 = checkValueExpressionMainType(expr->child(2));
    if(!isCompatibleType(m1,MAINTYPE_STRING))
      syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    if(!isCompatibleType(m2,MAINTYPE_NUMERIC))
      syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    if(!isCompatibleType(m3,MAINTYPE_NUMERIC))
      syntaxError(expr->child(2),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    return MAINTYPE_STRING;

  case CONCAT:
    m1 = checkValueExpressionMainType(expr->child(0));
    m2 = checkValueExpressionMainType(expr->child(1));
    if(!isCompatibleType(m1,MAINTYPE_STRING))
      syntaxError(expr->child(0),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    if(!isCompatibleType(m2,MAINTYPE_STRING))
      syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    return MAINTYPE_STRING;

  case TYPEDATE:
    for(i = 0; i < 3; i++) {
      m1 = checkValueExpressionMainType(expr->child(i));
      if(!isCompatibleType(m1,MAINTYPE_NUMERIC))
        syntaxError(expr->child(i),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    }
    return MAINTYPE_DATE;

  case TYPETIME:
    for(i = 0; i < 3; i++) {
      m1 = checkValueExpressionMainType(expr->child(i));
      if(!isCompatibleType(m1,MAINTYPE_NUMERIC))
        syntaxError(expr->child(i),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    }
    return MAINTYPE_TIME;

  case TYPETIMESTAMP:
    for(i = 0; i < 6; i++) {
      m1 = checkValueExpressionMainType(expr->child(i));
      if(!isCompatibleType(m1,MAINTYPE_NUMERIC))
        syntaxError(expr->child(i),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    }
    return MAINTYPE_TIMESTAMP;

  case COUNT    :
    if(expr->child(0)->token() == STAR)
      return MAINTYPE_NUMERIC;
    else
      checkValueExpressionMainType(expr->child(0)->child(0));
    return MAINTYPE_NUMERIC;

  case MIN      :
  case MAX      :
    return checkValueExpressionMainType(expr->child(2));

  case SUM      :
    m1 = checkValueExpressionMainType(expr->child(2));
    if(!isCompatibleType(m1,MAINTYPE_NUMERIC))
      syntaxError(expr->child(1),SQL_INVALID_EXPR_TYPE,_T("Illegal type of operand"));
    return MAINTYPE_NUMERIC;

  case NAME            :
  case DOT             :
    return MAINTYPE_NUMERIC;

  case NUMBER          :
    return MAINTYPE_NUMERIC;

  case STRING          :
    return MAINTYPE_STRING;

  case DATECONST       :
    return MAINTYPE_DATE;

  case TIMECONST       :
    return MAINTYPE_TIME;

  case TIMESTAMPCONST  :
    return MAINTYPE_TIMESTAMP;

  case HOSTVAR         :
    return getMainType(m_bndstmt.m_inHost[expr->getHostVarIndex()].getType());

  case NULLVAL         :
    return MAINTYPE_VOID;

  case CURRENTDATE     :
    return MAINTYPE_DATE;

  case CURRENTTIME     :
    return MAINTYPE_TIME;

  case CURRENTTIMESTAMP:
    return MAINTYPE_TIMESTAMP;

  case CAST            :
    { checkValueExpressionMainType(expr->child(0));
      CastParameter p = genCastParameter(expr->child(1));
      return getMainType(p.getType());
    }
  default       :
    stopcomp(expr);
  }
  return MAINTYPE_VOID;
}