Skip to content

Commit

Permalink
SQL: generalize support for SQL Server square brackets quoting
Browse files Browse the repository at this point in the history
This fixes test case tests/ctags/bug1944150.sql.
  • Loading branch information
b4n committed Jun 24, 2013
1 parent 76a7d3c commit 8b11f9b
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 49 deletions.
92 changes: 44 additions & 48 deletions tagmanager/ctags/sql.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,26 @@ static void readToken (tokenInfo *const token)
}
}

/*
* reads an indentifier, possibly quoted:
* identifier
* "identifier"
* [identifier]
*/
static void readIdentifier (tokenInfo *const token)
{
readToken (token);
if (isType (token, TOKEN_OPEN_SQUARE))
{
tokenInfo *const close_square = newToken ();

readToken (token);
/* eat close swuare */
readToken (close_square);
deleteToken (close_square);
}
}

/*
* Token parsing functions
*/
Expand Down Expand Up @@ -1616,22 +1636,22 @@ static void parsePackage (tokenInfo *const token)
* CREATE OR REPLACE PACKAGE BODY owner.pkg_name AS
*/
tokenInfo *const name = newToken ();
readToken (name);
readIdentifier (name);
if (isKeyword (name, KEYWORD_body))
{
/*
* Ignore the BODY tag since we will process
* the body or prototypes in the same manner
*/
readToken (name);
readIdentifier (name);
}
/* Check for owner.pkg_name */
while (! isKeyword (token, KEYWORD_is))
{
readToken (token);
if ( isType(token, TOKEN_PERIOD) )
{
readToken (name);
readIdentifier (name);
}
}
if (isKeyword (token, KEYWORD_is))
Expand Down Expand Up @@ -1673,13 +1693,7 @@ static void parseTable (tokenInfo *const token)
*/

/* This could be a database, owner or table name */
readToken (name);
if (isType (name, TOKEN_OPEN_SQUARE))
{
readToken (name);
/* Read close square */
readToken (token);
}
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
Expand All @@ -1689,35 +1703,17 @@ static void parseTable (tokenInfo *const token)
* referenced with a blank owner:
* dbname..tablename
*/
readToken (name);
if (isType (name, TOKEN_OPEN_SQUARE))
{
readToken (name);
/* Read close square */
readToken (token);
}
readIdentifier (name);
/* Check if a blank name was provided */
if (isType (name, TOKEN_PERIOD))
{
readToken (name);
if (isType (name, TOKEN_OPEN_SQUARE))
{
readToken (name);
/* Read close square */
readToken (token);
}
readIdentifier (name);
}
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
/* This can only be the table name */
readToken (name);
if (isType (name, TOKEN_OPEN_SQUARE))
{
readToken (name);
/* Read close square */
readToken (token);
}
readIdentifier (name);
readToken (token);
}
}
Expand Down Expand Up @@ -1757,21 +1753,21 @@ static void parseIndex (tokenInfo *const token)
* create bitmap index "i6" on t1(c1)
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (name);
readIdentifier (name);
readToken (token);
}
if ( isKeyword (token, KEYWORD_on) &&
(isType (name, TOKEN_IDENTIFIER) || isType (name, TOKEN_STRING) ) )
{
readToken (owner);
readIdentifier (owner);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (owner);
readIdentifier (owner);
readToken (token);
}
addToScope(name, owner->string);
Expand All @@ -1794,11 +1790,11 @@ static void parseEvent (tokenInfo *const token)
* create event "dba"."e4" handler begin end;
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (name);
readIdentifier (name);
}
while (! (isKeyword (token, KEYWORD_handler) ||
(isType (token, TOKEN_SEMICOLON))) )
Expand Down Expand Up @@ -1840,11 +1836,11 @@ static void parseTrigger (tokenInfo *const token)
* create trigger "tr6" begin end;
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (name);
readIdentifier (name);
readToken (token);
}

Expand Down Expand Up @@ -1910,11 +1906,11 @@ static void parsePublication (tokenInfo *const token)
* create publication "dba"."pu4" ()
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (name);
readIdentifier (name);
readToken (token);
}
if (isType (token, TOKEN_OPEN_PAREN))
Expand Down Expand Up @@ -1944,7 +1940,7 @@ static void parseService (tokenInfo *const token)
* CALL sp_Something();
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isKeyword (token, KEYWORD_type))
{
Expand All @@ -1967,10 +1963,10 @@ static void parseDomain (tokenInfo *const token)
* CREATE DOMAIN|DATATYPE [AS] your_name ...;
*/

readToken (name);
readIdentifier (name);
if (isKeyword (name, KEYWORD_is))
{
readToken (name);
readIdentifier (name);
}
readToken (token);
if (isType (name, TOKEN_IDENTIFIER) ||
Expand Down Expand Up @@ -2009,7 +2005,7 @@ static void parseVariable (tokenInfo *const token)
* drop variable @varname3;
*/

readToken (name);
readIdentifier (name);
readToken (token);
if ( (isType (name, TOKEN_IDENTIFIER) || isType (name, TOKEN_STRING))
&& !isType (token, TOKEN_SEMICOLON) )
Expand All @@ -2033,7 +2029,7 @@ static void parseSynonym (tokenInfo *const token)
* drop variable @varname3;
*/

readToken (name);
readIdentifier (name);
readToken (token);
if ( (isType (name, TOKEN_IDENTIFIER) || isType (name, TOKEN_STRING))
&& isKeyword (token, KEYWORD_for) )
Expand All @@ -2057,11 +2053,11 @@ static void parseView (tokenInfo *const token)
* drop variable @varname3;
*/

readToken (name);
readIdentifier (name);
readToken (token);
if (isType (token, TOKEN_PERIOD))
{
readToken (name);
readIdentifier (name);
readToken (token);
}
if ( isType (token, TOKEN_OPEN_PAREN) )
Expand Down
2 changes: 1 addition & 1 deletion tests/ctags/bug1944150.sql.tags
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# format=tagmanager
cash_trade_comment.�65536�0
cash_trade_comment.tr_d_cash_trade_comment�65536�0

0 comments on commit 8b11f9b

Please sign in to comment.