Skip to content

Commit b88745e

Browse files
committed
SQL: make foreign tags for 'interenal' functions
Signed-off-by: Masatake YAMATO <[email protected]>
1 parent d6792de commit b88745e

File tree

4 files changed

+49
-0
lines changed

4 files changed

+49
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
--sort=no
2+
--fields=+lSr
3+
--extras=+r
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
isnlt input.sql /^CREATE FUNCTION isnlt(ean13, ean13)$/;" f language:SQL typeref:typename:boolean signature:(ean13, ean13) roles:def
2+
int8lt input.sql /^ AS 'int8lt'$/;" f language:C roles:foreigncall
3+
isnle input.sql /^CREATE FUNCTION isnle(ean13, ean13)$/;" f language:SQL typeref:typename:boolean signature:(ean13, ean13) roles:def
4+
int8le input.sql /^ AS 'int8le'$/;" f language:C roles:foreigncall
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE FUNCTION isnlt(ean13, ean13)
2+
RETURNS boolean
3+
AS 'int8lt'
4+
LANGUAGE 'internal'
5+
IMMUTABLE STRICT
6+
PARALLEL SAFE;
7+
CREATE FUNCTION isnle(ean13, ean13)
8+
RETURNS boolean
9+
AS 'int8le'
10+
LANGUAGE 'internal'
11+
IMMUTABLE STRICT
12+
PARALLEL SAFE;

parsers/sql.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
#include "xtag.h"
3131
#include "promise.h"
3232

33+
#include "dependency.h"
34+
#include "cxx/cxx_tag.h"
35+
3336
/*
3437
* On-line "Oracle Database PL/SQL Language Reference":
3538
* http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/toc.htm
@@ -505,6 +508,8 @@ static struct SqlReservedWord SqlReservedWord [SQLKEYWORD_COUNT] = {
505508
[KEYWORD_without] = {0 & 0&1&1&0 & 0&0 & 0},
506509
};
507510

511+
static langType Lang_c;
512+
508513
/*
509514
* FUNCTION DECLARATIONS
510515
*/
@@ -2203,6 +2208,16 @@ static void parseBlock (tokenInfo *const token, const bool local)
22032208
parseBlockFull (token, local, LANG_IGNORE);
22042209
}
22052210

2211+
static void makeSqlTagForInternalFunction (tokenInfo *const token)
2212+
{
2213+
tagEntryInfo foreignEntry;
2214+
initForeignRefTagEntry (
2215+
&foreignEntry, vStringValue (token->string), Lang_c,
2216+
CXXTagKindFUNCTION, CXXTagFUNCTIONRoleFOREIGNCALL);
2217+
updateTagLine (&foreignEntry, token->lineNumber, token->filePosition);
2218+
makeTagEntry (&foreignEntry);
2219+
}
2220+
22062221
static void parseBlockFull (tokenInfo *const token, const bool local, langType lang)
22072222
{
22082223
int promise = -1;
@@ -2222,6 +2237,9 @@ static void parseBlockFull (tokenInfo *const token, const bool local, langType l
22222237
promise = token->promise;
22232238
token->promise = -1;
22242239

2240+
tokenInfo *const body = newToken ();
2241+
copyToken (body, token);
2242+
22252243
readToken (token);
22262244
while (! isCmdTerm (token)
22272245
&& !isType (token, TOKEN_EOF))
@@ -2233,10 +2251,16 @@ static void parseBlockFull (tokenInfo *const token, const bool local, langType l
22332251
lang = getNamedLanguageFromToken (token);
22342252
if (lang != LANG_IGNORE)
22352253
readToken (token);
2254+
else if (vStringEqC (token->string, "internal"))
2255+
{
2256+
makeSqlTagForInternalFunction (body);
2257+
readToken (token);
2258+
}
22362259
}
22372260
else
22382261
readToken (token);
22392262
}
2263+
deleteToken (body);
22402264

22412265
if (promise != -1 && lang != LANG_IGNORE)
22422266
promiseUpdateLanguage(promise, lang);
@@ -3384,6 +3408,10 @@ extern parserDefinition* SqlParser (void)
33843408
static const char *const extensions [] = { "sql", NULL };
33853409
static const char *const aliases [] = {"pgsql", NULL };
33863410
parserDefinition* def = parserNew ("SQL");
3411+
static parserDependency dependencies [] = {
3412+
[0] = { DEPTYPE_FOREIGNER, "C", &Lang_c },
3413+
};
3414+
33873415
def->kindTable = SqlKinds;
33883416
def->kindCount = ARRAY_SIZE (SqlKinds);
33893417
def->extensions = extensions;
@@ -3393,5 +3421,7 @@ extern parserDefinition* SqlParser (void)
33933421
def->keywordTable = SqlKeywordTable;
33943422
def->keywordCount = ARRAY_SIZE (SqlKeywordTable);
33953423
def->useCork = CORK_QUEUE | CORK_SYMTAB;
3424+
def->dependencies = dependencies;
3425+
def->dependencyCount = ARRAY_SIZE (dependencies);
33963426
return def;
33973427
}

0 commit comments

Comments
 (0)