From: <ibr...@us...> - 2013-07-09 16:27:49
|
Revision: 4676 http://sourceforge.net/p/tora/code/4676 Author: ibre5041 Date: 2013-07-09 16:27:38 +0000 (Tue, 09 Jul 2013) Log Message: ----------- Support for ((SELECT * FROM DUAL)) Modified Paths: -------------- branches/tora3/src/parsing/tsqllexer.h branches/tora3/src/parsing/tsqllexeroracle2.cc Modified: branches/tora3/src/parsing/tsqllexer.h =================================================================== --- branches/tora3/src/parsing/tsqllexer.h 2013-07-08 19:19:45 UTC (rev 4675) +++ branches/tora3/src/parsing/tsqllexer.h 2013-07-09 16:27:38 UTC (rev 4676) @@ -56,23 +56,23 @@ X_UNASSIGNED = 0 , X_EOF , X_EOL - , X_FAILURE - , X_ONE_LINE + , X_FAILURE // invalid character not understood by lexer + , X_ONE_LINE // SQLPlus command // White space "hidden" channel - , X_WHITE - , X_COMMENT - , X_COMMENT_ML - , X_COMMENT_ML_END + , X_WHITE // "white" char space, tab, newline + , X_COMMENT // single line comment, preferable without newline part + , X_COMMENT_ML // Multi-line comment (the correct one) + , X_COMMENT_ML_END // Partially edited multi-line comment, usually ends with EOF // Leaf node - , L_RESERVED + , L_RESERVED // Reserved word , L_IDENTIFIER - , L_BUILDIN - , L_STRING - , L_LPAREN - , L_RPAREN - , L_DML_INTRODUCER - , L_PL_INTRODUCER - , L_OTHER_INTRODUCER + , L_BUILDIN // Buildin function name + , L_STRING // single/double quoted string + , L_LPAREN // '(' + , L_RPAREN // ')' + , L_DML_INTRODUCER // SELECT, INSERT, UPDATE + , L_PL_INTRODUCER // DECLARE, BEGIN, CREATE, PACKAGE, PROCEDURE + , L_OTHER_INTRODUCER // ALTER, EXPLAIN, ... }; inline Token(); Modified: branches/tora3/src/parsing/tsqllexeroracle2.cc =================================================================== --- branches/tora3/src/parsing/tsqllexeroracle2.cc 2013-07-08 19:19:45 UTC (rev 4675) +++ branches/tora3/src/parsing/tsqllexeroracle2.cc 2013-07-09 16:27:38 UTC (rev 4676) @@ -307,16 +307,50 @@ Lexer::token_const_iterator OracleGuiLexer::findStartToken( Lexer::token_const_iterator const &start) { + // These Token types can start new statement QSet<SQLLexer::Token::TokenType> INTRODUCERS = QSet<SQLLexer::Token::TokenType>() << SQLLexer::Token::L_DML_INTRODUCER << SQLLexer::Token::L_PL_INTRODUCER << SQLLexer::Token::L_OTHER_INTRODUCER << SQLLexer::Token::L_LPAREN << SQLLexer::Token::X_ONE_LINE - ; - token_const_iterator i(start); - i = i.consumeUntil(INTRODUCERS); - return i; + ; + token_const_iterator i(start); + while(i->getTokenType() != SQLLexer::Token::X_EOF) + { + i = i.consumeUntil(INTRODUCERS); + if(i->getTokenType() != SQLLexer::Token::L_LPAREN) + return i; // Return this Token - it is not LPAREN '(' + + bool exitLoop = false; + // LPAREN starts a new SQL query if and only if it's followed by SELECT + // create a duplicit iterator and iterate it until something interesting is found + { + token_const_iterator j(i); + while(j->getTokenType() != SQLLexer::Token::X_EOF && !exitLoop) + { + j++; + switch(j->getTokenType()) + { + case SQLLexer::Token::X_WHITE: + case SQLLexer::Token::X_COMMENT: + case SQLLexer::Token::X_COMMENT_ML: + case SQLLexer::Token::X_COMMENT_ML_END: + case SQLLexer::Token::X_EOL: + case SQLLexer::Token::L_LPAREN: // SQL QUERY can start with multiple LPARENs '((( SELECT ...' + continue; // nothing interesting was found, try the next Token + case SQLLexer::Token::L_DML_INTRODUCER: + if(j->getText().compare("SELECT", Qt::CaseInsensitive) == 0 ) + return i; // SELECT was found return position of LPAREN + return j; // otherwise return position of the DML Token + default: + exitLoop = true; // SELECT was not found => exit the loop; + } + } + i = j; // Advance position of the outer loop iterator - continue looping + } + } + return i; // NOTE: this will only return EOF } Lexer::token_const_iterator OracleGuiLexer::findEndToken( Lexer::token_const_iterator const &start) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |