/* * Update // Read by parser * <table> * SET * [<column>, <column>, ...] * WHERE <expression> * * <column> := <columnName> = <expression> * <table> := identifier */ void Update::Parse(Lexer& lex) { Token t; t = lex.NextToken(TokenType::Identifier); SetFrom(t.strData); // <column>s t = lex.NextToken("set", TokenType::Keyword); ReadColumns(lex); // Don't allow UPDATE without WHERE clause //if (lex.endOfStream()) // return; t = lex.NextToken("where", TokenType::Keyword); //if (t.type == TokenType::Keyword && t.strData == "where") //{ SetWhere(ExpressionPredicate(lex, IOperation::GetStandardOperations())); //} //else //{ // lex.PutBackToken(t); //} }
void Update::ReadColumns(Lexer& lex) { Token t; do { // <columnName> t = lex.NextToken(TokenType::Identifier); string name = t.strData; t = lex.NextToken("=", TokenType::Operator); // Expression // Read the expression ExpressionParser p(&lex, IOperation::GetStandardOperations()); Expression* expr = p.Parse(); columns[name] = expr; t = lex.NextToken(); } while (t.type == TokenType::Separator); lex.PutBackToken(t); }
/* * CREATE TABLE <name> ( * <columnDefinitions> * ) * * <name> == <columnName> == identifier * <columnDefinitions> := <columnName> <columnType> [, <columnDefinitions>] * <columnType> := byte | int | uint | char(<length>) * <length> == int */ void CreateTable::Parse(Lexer& lex) { Token t; // <name> t = lex.NextToken(TokenType::Identifier, false); name = t.strData; // ( lex.NextToken("(", TokenType::Parenthesis); string tableName; // While not ) do { Field f = parseField(lex); AddField(f); // , or ) t = lex.NextToken(); } while (t.type == TokenType::Separator); if (t.type != TokenType::Parenthesis || t.strData != ")") throw InvalidTokenException(t); }
Field CreateTable::parseField(Lexer& lex) { Field res; res.size = 0; Token t; // <columnName> t = lex.NextToken(TokenType::Identifier, false); if (t.strData.size() >= STORM_SQL_FIELD_NAME_SIZE) throw NameTooLong(); strcpy(res.name, t.strData.c_str()); // <columnType> t = lex.NextToken(TokenType::Keyword); if (t.strData == "byte") res.type = Field::FieldType::byte; else if (t.strData == "int") res.type = Field::FieldType::int32; else if (t.strData == "uint") res.type = Field::FieldType::uint32; else if (t.strData == "char") { res.type = Field::FieldType::fixedchar; // (<length>) lex.NextToken("(", TokenType::Parenthesis); t = lex.NextToken(TokenType::IntValue); lex.NextToken(")", TokenType::Parenthesis); res.size = t.longIntData; } else throw InvalidTokenException(t); return res; }
/* * DROP TABLE <name> */ void DropTable::Parse(Lexer& lex) { Token t = lex.NextToken(TokenType::Identifier, false); SetName(t.strData); }