From 47a35eb0c7b3df10f342249ebf6cc28a287ffa53 Mon Sep 17 00:00:00 2001 From: moculus Date: Sat, 1 Mar 2008 18:14:37 +0000 Subject: [PATCH] lots of postgres fixes --HG-- branch : pmacs2 --- mode/sql.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/mode/sql.py b/mode/sql.py index 6d07a65..82537de 100644 --- a/mode/sql.py +++ b/mode/sql.py @@ -6,17 +6,18 @@ class PlPgSqlGrammar(Grammar): rules = [ PatternRule(r'comment', r'--.*\n$'), RegionRule(r'comment', '/\*', Grammar, '\*/'), - PatternRule(r'delimiter', r':=|[():;,\.\$\[\]]'), + PatternRule(r'delimiter', r':=|[():;,\.\[\]]'), NocasePatternRule(r'attribute', r'(?:check|exists|unique|not null|default|primary key|minvalue|foreign key|references)(?![A-Za-z0-9_])'), - NocasePatternRule(r'keyword', r'(?:declare|begin|end|raise notice|return)'), + NocasePatternRule(r'keyword', r'(?:declare|begin|end if|end loop|end|raise notice|return|if|while|for|else)(?![A-Za-z0-9_])'), NocasePatternRule(r'operator', r'(?:case|when|then|else|end|not|and|or|is not|is|in|not in)(?![A-Za-z0-9_])'), NocasePatternRule(r'keyword', r'(?:create database|create index|create sequence|create table|create trigger|create view|select|insert|update|delete|drop database|drop index|drop sequence|drop table|drop trigger|drop view|create user|alter user|drop user|drop function|grant|revoke|create function|create or replace function|create or replace view|create language|create operator|create type)(?![A-Za-z0-9_])'), - NocasePatternRule(r'pseudokeyword', r'(?:returns|language|right join|left join|inner join|outer join|join|where|null|true|false|into|values|as|from|order by|asc|desc|limit|distinct|cascade|using|on)(?![A-Za-z0-9_])'), - NocasePatternRule(r'type', r'(?:void|row|serial|varchar|float|integer|int|text|timestamptz|timestamp|datetz|date|timetz|time|boolean|bool)(?![A-Za-z0-9_])'), + NocasePatternRule(r'pseudokeyword', r'(?:returns|language|right join|left join|inner join|outer join|join|where|null|true|false|into|values|as|from|order by|next|asc|desc|limit|distinct|cascade|alias for|using|on)(?![A-Za-z0-9_])'), + NocasePatternRule(r'type', r'(?:void|row|serial|varchar|float|integer|int|text|timestamptz|timestamp|datetz|date|timetz|time|boolean|bool|record|row)(?![A-Za-z0-9_])'), PatternRule(r'builtin', r'(?:nextval|current_timestamp|current_time|current_date)(?![A-Za-z0-9_])'), RegionRule(r'string', "''", StringGrammar, "''"), RegionRule(r'quoted', '"', StringGrammar, '"'), + PatternRule(r'variable', r'\$[1-9][0-9]*'), PatternRule(r'bareword', r'[A-Za-z0-9_]+'), PatternRule(r'empty', r'^ *\n$'), PatternRule(r'eol', r'\n'), @@ -74,20 +75,33 @@ class SqlTabber(tab.StackTabber): return t.name == 'function' def _handle_other_token(self, currlvl, y, i): token = self.get_token(y, i) - if token.name == 'delimiter' and token.string == ';': + s = token.string.lower() + if token.name == 'delimiter' and s == ';': self._opt_pop('cont') elif token.name == 'keyword': - if token.string == 'declare': - self._opt_append('declare', currlvl + 4) - elif token.string == 'begin': + if s == 'declare': + self._append('declare', currlvl + 4) + elif s == 'begin': currlvl -= 4 - elif token.string == 'end': + elif s == 'end': self._opt_pop('declare') currlvl = self.get_curr_level() + elif s == 'end if': + self._opt_pop('if') + currlvl = self.get_curr_level() + elif s == 'end loop': + self._opt_pop('loop') + currlvl = self.get_curr_level() + elif s == 'else': + currlvl -= 4 + elif s == 'if': + self._append('if', currlvl + 4) + elif s in ('while', 'for'): + self._append('loop', currlvl + 4) if self.is_rightmost_token(y, i): if not self._empty() and token.name == 'continuation': - self._opt_append('cont', currlvl + 4) + self._append('cont', currlvl + 4) elif token.name == 'eol' and not self.markers: self._opt_pop("cont") return currlvl @@ -115,6 +129,7 @@ class Sql(mode.Fundamental): 'string.escaped': ('magenta', 'default'), 'string.octal': ('magenta', 'default'), 'string.end': ('green', 'default'), + 'variable': ('yellow', 'default'), 'bareword': ('default', 'default'), 'function.start': ('cyan', 'default'),