1" Vim syntax file
2" Language: Oracle Procedureal SQL (PL/SQL)
3" Maintainer: Jeff Lanzarotta (jefflanzarotta at yahoo dot com)
4" Original Maintainer: C. Laurence Gonsalves (clgonsal@kami.com)
5" URL: http://lanzarotta.tripod.com/vim/syntax/plsql.vim.zip
6" Last Change: September 18, 2002
7" History: Geoff Evans & Bill Pribyl (bill at plnet dot org)
8"		Added 9i keywords.
9"	   Austin Ziegler (austin at halostatue dot ca)
10"		Added 8i+ features.
11"
12" For version 5.x, clear all syntax items.
13" For version 6.x, quit when a syntax file was already loaded.
14if version < 600
15  syntax clear
16elseif exists("b:current_syntax")
17  finish
18endif
19
20" Todo.
21syn keyword plsqlTodo TODO FIXME XXX DEBUG NOTE
22syn cluster plsqlCommentGroup contains=plsqlTodo
23
24syn case ignore
25
26syn match   plsqlGarbage "[^ \t()]"
27syn match   plsqlIdentifier "[a-z][a-z0-9$_#]*"
28syn match   plsqlHostIdentifier ":[a-z][a-z0-9$_#]*"
29
30" When wanted, highlight the trailing whitespace.
31if exists("c_space_errors")
32  if !exists("c_no_trail_space_error")
33    syn match plsqlSpaceError "\s\+$"
34  endif
35
36  if !exists("c_no_tab_space_error")
37    syn match plsqlSpaceError " \+\t"me=e-1
38  endif
39endif
40
41" Symbols.
42syn match   plsqlSymbol "\(;\|,\|\.\)"
43
44" Operators.
45syn match   plsqlOperator "\(+\|-\|\*\|/\|=\|<\|>\|@\|\*\*\|!=\|\~=\)"
46syn match   plsqlOperator "\(^=\|<=\|>=\|:=\|=>\|\.\.\|||\|<<\|>>\|\"\)"
47
48" Some of Oracle's SQL keywords.
49syn keyword plsqlSQLKeyword ABORT ACCESS ACCESSED ADD AFTER ALL ALTER AND ANY
50syn keyword plsqlSQLKeyword AS ASC ATTRIBUTE AUDIT AUTHORIZATION AVG BASE_TABLE
51syn keyword plsqlSQLKeyword BEFORE BETWEEN BY CASCADE CAST CHECK CLUSTER
52syn keyword plsqlSQLKeyword CLUSTERS COLAUTH COLUMN COMMENT COMPRESS CONNECT
53syn keyword plsqlSQLKeyword CONSTRAINT CRASH CREATE CURRENT DATA DATABASE
54syn keyword plsqlSQLKeyword DATA_BASE DBA DEFAULT DELAY DELETE DESC DISTINCT
55syn keyword plsqlSQLKeyword DROP DUAL ELSE EXCLUSIVE EXISTS EXTENDS EXTRACT
56syn keyword plsqlSQLKeyword FILE FORCE FOREIGN FROM GRANT GROUP HAVING HEAP
57syn keyword plsqlSQLKeyword IDENTIFIED IDENTIFIER IMMEDIATE IN INCLUDING
58syn keyword plsqlSQLKeyword INCREMENT INDEX INDEXES INITIAL INSERT INSTEAD
59syn keyword plsqlSQLKeyword INTERSECT INTO INVALIDATE IS ISOLATION KEY LIBRARY
60syn keyword plsqlSQLKeyword LIKE LOCK MAXEXTENTS MINUS MODE MODIFY MULTISET
61syn keyword plsqlSQLKeyword NESTED NOAUDIT NOCOMPRESS NOT NOWAIT OF OFF OFFLINE
62syn keyword plsqlSQLKeyword ON ONLINE OPERATOR OPTION OR ORDER ORGANIZATION
63syn keyword plsqlSQLKeyword PCTFREE PRIMARY PRIOR PRIVATE PRIVILEGES PUBLIC
64syn keyword plsqlSQLKeyword QUOTA RELEASE RENAME REPLACE RESOURCE REVOKE ROLLBACK
65syn keyword plsqlSQLKeyword ROW ROWLABEL ROWS SCHEMA SELECT SEPARATE SESSION SET
66syn keyword plsqlSQLKeyword SHARE SIZE SPACE START STORE SUCCESSFUL SYNONYM
67syn keyword plsqlSQLKeyword SYSDATE TABLE TABLES TABLESPACE TEMPORARY TO TREAT
68syn keyword plsqlSQLKeyword TRIGGER TRUNCATE UID UNION UNIQUE UNLIMITED UPDATE
69syn keyword plsqlSQLKeyword USE USER VALIDATE VALUES VIEW WHENEVER WHERE WITH
70
71" PL/SQL's own keywords.
72syn keyword plsqlKeyword AGENT AND ANY ARRAY ASSIGN AS AT AUTHID BEGIN BODY BY
73syn keyword plsqlKeyword BULK C CASE CHAR_BASE CHARSETFORM CHARSETID CLOSE
74syn keyword plsqlKeyword COLLECT CONSTANT CONSTRUCTOR CONTEXT CURRVAL DECLARE
75syn keyword plsqlKeyword DVOID EXCEPTION EXCEPTION_INIT EXECUTE EXIT FETCH
76syn keyword plsqlKeyword FINAL FUNCTION GOTO HASH IMMEDIATE IN INDICATOR
77syn keyword plsqlKeyword INSTANTIABLE IS JAVA LANGUAGE LIBRARY MAP MAXLEN
78syn keyword plsqlKeyword MEMBER NAME NEW NOCOPY NUMBER_BASE OBJECT OCICOLL
79syn keyword plsqlKeyword OCIDATE OCIDATETIME OCILOBLOCATOR OCINUMBER OCIRAW
80syn keyword plsqlKeyword OCISTRING OF OPAQUE OPEN OR ORDER OTHERS OUT
81syn keyword plsqlKeyword OVERRIDING PACKAGE PARALLEL_ENABLE PARAMETERS
82syn keyword plsqlKeyword PARTITION PIPELINED PRAGMA PROCEDURE RAISE RANGE REF
83syn keyword plsqlKeyword RESULT RETURN REVERSE ROWTYPE SB1 SELF SHORT SIZE_T
84syn keyword plsqlKeyword SQL SQLCODE SQLERRM STATIC STRUCT SUBTYPE TDO THEN
85syn keyword plsqlKeyword TABLE TIMEZONE_ABBR TIMEZONE_HOUR TIMEZONE_MINUTE
86syn keyword plsqlKeyword TIMEZONE_REGION TYPE UNDER UNSIGNED USING VARIANCE
87syn keyword plsqlKeyword VARRAY VARYING WHEN WRITE
88syn match   plsqlKeyword "\<END\>"
89syn match   plsqlKeyword "\.COUNT\>"hs=s+1
90syn match   plsqlKeyword "\.EXISTS\>"hs=s+1
91syn match   plsqlKeyword "\.FIRST\>"hs=s+1
92syn match   plsqlKeyword "\.LAST\>"hs=s+1
93syn match   plsqlKeyword "\.DELETE\>"hs=s+1
94syn match   plsqlKeyword "\.PREV\>"hs=s+1
95syn match   plsqlKeyword "\.NEXT\>"hs=s+1
96
97" PL/SQL functions.
98syn keyword plsqlFunction ABS ACOS ADD_MONTHS ASCII ASCIISTR ASIN ATAN ATAN2
99syn keyword plsqlFunction BFILENAME BITAND CEIL CHARTOROWID CHR COALESCE
100syn keyword plsqlFunction COMMIT COMMIT_CM COMPOSE CONCAT  CONVERT  COS COSH
101syn keyword plsqlFunction COUNT CUBE CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP
102syn keyword plsqlFunction DBTIMEZONE DECODE DECOMPOSE DEREF DUMP EMPTY_BLOB
103syn keyword plsqlFunction EMPTY_CLOB EXISTS EXP FLOOR FROM_TZ GETBND GLB
104syn keyword plsqlFunction GREATEST GREATEST_LB GROUPING HEXTORAW  INITCAP
105syn keyword plsqlFunction INSTR INSTR2 INSTR4 INSTRB INSTRC ISNCHAR LAST_DAY
106syn keyword plsqlFunction LEAST LEAST_UB LENGTH LENGTH2 LENGTH4 LENGTHB LENGTHC
107syn keyword plsqlFunction LN LOCALTIME LOCALTIMESTAMP LOG LOWER LPAD
108syn keyword plsqlFunction LTRIM LUB MAKE_REF MAX MIN MOD MONTHS_BETWEEN
109syn keyword plsqlFunction NCHARTOROWID NCHR NEW_TIME NEXT_DAY NHEXTORAW
110syn keyword plsqlFunction NLS_CHARSET_DECL_LEN NLS_CHARSET_ID NLS_CHARSET_NAME
111syn keyword plsqlFunction NLS_INITCAP NLS_LOWER NLSSORT NLS_UPPER NULLFN NULLIF
112syn keyword plsqlFunction NUMTODSINTERVAL NUMTOYMINTERVAL NVL POWER
113syn keyword plsqlFunction RAISE_APPLICATION_ERROR RAWTOHEX RAWTONHEX REF
114syn keyword plsqlFunction REFTOHEX REPLACE ROLLBACK_NR ROLLBACK_SV ROLLUP ROUND
115syn keyword plsqlFunction ROWIDTOCHAR ROWIDTONCHAR ROWLABEL RPAD RTRIM
116syn keyword plsqlFunction SAVEPOINT SESSIONTIMEZONE SETBND SET_TRANSACTION_USE
117syn keyword plsqlFunction SIGN SIN SINH SOUNDEX SQLCODE SQLERRM SQRT STDDEV
118syn keyword plsqlFunction SUBSTR SUBSTR2 SUBSTR4 SUBSTRB SUBSTRC SUM
119syn keyword plsqlFunction SYS_AT_TIME_ZONE SYS_CONTEXT SYSDATE SYS_EXTRACT_UTC
120syn keyword plsqlFunction SYS_GUID SYS_LITERALTODATE SYS_LITERALTODSINTERVAL
121syn keyword plsqlFunction SYS_LITERALTOTIME SYS_LITERALTOTIMESTAMP
122syn keyword plsqlFunction SYS_LITERALTOTZTIME SYS_LITERALTOTZTIMESTAMP
123syn keyword plsqlFunction SYS_LITERALTOYMINTERVAL SYS_OVER__DD SYS_OVER__DI
124syn keyword plsqlFunction SYS_OVER__ID SYS_OVER_IID SYS_OVER_IIT
125syn keyword plsqlFunction SYS_OVER__IT SYS_OVER__TI SYS_OVER__TT
126syn keyword plsqlFunction SYSTIMESTAMP TAN TANH TO_ANYLOB TO_BLOB TO_CHAR
127syn keyword plsqlFunction TO_CLOB TO_DATE TO_DSINTERVAL TO_LABEL TO_MULTI_BYTE
128syn keyword plsqlFunction TO_NCHAR TO_NCLOB TO_NUMBER TO_RAW TO_SINGLE_BYTE
129syn keyword plsqlFunction TO_TIME TO_TIMESTAMP TO_TIMESTAMP_TZ TO_TIME_TZ
130syn keyword plsqlFunction TO_YMINTERVAL TRANSLATE TREAT TRIM TRUNC TZ_OFFSET UID
131syn keyword plsqlFunction UNISTR UPPER UROWID USER USERENV VALUE VARIANCE
132syn keyword plsqlFunction VSIZE WORK XOR
133syn match   plsqlFunction "\<SYS\$LOB_REPLICATION\>"
134
135" PL/SQL Exceptions
136syn keyword plsqlException ACCESS_INTO_NULL CASE_NOT_FOUND COLLECTION_IS_NULL
137syn keyword plsqlException CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR
138syn keyword plsqlException INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND
139syn keyword plsqlException NOT_LOGGED_ON PROGRAM_ERROR ROWTYPE_MISMATCH
140syn keyword plsqlException SELF_IS_NULL STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT
141syn keyword plsqlException SUBSCRIPT_OUTSIDE_LIMIT SYS_INVALID_ROWID
142syn keyword plsqlException TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR
143syn keyword plsqlException ZERO_DIVIDE
144
145" Oracle Pseudo Colums.
146syn keyword plsqlPseudo CURRVAL LEVEL NEXTVAL ROWID ROWNUM
147
148if exists("plsql_highlight_triggers")
149  syn keyword plsqlTrigger INSERTING UPDATING DELETING
150endif
151
152" Conditionals.
153syn keyword plsqlConditional ELSIF ELSE IF
154syn match   plsqlConditional "\<END\s\+IF\>"
155
156" Loops.
157syn keyword plsqlRepeat FOR LOOP WHILE FORALL
158syn match   plsqlRepeat "\<END\s\+LOOP\>"
159
160" Various types of comments.
161if exists("c_comment_strings")
162  syntax match plsqlCommentSkip contained "^\s*\*\($\|\s\+\)"
163  syntax region plsqlCommentString contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=plsqlCommentSkip
164  syntax region plsqlComment2String contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end="$"
165  syntax region plsqlCommentL start="--" skip="\\$" end="$" keepend contains=@plsqlCommentGroup,plsqlComment2String,plsqlCharLiteral,plsqlBooleanLiteral,plsqlNumbersCom,plsqlSpaceError
166  syntax region plsqlComment start="/\*" end="\*/" contains=@plsqlCommentGroup,plsqlComment2String,plsqlCharLiteral,plsqlBooleanLiteral,plsqlNumbersCom,plsqlSpaceError
167else
168  syntax region plsqlCommentL start="--" skip="\\$" end="$" keepend contains=@plsqlCommentGroup,plsqlSpaceError
169  syntax region plsqlComment start="/\*" end="\*/" contains=@plsqlCommentGroup,plsqlSpaceError
170endif
171
172syn sync ccomment plsqlComment
173syn sync ccomment plsqlCommentL
174
175" To catch unterminated string literals.
176syn match   plsqlStringError "'.*$"
177
178" Various types of literals.
179syn match   plsqlNumbers transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=plsqlIntLiteral,plsqlFloatLiteral
180syn match   plsqlNumbersCom contained transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=plsqlIntLiteral,plsqlFloatLiteral
181syn match   plsqlIntLiteral contained "[+-]\=\d\+"
182syn match   plsqlFloatLiteral contained "[+-]\=\d\+\.\d*"
183syn match   plsqlFloatLiteral contained "[+-]\=\d*\.\d*"
184syn match   plsqlCharLiteral    "'[^']'"
185syn match   plsqlStringLiteral  "'\([^']\|''\)*'"
186syn keyword plsqlBooleanLiteral TRUE FALSE NULL
187
188" The built-in types.
189syn keyword plsqlStorage ANYDATA ANYTYPE BFILE BINARY_INTEGER BLOB BOOLEAN
190syn keyword plsqlStorage BYTE CHAR CHARACTER CLOB CURSOR DATE DAY DEC DECIMAL
191syn keyword plsqlStorage DOUBLE DSINTERVAL_UNCONSTRAINED FLOAT HOUR
192syn keyword plsqlStorage INT INTEGER INTERVAL LOB LONG MINUTE
193syn keyword plsqlStorage MLSLABEL MONTH NATURAL NATURALN NCHAR NCHAR_CS NCLOB
194syn keyword plsqlStorage NUMBER NUMERIC NVARCHAR PLS_INT PLS_INTEGER
195syn keyword plsqlStorage POSITIVE POSITIVEN PRECISION RAW REAL RECORD
196syn keyword plsqlStorage SECOND SIGNTYPE SMALLINT STRING SYS_REFCURSOR TABLE TIME
197syn keyword plsqlStorage TIMESTAMP TIMESTAMP_UNCONSTRAINED
198syn keyword plsqlStorage TIMESTAMP_TZ_UNCONSTRAINED
199syn keyword plsqlStorage TIMESTAMP_LTZ_UNCONSTRAINED UROWID VARCHAR
200syn keyword plsqlStorage VARCHAR2 YEAR YMINTERVAL_UNCONSTRAINED ZONE
201
202" A type-attribute is really a type.
203syn match plsqlTypeAttribute  "%\(TYPE\|ROWTYPE\)\>"
204
205" All other attributes.
206syn match plsqlAttribute "%\(BULK_EXCEPTIONS\|BULK_ROWCOUNT\|ISOPEN\|FOUND\|NOTFOUND\|ROWCOUNT\)\>"
207
208" This'll catch mis-matched close-parens.
209syn cluster plsqlParenGroup contains=plsqlParenError,@plsqlCommentGroup,plsqlCommentSkip,plsqlIntLiteral,plsqlFloatLiteral,plsqlNumbersCom
210if exists("c_no_bracket_error")
211  syn region plsqlParen transparent start='(' end=')' contains=ALLBUT,@plsqlParenGroup
212  syn match plsqlParenError ")"
213  syn match plsqlErrInParen contained "[{}]"
214else
215  syn region plsqlParen transparent start='(' end=')' contains=ALLBUT,@plsqlParenGroup,plsqlErrInBracket
216  syn match plsqlParenError "[\])]"
217  syn match plsqlErrInParen contained "[{}]"
218  syn region plsqlBracket transparent start='\[' end=']' contains=ALLBUT,@plsqlParenGroup,plsqlErrInParen
219  syn match plsqlErrInBracket contained "[);{}]"
220endif
221
222" Syntax Synchronizing
223syn sync minlines=10 maxlines=100
224
225" Define the default highlighting.
226" For version 5.x and earlier, only when not done already.
227" For version 5.8 and later, only when an item doesn't have highlighting yet.
228if version >= 508 || !exists("did_plsql_syn_inits")
229  if version < 508
230    let did_plsql_syn_inits = 1
231    command -nargs=+ HiLink hi link <args>
232  else
233    command -nargs=+ HiLink hi def link <args>
234  endif
235
236  HiLink plsqlAttribute		Macro
237  HiLink plsqlBlockError	Error
238  HiLink plsqlBooleanLiteral	Boolean
239  HiLink plsqlCharLiteral	Character
240  HiLink plsqlComment		Comment
241  HiLink plsqlCommentL		Comment
242  HiLink plsqlConditional	Conditional
243  HiLink plsqlError		Error
244  HiLink plsqlErrInBracket	Error
245  HiLink plsqlErrInBlock	Error
246  HiLink plsqlErrInParen	Error
247  HiLink plsqlException		Function
248  HiLink plsqlFloatLiteral	Float
249  HiLink plsqlFunction		Function
250  HiLink plsqlGarbage		Error
251  HiLink plsqlHostIdentifier	Label
252  HiLink plsqlIdentifier	Normal
253  HiLink plsqlIntLiteral	Number
254  HiLink plsqlOperator		Operator
255  HiLink plsqlParen		Normal
256  HiLink plsqlParenError	Error
257  HiLink plsqlSpaceError	Error
258  HiLink plsqlPseudo		PreProc
259  HiLink plsqlKeyword		Keyword
260  HiLink plsqlRepeat		Repeat
261  HiLink plsqlStorage		StorageClass
262  HiLink plsqlSQLKeyword	Function
263  HiLink plsqlStringError	Error
264  HiLink plsqlStringLiteral	String
265  HiLink plsqlCommentString	String
266  HiLink plsqlComment2String	String
267  HiLink plsqlSymbol		Normal
268  HiLink plsqlTrigger		Function
269  HiLink plsqlTypeAttribute	StorageClass
270  HiLink plsqlTodo		Todo
271
272  delcommand HiLink
273endif
274
275let b:current_syntax = "plsql"
276
277" vim: ts=8 sw=2
278