Ejemplo 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);
    }
  }
}
Ejemplo n.º 2
0
SyntaxNode *SqlCompiler::fetchDefaultValueNode(const ColumnDefinition &col) {
  if(col.m_defaultValue.length() == 0) { // has no default-value
    if(col.m_nullAllowed)
      return fetchTokenNode(NULLVAL,NULL);
    else
      return NULL; // no default, nulls not allowed. i.e. syntaxError !
  }
  else { // defaultvalue specified. now find the type an return a syntaxnode of the right type
    switch(getMainType(col.getType())) {
    case MAINTYPE_NUMERIC  :
      return fetchNumberNode(_ttof(col.m_defaultValue.cstr()));
    case MAINTYPE_STRING   :
    case MAINTYPE_VARCHAR  :
      return fetchStringNode(col.m_defaultValue.cstr());
    case MAINTYPE_DATE     :
      return fetchDateNode(Date(col.m_defaultValue.cstr()));
    case MAINTYPE_TIME     :
      return fetchTimeNode(Time(col.m_defaultValue.cstr()));
    case MAINTYPE_TIMESTAMP:
      return fetchTimestampNode(Timestamp(col.m_defaultValue.cstr()));
    default               :
      throwSqlError(SQL_FATAL_ERROR,_T("Unexpected datatype in fetchDefaultValueNode:%d col:<%s>\n"),col.getType(),col.m_name.cstr());
      return NULL; //  to make compiler happy
    }
  }
}
Ejemplo n.º 3
0
bool PedInstance::createActQFindEnemy(actionQueueGroupType &as) {
    as.state = 1;
    actionQueueType aq;
    aq.as = PedInstance::pa_smNone;
    aq.group_desc = PedInstance::gd_mThink;
    aq.state = 1;
    aq.ot_execute = PedInstance::ai_aFindEnemy;
    as.actions.push_back(aq);
    pedWeaponToUse pw_to_use;
    Mod *pMod = slots_[Mod::MOD_BRAIN];
    if (getMainType() == PedInstance::m_tpAgent) {
        aq.multi_var.enemy_var.pw_to_use.use_ranks = pMod || (!isOurAgent())
            ? true: false;
        WeaponInstance *wi = selectedWeapon();
        if (wi && wi->usesAmmo() && wi->ammoRemaining() == 0) {
            wi = NULL;
            setSelectedWeapon(-1);
        }
        if (wi && wi->canShoot()) {
            if (pMod) {
                // This overrides selected weapon
                // might be confusing for player
                if (pMod->getVersion() == Mod::MOD_V3) {
                    pw_to_use.desc = 5;
                    pw_to_use.wpn.dmg_type = wi->dmgType();
                } else if (pMod->getVersion() == Mod::MOD_V2) {
                    pw_to_use.desc = 4;
                    pw_to_use.wpn.dmg_type = wi->dmgType();
                } else {
                    // Mod::MOD_V1
                    pw_to_use.desc = 3;
                    pw_to_use.wpn.wpn_type = wi->getWeaponType();
                }
            } else {
                pw_to_use.desc = 2;
                pw_to_use.wpn.wi = wi;
            }
        } else {
            pw_to_use.desc = 5;
            pw_to_use.wpn.dmg_type = MapObject::dmg_Physical;
        }
    } else {
        pw_to_use.desc = 5;
        pw_to_use.wpn.dmg_type = MapObject::dmg_Physical;
    }
    if (createActQFiring(as, NULL, NULL, false, 0, &pw_to_use))
        as.actions.back().state |= 64;
    else
        return false;
    createActQFollowing(as, NULL, 1);
    as.actions.back().state |= 64;
    return true;
}
Ejemplo n.º 4
0
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;
    }
  }
}
Ejemplo n.º 5
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;
}