@@ -240,6 +240,7 @@ typedef enum {
240240 SQLTAG_EVENT ,
241241 SQLTAG_FUNCTION ,
242242 SQLTAG_INDEX ,
243+ SQLTAG_TYPE ,
243244 SQLTAG_LOCAL_VARIABLE ,
244245 SQLTAG_SYNONYM ,
245246 SQLTAG_PROCEDURE ,
@@ -270,6 +271,8 @@ static kindDefinition SqlKinds [] = {
270271 { true, 'e' , "event" , "events" },
271272 { true, 'f' , "function" , "functions" },
272273 { true, 'i' , "index" , "indexes" },
274+ { true, 'k' , "type" , "types" ,
275+ .version = 1 },
273276 { false, 'l' , "local" , "local variables" },
274277 { true, 'n' , "synonym" , "synonyms" },
275278 { true, 'p' , "procedure" , "procedures" },
@@ -1714,34 +1717,59 @@ static void parseType (tokenInfo *const token)
17141717 readToken (name );
17151718 if (isType (name , TOKEN_IDENTIFIER ))
17161719 {
1720+ int r = makeSqlTag (name , SQLTAG_TYPE );
1721+
17171722 readToken (token );
17181723 if (isKeyword (token , KEYWORD_is ))
17191724 {
17201725 readToken (token );
1721- switch ( token -> keyword )
1726+ if ( isType ( token , TOKEN_KEYWORD ) )
17221727 {
1728+ switch (token -> keyword )
1729+ {
17231730 case KEYWORD_record :
17241731 case KEYWORD_object :
1732+ markCorkEntryAsPlaceholder (r , true);
17251733 makeSqlTag (name , SQLTAG_RECORD );
17261734 addToScope (token , name -> string , SQLTAG_RECORD );
17271735 parseRecord (token );
17281736 break ;
17291737
17301738 case KEYWORD_table :
1739+ markCorkEntryAsPlaceholder (r , true);
17311740 makeSqlTag (name , SQLTAG_TABLE );
17321741 break ;
17331742
17341743 case KEYWORD_ref :
17351744 readToken (token );
17361745 if (isKeyword (token , KEYWORD_cursor ))
1746+ {
1747+ markCorkEntryAsPlaceholder (r , true);
17371748 makeSqlTag (name , SQLTAG_CURSOR );
1749+ }
17381750 break ;
17391751
17401752 default : break ;
1753+ /* TODO: PostgreSQL can take 'enum (' and 'range (' here. */
1754+ }
1755+ }
1756+ else if (isType (token , TOKEN_OPEN_PAREN ))
1757+ {
1758+ if (isLanguageKindEnabled (Lang_sql , SQLTAG_RECORD ))
1759+ {
1760+ /* Uses type kind only if the record kind is disable. */
1761+ markCorkEntryAsPlaceholder (r , true);
1762+ makeSqlTag (name , SQLTAG_RECORD );
1763+ }
1764+ addToScope (token , name -> string , SQLTAG_RECORD );
1765+ parseRecord (token );
17411766 }
17421767 vStringClear (token -> scope );
17431768 token -> scopeKind = SQLTAG_COUNT ;
17441769 }
1770+ else if (isType (token , TOKEN_SEMICOLON ))
1771+ /* Type declaration (or shell type); don't make a "type" tag for it. */
1772+ markCorkEntryAsPlaceholder (r , true);
17451773 }
17461774 vStringCopy (token -> scope , saveScope );
17471775 token -> scopeKind = saveScopeKind ;
0 commit comments