diff --git a/autotests/folding/highlight.cmake.fold b/autotests/folding/highlight.cmake.fold --- a/autotests/folding/highlight.cmake.fold +++ b/autotests/folding/highlight.cmake.fold @@ -14,7 +14,7 @@ ) # BEGIN defining a macro -MACRO(ECOS_ADD_EXECUTABLE _exe_NAME ) +MACRO(ECOS_ADD_EXECUTABLE _exe_NAME ) #special parameters are italic, see the STATIC in the next line ADD_LIBRARY(${_exe_NAME} STATIC ${ARGN}) @@ -39,7 +39,7 @@ PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ECOS_ADD_MAKE_CLEAN_FILES}" ) -ENDMACRO(ECOS_ADD_EXECUTABLE) +ENDMACRO(ECOS_ADD_EXECUTABLE) # END of macro #calling a self-defined function, variables are also Qt::blue here diff --git a/autotests/folding/test.sql.fold b/autotests/folding/test.sql.fold --- a/autotests/folding/test.sql.fold +++ b/autotests/folding/test.sql.fold @@ -4,3 +4,62 @@ SELECT * FROM stuff WHERE id = 'string'; select * from stuff where id < 0.42; Select col1, col2 From stuff Where stuff.col1 IS NOT NuLL; + +CREATE TABLE Persons ( + ID int NOT NULL AUTO_INCREMENT, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + PRIMARY KEY (ID) + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); + +SELECT column_name(s) +FROM table1 +FULL OUTER JOIN table2 ON table1.column_name = table2.column_name; + +SELECT * FROM Customers +WHERE City LIKE '[bsp]%'; + +SELECT Count(*) AS DistinctCountries +FROM (SELECT DISTINCT Country FROM Customers) +GROUP BY Country +HAVING COUNT(CustomerID) > 5 +ORDER BY COUNT(CustomerID) DESC; + +SELECT 'Customer' As Type, ContactName, City, Country +FROM Customers +UNION +SELECT 'Supplier', ContactName, City, Country +FROM Suppliers; + +SELECT COUNT(ProductID), AVG(Price) +FROM Products; + +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET default_tablespace = ''; + +DROP TABLE IF EXISTS employees; + +ALTER TABLE ONLY employees + ADD CONSTRAINT fk_employees_employees FOREIGN KEY (reportsto) REFERENCES employees; + +CREATE VIEW [Current Product List] AS +SELECT ProductID, ProductName +FROM Products +WHERE Discontinued = No; + +SELECT * FROM [Current Product List]; + +SELECT * FROM [Category Sales For 1997] +WHERE CategoryName = 'Beverages'; + +begin +end +/ + / +/ u diff --git a/autotests/folding/test.sql_oracle.fold b/autotests/folding/test.sql_oracle.fold --- a/autotests/folding/test.sql_oracle.fold +++ b/autotests/folding/test.sql_oracle.fold @@ -10,6 +10,7 @@ nq'agdfgsdfgfhfghjfgh'f'f'sdfg'sdfg'dfg#a' dafdfadasfasdf; v_nchar := n'NCHAR STRING'; + if_n := 0; Q'#gdfgsdfgsdfgsdfgsdfg#' afgasasdfasdfasfasdfasdfasdfasdfsdf @@ -42,3 +43,12 @@ sdfdfsdf; end if; end; + +CREATE TABLE Persons ( + ID int NOT NULL, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + City varchar(255), + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); diff --git a/autotests/html/test.sql.html b/autotests/html/test.sql.html --- a/autotests/html/test.sql.html +++ b/autotests/html/test.sql.html @@ -10,4 +10,63 @@ SELECT * FROM stuff WHERE id = 'string'; select * from stuff where id < 0.42; Select col1, col2 From stuff Where stuff.col1 IS NOT NuLL; + +CREATE TABLE Persons ( + ID int NOT NULL AUTO_INCREMENT, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + PRIMARY KEY (ID) + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); + +SELECT column_name(s) +FROM table1 +FULL OUTER JOIN table2 ON table1.column_name = table2.column_name; + +SELECT * FROM Customers +WHERE City LIKE '[bsp]%'; + +SELECT Count(*) AS DistinctCountries +FROM (SELECT DISTINCT Country FROM Customers) +GROUP BY Country +HAVING COUNT(CustomerID) > 5 +ORDER BY COUNT(CustomerID) DESC; + +SELECT 'Customer' As Type, ContactName, City, Country +FROM Customers +UNION +SELECT 'Supplier', ContactName, City, Country +FROM Suppliers; + +SELECT COUNT(ProductID), AVG(Price) +FROM Products; + +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET default_tablespace = ''; + +DROP TABLE IF EXISTS employees; + +ALTER TABLE ONLY employees + ADD CONSTRAINT fk_employees_employees FOREIGN KEY (reportsto) REFERENCES employees; + +CREATE VIEW [Current Product List] AS +SELECT ProductID, ProductName +FROM Products +WHERE Discontinued = No; + +SELECT * FROM [Current Product List]; + +SELECT * FROM [Category Sales For 1997] +WHERE CategoryName = 'Beverages'; + +begin +end +/ + / +/ u diff --git a/autotests/html/test.sql_oracle.html b/autotests/html/test.sql_oracle.html --- a/autotests/html/test.sql_oracle.html +++ b/autotests/html/test.sql_oracle.html @@ -12,21 +12,22 @@ begin q'{adfasdf'sadfasdf j}'{' hkjhkhkjhkjh khlkhklj'fghdfghdfgh'hkjh'jkhkh'a' nQ'(asldflahsl;'dkjfhklsdfh)' - Nq'[asdasd;'asdasd'a]sd'asd'asasd]';11111111[1']; asdasdasdasd'errrrrrrrrrrrrrr-p + Nq'[asdasd;'asdasd'a]sd'asd'asasd]';11111111[1']; asdasdasdasd'errrrrrrrrrrrrrr-p nq'agdfgsdfgfhfghjfgh'f'f'sdfg'sdfg'dfg#a' dafdfadasfasdf; v_nchar := n'NCHAR STRING'; + if_n := 0; Q'#gdfgsdfgsdfgsdfgsdfg#' afgasasdfasdfasfasdfasdfasdfasdfsdf if sldfjsdj then case - when 1=1 then + when 1=1 then aslfjsldkfj; - when 2=2 then + when 2=2 then asdfg; else - null; + null; end case; if sdfjh then @@ -48,4 +49,13 @@ sdfdfsdf; end if; end; + +CREATE TABLE Persons ( + ID int NOT NULL, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + City varchar(255), + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); diff --git a/autotests/input/highlight.sh b/autotests/input/highlight.sh old mode 100644 new mode 100755 diff --git a/autotests/input/highlight.sh.syntax b/autotests/input/highlight.sh.syntax old mode 100644 new mode 100755 diff --git a/autotests/input/test.sql b/autotests/input/test.sql --- a/autotests/input/test.sql +++ b/autotests/input/test.sql @@ -4,3 +4,62 @@ SELECT * FROM stuff WHERE id = 'string'; select * from stuff where id < 0.42; Select col1, col2 From stuff Where stuff.col1 IS NOT NuLL; + +CREATE TABLE Persons ( + ID int NOT NULL AUTO_INCREMENT, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + PRIMARY KEY (ID) + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); + +SELECT column_name(s) +FROM table1 +FULL OUTER JOIN table2 ON table1.column_name = table2.column_name; + +SELECT * FROM Customers +WHERE City LIKE '[bsp]%'; + +SELECT Count(*) AS DistinctCountries +FROM (SELECT DISTINCT Country FROM Customers) +GROUP BY Country +HAVING COUNT(CustomerID) > 5 +ORDER BY COUNT(CustomerID) DESC; + +SELECT 'Customer' As Type, ContactName, City, Country +FROM Customers +UNION +SELECT 'Supplier', ContactName, City, Country +FROM Suppliers; + +SELECT COUNT(ProductID), AVG(Price) +FROM Products; + +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET default_tablespace = ''; + +DROP TABLE IF EXISTS employees; + +ALTER TABLE ONLY employees + ADD CONSTRAINT fk_employees_employees FOREIGN KEY (reportsto) REFERENCES employees; + +CREATE VIEW [Current Product List] AS +SELECT ProductID, ProductName +FROM Products +WHERE Discontinued = No; + +SELECT * FROM [Current Product List]; + +SELECT * FROM [Category Sales For 1997] +WHERE CategoryName = 'Beverages'; + +begin +end +/ + / +/ u diff --git a/autotests/input/test.sql_oracle b/autotests/input/test.sql_oracle --- a/autotests/input/test.sql_oracle +++ b/autotests/input/test.sql_oracle @@ -10,6 +10,7 @@ nq'agdfgsdfgfhfghjfgh'f'f'sdfg'sdfg'dfg#a' dafdfadasfasdf; v_nchar := n'NCHAR STRING'; + if_n := 0; Q'#gdfgsdfgsdfgsdfgsdfg#' afgasasdfasdfasfasdfasdfasdfasdfsdf @@ -42,3 +43,12 @@ sdfdfsdf; end if; end; + +CREATE TABLE Persons ( + ID int NOT NULL, + LastName varchar(255) NOT NULL, + FirstName varchar(255), + Age int, + City varchar(255), + CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes') +); diff --git a/autotests/reference/test.sql.ref b/autotests/reference/test.sql.ref --- a/autotests/reference/test.sql.ref +++ b/autotests/reference/test.sql.ref @@ -3,4 +3,63 @@ CREATE TABLE stuff COLUMNS(col1 INT, col2 Varchar);
SELECT * FROM stuff WHERE id = 'string';
select * from stuff where id < 0.42;
-Select col1, col2 From stuff Where stuff.col1 IS NOT NuLL;
+Select col1, col2 From stuff Where stuff.col1 IS NOT NuLL;
+
+CREATE TABLE Persons (
+ ID int NOT NULL AUTO_INCREMENT,
+ LastName varchar(255) NOT NULL,
+ FirstName varchar(255),
+ Age int,
+ PRIMARY KEY (ID)
+ CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
+);
+
+SELECT column_name(s)
+FROM table1
+FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
+
+SELECT * FROM Customers
+WHERE City LIKE '[bsp]%';
+
+SELECT Count(*) AS DistinctCountries
+FROM (SELECT DISTINCT Country FROM Customers)
+GROUP BY Country
+HAVING COUNT(CustomerID) > 5
+ORDER BY COUNT(CustomerID) DESC;
+
+SELECT 'Customer' As Type, ContactName, City, Country
+FROM Customers
+UNION
+SELECT 'Supplier', ContactName, City, Country
+FROM Suppliers;
+
+SELECT COUNT(ProductID), AVG(Price)
+FROM Products;
+
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+SET default_tablespace = '';
+
+DROP TABLE IF EXISTS employees;
+
+ALTER TABLE ONLY employees
+ ADD CONSTRAINT fk_employees_employees FOREIGN KEY (reportsto) REFERENCES employees;
+
+CREATE VIEW [Current Product List] AS
+SELECT ProductID, ProductName
+FROM Products
+WHERE Discontinued = No;
+
+SELECT * FROM [Current Product List];
+
+SELECT * FROM [Category Sales For 1997]
+WHERE CategoryName = 'Beverages';
+
+begin
+end
+/
+ /
+/ u
diff --git a/autotests/reference/test.sql_oracle.ref b/autotests/reference/test.sql_oracle.ref --- a/autotests/reference/test.sql_oracle.ref +++ b/autotests/reference/test.sql_oracle.ref @@ -3,42 +3,52 @@
declare
v_nchar NCHAR(12);
-begin
+begin
q'{adfasdf'sadfasdf j}'{' hkjhkhkjhkjh khlkhklj'fghdfghdfgh'hkjh'jkhkh'a'
nQ'(asldflahsl;'dkjfhklsdfh)'
- Nq'[asdasd;'asdasd'a]sd'asd'asasd]';11111111[1']; asdasdasdasd'errrrrrrrrrrrrrr-p
+ Nq'[asdasd;'asdasd'a]sd'asd'asasd]';11111111[1']; asdasdasdasd'errrrrrrrrrrrrrr-p

nq'agdfgsdfgfhfghjfgh'f'f'sdfg'sdfg'dfg#a' dafdfadasfasdf;
v_nchar := n'NCHAR STRING';
+ if_n := 0;

Q'#gdfgsdfgsdfgsdfgsdfg#' afgasasdfasdfasfasdfasdfasdfasdfsdf

- if sldfjsdj then
- case
- when 1=1 then
+ if sldfjsdj then
+ case
+ when 1=1 then
aslfjsldkfj;
- when 2=2 then
+ when 2=2 then
asdfg;
- else
- null;
- end case;
+ else
+ null;
+ end case;

- if sdfjh then
- for i in 1 .. 2
- LOOP
+ if sdfjh then
+ for i in 1 .. 2
+ LOOP
dbms_output.put_line(q';ololo;');
- END Loop;
+ END Loop;

- while true
- loop
+ while true
+ loop
dbms_output.put_line('1111');
- end loop;
- end if;
+ end loop;
+ end if;
ksjfklasjd;
fklj;
- elsif
+ elsif
sdklfjsdklfj;
- else
+ else
sdfdfsdf;
- end if;
-end;
+ end if;
+end;
+
+CREATE TABLE Persons (
+ ID int NOT NULL,
+ LastName varchar(255) NOT NULL,
+ FirstName varchar(255),
+ Age int,
+ City varchar(255),
+ CONSTRAINT CHK_Person CHECK (Age>=18 AND City='Sandnes')
+);
diff --git a/data/syntax/sql-mysql.xml b/data/syntax/sql-mysql.xml --- a/data/syntax/sql-mysql.xml +++ b/data/syntax/sql-mysql.xml @@ -6,25 +6,40 @@ modifications by Milian Wolff (mail@milianw.de) v3 fix comments by Gene Thomas --> - + + + CASE + ELSE + FOR + IF + THEN + WHEN + WHILE + + + AND + BETWEEN + IN + IS + LIKE + NOT + OR + ACCESS ADD ALL ALTER ANALYZE - AND AS ASC AUTO_INCREMENT BDB BERKELEYDB - BETWEEN BOTH BY CASCADE - CASE CHANGE @@ -51,39 +66,33 @@ DISTINCT DISTINCTROW DROP - ELSE ENCLOSED ESCAPED EXISTS EXPLAIN FIELDS - FOR FOREIGN FROM FULLTEXT FUNCTION GRANT GROUP HAVING HIGH_PRIORITY - IF IGNORE - IN INDEX INFILE INNER INNODB INSERT INTERVAL INTO - IS JOIN KEY KEYS KILL LEADING LEFT - LIKE LIMIT LINES LOAD @@ -94,14 +103,12 @@ MRG_MYISAM NATIONAL NATURAL - NOT NULL NUMERIC ON OPTIMIZE OPTION OPTIONALLY - OR ORDER OUTER OUTFILE @@ -136,7 +143,6 @@ TABLE TABLES TERMINATED - THEN TO TRAILING TRUNCATE @@ -152,35 +158,13 @@ USING VALUES VARYING - WHEN - WHERE - WHILE WITH + WHERE WRITE XOR YEAR_MONTH ZEROFILL - - + - - - * - / - || - = - != - <> - < - <= - > - >= - ~= - ^= - := - => - ** - .. - ASCII @@ -395,10 +379,20 @@ - + - + + + + + + + + + + + @@ -414,8 +408,6 @@ - - @@ -452,7 +444,9 @@ - + + + @@ -471,7 +465,7 @@ - + diff --git a/data/syntax/sql-oracle.xml b/data/syntax/sql-oracle.xml --- a/data/syntax/sql-oracle.xml +++ b/data/syntax/sql-oracle.xml @@ -1,8 +1,33 @@ - + + + CASE + ELSE + ELSIF + EXCEPTION + EXIT + LOOP + FOR + IF + RAISE + RETURN + RETURNING + THEN + WHEN + WHILE + + + AND + BETWEEN + IN + IS + LIKE + NOT + OR + ABORT ACCEPT @@ -29,22 +54,18 @@ ALWAYS ANALYZE ANCILLARY - AND AND_EQUAL ANTIJOIN ANY ANYSCHEMA APPEND - APPENDCHILDXML APPEND_VALUES APPLY ARCHIVE ARCHIVELOG ARRAY AS ASC - ASCII - ASCIISTR ASSEMBLY ASSOCIATE ASYNC @@ -71,7 +92,6 @@ BEGIN BEGIN_OUTLINE_DATA BEHALF - BETWEEN BIGFILE BIND_AWARE BINDING @@ -105,45 +125,32 @@ CACHE_TEMP_TABLE CALL CANCEL - CARDINALITY CASCADE - CASE - CAST CATEGORY - CEIL CELL_FLASH_CACHE CERTIFICATE CFILE CHAINED CHANGE CHANGE_DUPKEY_ERROR_INDEX - CHAR - CHARACTER CHAR_CS - CHARTOROWID CHECK CHECK_ACL_REWRITE CHECKPOINT CHILD CHOOSE - CHR CHUNK CLASS CLEAR CLONE CLOSE CLOSE_CACHED_OPEN_CURSORS CLUSTER - CLUSTER_ID CLUSTERING_FACTOR - CLUSTER_PROBABILITY - CLUSTER_SET - COALESCE COALESCE_SQ COARSE CO_AUTH_IND COLD - COLLECT COLUMN COLUMNAR COLUMN_AUTH_INDICATOR @@ -158,13 +165,11 @@ COMPILE COMPLETE COMPLIANCE - COMPOSE COMPOSITE COMPOSITE_LIMIT COMPOUND COMPRESS COMPUTE - CONCAT CONFIRM CONFORMING CONNECT @@ -189,18 +194,11 @@ CONTEXT CONTINUE CONTROLFILE - CONVERT - CORR - CORR_K - CORR_S CORRUPTION CORRUPT_XID CORRUPT_XID_ALL COST COST_XML_QUERY_REWRITE - COUNT - COVAR_POP - COVAR_SAMP CPU_COSTING CPU_PER_CALL CPU_PER_SESSION @@ -213,36 +211,30 @@ CSCONVERT CUBE CUBE_GB - CUME_DIST CUME_DISTM CURRENT - CURRENT_DATE CURRENT_SCHEMA CURRENT_TIME - CURRENT_TIMESTAMP CURRENT_USER CURRENTV CURSOR CURSOR_SHARING_EXACT CURSOR_SPECIFIC_SEGMENT - CV CYCLE DANGLING DATA DATABASE DATABASE_DEFAULT DATAFILE DATAFILES DATAOBJNO - DATAOBJ_TO_PARTITION DATE DATE_MODE DAY DBA DBA_RECYCLEBIN DBMS_STATS DB_ROLE_CHANGE - DBTIMEZONE DB_VERSION DDL DEALLOCATE @@ -265,14 +257,11 @@ DEGREE DELAY DELETE - DELETEXML DEMAND DENSE_RANK DENSE_RANKM DEPENDENT - DEPTH DEQUEUE - DEREF DEREF_NO_REWRITE DESC DETACHED @@ -308,7 +297,6 @@ DROP_COLUMN DROP_GROUP DST_UPGRADE_INSERT_CONV - DUMP DYNAMIC DYNAMIC_SAMPLING DYNAMIC_SAMPLING_EST_CDN @@ -320,11 +308,7 @@ ELIMINATE_JOIN ELIMINATE_OBY ELIMINATE_OUTER_JOIN - ELSE - ELSIF EMPTY - EMPTY_BLOB - EMPTY_CLOB ENABLE ENABLE_PRESET ENCODING @@ -357,8 +341,6 @@ EXECUTE EXEMPT EXISTS - EXISTSNODE - EXP EXPAND_GSET_TO_UNION EXPAND_TABLE EXPIRE @@ -372,8 +354,6 @@ EXTERNAL EXTERNALLY EXTRA - EXTRACT - EXTRACTVALUE FACILITY FACT FACTORIZE_JOIN @@ -383,9 +363,6 @@ FALSE FAST FBTSCAN - FEATURE_ID - FEATURE_SET - FEATURE_VALUE FILE FILESYSTEM_LIKE_LOGGING FILTER @@ -395,18 +372,15 @@ FIRST FIRSTM FIRST_ROWS - FIRST_VALUE FLAGGER FLASHBACK FLASH_CACHE FLOAT FLOB - FLOOR FLUSH FOLDER FOLLOWING FOLLOWS - FOR FORCE FORCE_XML_QUERY_REWRITE FOREIGN @@ -417,7 +391,6 @@ FREEPOOLS FRESH FROM - FROM_TZ FULL FUNCTION FUNCTIONS @@ -430,12 +403,8 @@ GLOBAL_NAME GLOBAL_TOPIC_ENABLED GRANT - GREATEST GROUP GROUP_BY - GROUP_ID - GROUPING - GROUPING_ID GROUPS GUARANTEE GUARANTEED @@ -448,7 +417,6 @@ HEADER HEAP HELP - HEXTORAW HEXTOREF HIDDEN HIDE @@ -466,15 +434,13 @@ IDENTITY IDGENERATORS IDLE_TIME - IF IGNORE IGNORE_OPTIM_EMBEDDED_HINTS IGNORE_ROW_ON_DUPKEY_INDEX IGNORE_WHERE_CLAUSE IMMEDIATE IMPACT IMPORT - IN INCLUDE INCLUDE_VERSION INCLUDING @@ -507,7 +473,6 @@ INDICATOR INFINITE INFORMATIONAL - INITCAP INITIAL INITIALIZED INITIALLY @@ -517,38 +482,23 @@ IN_MEMORY_METADATA INNER INSERT - INSERTCHILDXML - INSERTCHILDXMLAFTER - INSERTCHILDXMLBEFORE - INSERTXMLAFTER - INSERTXMLBEFORE INSTANCE INSTANCES INSTANTIABLE INSTANTLY INSTEAD - INSTR - INSTRB - INSTRC - INSTR2 - INSTR4 - INT - INTEGER INTERMEDIATE INTERNAL_CONVERT INTERNAL_USE INTERPRETED INTERSECT - INTERVAL INTO INVALIDATE INVISIBLE IN_XQUERY - IS ISOLATION ISOLATION_LEVEL ITERATE - ITERATION_NUMBER JAVA JOB JOIN @@ -560,53 +510,36 @@ KEYS KEYSIZE KILL - LAG - LAST - LAST_DAY - LAST_VALUE LATERAL LAYER LDAP_REGISTRATION LDAP_REGISTRATION_ENABLED LDAP_REG_SYNC_INTERVAL - LEAD LEADING - LEAST LEFT - LENGTH - LENGTHB - LENGTHC - LENGTH2 - LENGTH4 LESS LEVEL LEVELS LIBRARY LIFE LIFETIME - LIKE LIKEC LIKE_EXPAND LIKE2 LIKE4 LIMIT LINK LIST - LISTAGG - LN - LNNVL LOB LOBNVL LOBS LOCAL LOCAL_INDEXES LOCALTIME - LOCALTIMESTAMP LOCATION LOCATOR LOCK LOCKED - LOG LOGFILE LOGFILES LOGGING @@ -616,13 +549,8 @@ LOGOFF LOGON LONG - LOOP LOW - LOWER - LPAD - LTRIM MAIN - MAKE_REF MANAGE MANAGED MANAGEMENT @@ -632,7 +560,6 @@ MATCHED MATERIALIZE MATERIALIZED - MAX MAXARCHLOGS MAXDATAFILES MAXEXTENTS @@ -646,7 +573,6 @@ MAXVALUE MEASURE MEASURES - MEDIAN MEDIUM MEMBER MEMORY @@ -658,7 +584,6 @@ METHOD MIGRATE MIGRATION - MIN MINEXTENTS MINIMIZE MINIMUM @@ -671,7 +596,6 @@ MIRRORCOLD MIRRORHOT MLSLABEL - MOD MODE MODEL MODEL_COMPILE_SUBQUERY @@ -685,7 +609,6 @@ MONITOR MONITORING MONTH - MONTHS_BETWEEN MOUNT MOUNTPATH MOVE @@ -696,7 +619,6 @@ NAMED NAMESPACE NAN - NANVL NATIONAL NATIVE NATIVE_FULL_OUTER_JOIN @@ -722,14 +644,10 @@ NLJ_PREFETCH NLS_CALENDAR NLS_CHARACTERSET - NLS_CHARSET_DECL_LEN - NLS_CHARSET_ID - NLS_CHARSET_NAME NLS_COMP NLS_CURRENCY NLS_DATE_FORMAT NLS_DATE_LANGUAGE - NLS_INITCAP NLS_ISO_CURRENCY NL_SJ NLS_LANG @@ -739,7 +657,6 @@ NLS_NCHAR_CONV_EXCP NLS_NUMERIC_CHARACTERS NLS_SORT - NLSSORT NLS_SPECIAL_CHARS NLS_TERRITORY NLS_UPPER @@ -845,7 +762,6 @@ NO_SUBSTRB_PAD NO_SWAP_JOIN_INPUTS NOSWITCH - NOT NO_TEMP_TABLE NOTHING NOTIFICATION @@ -862,18 +778,11 @@ NO_XMLINDEX_REWRITE NO_XMLINDEX_REWRITE_IN_SELECT NO_XML_QUERY_REWRITE - NTH_VALUE - NTILE NULL - NULLIF NULLS NUMBER NUMERIC NUM_INDEX_KEYS - NUMTODSINTERVAL - NUMTOYMINTERVAL - NVL - NVL2 OBJECT OBJECTTOXML OBJNO @@ -904,16 +813,11 @@ OPTIMIZER_GOAL OPTION OPT_PARAM - OR ORA_BRANCH ORA_CHECKACL ORADEBUG - ORA_DST_AFFECTED - ORA_DST_CONVERT - ORA_DST_ERROR ORA_GET_ACLIDS ORA_GET_PRIVILEGES - ORA_HASH ORA_ROWSCN ORA_ROWSCN_RAW ORA_ROWVERSION @@ -961,7 +865,6 @@ PASSWORD_REUSE_MAX PASSWORD_REUSE_TIME PASSWORD_VERIFY_FUNCTION - PATH PATHS PBL_HS_BEGIN PBL_HS_END @@ -974,7 +877,6 @@ PERCENT PERCENTILE_CONT PERCENTILE_DISC - PERCENT_RANK PERCENT_RANKM PERFORMANCE PERMANENT @@ -997,9 +899,6 @@ POINT POLICY POST_TRANSACTION - POWER - POWERMULTISET - POWERMULTISET_BY_CARDINALITY PQ_DISTRIBUTE PQ_MAP PQ_NOMAP @@ -1009,19 +908,10 @@ PRECISION PRECOMPUTE_SUBQUERY PREDICATE_REORDERS - PREDICTION - PREDICTION_BOUNDS - PREDICTION_COST - PREDICTION_DETAILS - PREDICTION_PROBABILITY - PREDICTION_SET PREPARE PRESENT - PRESENTNNV - PRESENTV PRESERVE PRESERVE_OID - PREVIOUS PRIMARY PRIOR PRIVATE @@ -1057,13 +947,9 @@ RANDOM RANDOM_LOCAL RANGE - RANK RANKM RAPIDLY - RATIO_TO_REPORT RAW - RAWTOHEX - RAWTONHEX RBA RBO_OUTLINE RDBA @@ -1081,41 +967,25 @@ REDO REDUCED REDUNDANCY - REF REF_CASCADE_CURSOR REFERENCE REFERENCED REFERENCES REFERENCING REFRESH REFTOHEX - REGEXP_COUNT - REGEXP_INSTR REGEXP_LIKE - REGEXP_REPLACE - REGEXP_SUBSTR REGISTER - REGR_AVGX - REGR_AVGY - REGR_COUNT - REGR_INTERCEPT - REGR_R2 - REGR_SLOPE - REGR_SXX - REGR_SXY - REGR_SYY REGULAR REJECT REKEY RELATIONAL RELY - REMAINDER REMOTE_MAPPED REMOVE RENAME REPAIR REPEAT - REPLACE REPLICATION REQUIRED RESET @@ -1135,8 +1005,6 @@ RESUME RETENTION RETRY_ON_ROW_CHANGE - RETURN - RETURNING REUSE REVERSE REVOKE @@ -1148,18 +1016,12 @@ ROLLBACK ROLLING ROLLUP - ROUND ROW ROWDEPENDENCIES ROWID - ROWIDTOCHAR - ROWIDTONCHAR ROW_LENGTH ROWNUM - ROW_NUMBER ROWS - RPAD - RTRIM RULE RULES SALT @@ -1203,7 +1065,6 @@ SESSIONS_PER_USER SESSIONTIMEZONE SESSIONTZNAME - SET SETS SETTINGS SET_TO_JOIN @@ -1216,14 +1077,11 @@ SHUTDOWN SIBLINGS SID - SIGN SIGNAL_COMPONENT SIGNAL_FUNCTION SIMPLE - SIN SINGLE SINGLETASK - SINH SIZE SKIP SKIP_EXT_OPTIMIZER @@ -1234,7 +1092,6 @@ SNAPSHOT SOME SORT - SOUNDEX SOURCE SPACE SPECIFICATION @@ -1244,7 +1101,6 @@ SQL SQLLDR SQL_TRACE - SQRT STALE STANDALONE STANDBY @@ -1258,21 +1114,6 @@ STATEMENTS STATIC STATISTICS - STATS_BINOMIAL_TEST - STATS_CROSSTAB - STATS_F_TEST - STATS_KS_TEST - STATS_MODE - STATS_MW_TEST - STATS_ONE_WAY_ANOVA - STATS_T_TEST_INDEP - STATS_T_TEST_INDEPU - STATS_T_TEST_ONE - STATS_T_TEST_PAIRED - STATS_WSR_TEST - STDDEV - STDDEV_POP - STDDEV_SAMP STOP STORAGE STORE @@ -1290,11 +1131,6 @@ SUBQUERIES SUBQUERY_PRUNING SUBSTITUTABLE - SUBSTR - SUBSTRB - SUBSTRC - SUBSTR2 - SUBSTR4 SUCCESSFUL SUMMARY SUPPLEMENTAL @@ -1309,10 +1145,7 @@ SYS_AUDIT SYSAUX SYS_CHECKACL - SYS_CONNECT_BY_PATH - SYS_CONTEXT SYSDBA - SYS_DBURIGEN SYS_DL_CURSOR SYS_DM_RXFORM_CHR SYS_DM_RXFORM_NUM @@ -1324,13 +1157,11 @@ SYS_ET_IMAGE_TO_BLOB SYS_ET_RAW_TO_BFILE SYS_EXTPDTXT - SYS_EXTRACT_UTC SYS_FBT_INSDEL SYS_FILTER_ACLS SYS_GET_ACLIDS SYS_GET_PRIVILEGES SYS_GETTOKENID - SYS_GUID SYS_MAKEXML SYS_MAKE_XMLNODEID SYS_MKXMLATTR @@ -1440,7 +1271,6 @@ SYS_XMLCONTAINS SYS_XMLCONV SYS_XMLEXNSURI - SYS_XMLGEN SYS_XMLI_LOC_ISNODE SYS_XMLI_LOC_ISTEXT SYS_XMLLOCATOR_GETSVAL @@ -1569,7 +1399,6 @@ TEST THAN THE - THEN THREAD THROUGH TIME @@ -1593,23 +1422,17 @@ TRANSFORM_DISTINCT_AGG TRANSITION TRANSITIONAL - TRANSLATE - TREAT TRIGGER TRIGGERS - TRIM TRUE - TRUNC TRUNCATE TRUSTED TUNING TX TYPE TYPES - TZ_OFFSET UBA UB2 - UID UNARCHIVED UNBOUND UNBOUNDED @@ -1620,7 +1443,6 @@ UNIFORM UNION UNIQUE - UNISTR UNLIMITED UNLOCK UNNEST @@ -1636,7 +1458,6 @@ UPDATABLE UPDATE UPDATED - UPDATEXML UPD_INDEXES UPD_JOININDEX UPGRADE @@ -1665,13 +1486,9 @@ USING VALIDATE VALIDATION - VALUE VALUES - VARIANCE - VAR_POP VARRAYS VARIABLE - VAR_SAMP VARYING VECTOR_READ VECTOR_READ_TRACE @@ -1689,16 +1506,12 @@ VIRTUAL VISIBLE VOLUME - VSIZE WAIT WALLET WELLFORMED - WHEN WHENEVER WHERE - WHILE WHITESPACE - WIDTH_BUCKET WITH WITHIN WITHOUT @@ -1709,64 +1522,27 @@ XID XML XMLATTRIBUTES - XMLCAST - XMLCDATA - XMLCOLATTVAL - XMLCOMMENT - XMLCONCAT - XMLDIFF - XML_DML_RWT_STMT - XMLELEMENT - XMLEXISTS XMLEXISTS2 - XMLFOREST + XML_DML_RWT_STMT XMLINDEX_REWRITE XMLINDEX_REWRITE_IN_SELECT XMLINDEX_SEL_IDX_TBL XMLISNODE - XMLISVALID XMLNAMESPACES - XMLPARSE - XMLPATCH - XMLPI - XMLQUERY - XMLROOT XMLSCHEMA - XMLSERIALIZE - XMLTABLE XMLTOOBJECT - XMLTRANSFORM XMLTRANSFORMBLOB XMLTYPE - XPATHTABLE XS_SYS_CONTEXT YEAR YES ZONE - - + - - - * - / - || - = - != - ^= - <> - < - <= - > - >= - := - => - ** - .. - ABS ACOS ADD_MONTHS + APPENDCHILDXML ASCII ASCIISTR ASIN @@ -1781,12 +1557,14 @@ CEIL CHARTOROWID CHR + CLUSTER_ID + CLUSTER_PROBABILITY + CLUSTER_SET COALESCE COLLECT COMPOSE CONCAT CONVERT - CONTAINS CORR CORR_K CORR_S @@ -1802,6 +1580,7 @@ DBTIMEZONE DECODE DECOMPOSE + DELETEXML DENSE_RANK DEPTH DEREF @@ -1812,6 +1591,9 @@ EXP EXTRACT EXTRACTVALUE + FEATURE_ID + FEATURE_SET + FEATURE_VALUE FIRST FIRST_VALUE FLOOR @@ -1822,16 +1604,29 @@ GROUPING_ID HEXTORAW INITCAP + INSERTCHILDXML + INSERTCHILDXMLAFTER + INSERTCHILDXMLBEFORE + INSERTXMLAFTER + INSERTXMLBEFORE INSTR INSTRB + INSTRC + INSTR2 + INSTR4 + ITERATION_NUMBER LAG LAST LAST_DAY LAST_VALUE LEAD LEAST LENGTH LENGTHB + LENGTHC + LENGTH2 + LENGTH4 + LISTAGG LN LNNVL LOCALTIMESTAMP @@ -1856,30 +1651,41 @@ NLS_LOWER NLS_UPPER NLSSORT + NTH_VALUE NTILE NULLIF NUMTODSINTERVAL NUMTOYMINTERVAL NVL NVL2 + ORA_DST_AFFECTED + ORA_DST_CONVERT + ORA_DST_ERROR ORA_HASH - ORA_ROWSCN + PATH PERCENT_RANK PERCENTILE_CONT PERCENTILE_DISC POWER POWERMULTISET POWERMULTISET_BY_CARDINALITY + PREDICTION + PREDICTION_BOUNDS + PREDICTION_COST + PREDICTION_DETAILS + PREDICTION_PROBABILITY + PREDICTION_SET PRESENTNNV PRESENTV + PREVIOUS RANK RATIO_TO_REPORT RAWTOHEX RAWTONHEX REF REFTOHEX + REGEXP_COUNT REGEXP_INSTR - REGEXP_LIKE REGEXP_REPLACE REGEXP_SUBSTR REGR_SLOPE @@ -1892,14 +1698,16 @@ REGR_SYY REGR_SXY REMAINDER + REPLACE ROUND ROW_NUMBER ROWIDTOCHAR ROWIDTONCHAR RPAD RTRIM SCN_TO_TIMESTAMP SESSIONTIMEZONE + SET SIGN SIN SINH @@ -1922,6 +1730,9 @@ STDDEV_SAMP SUBSTR SUBSTRB + SUBSTRC + SUBSTR2 + SUBSTR4 SUM SYS_CONNECT_BY_PATH SYS_CONTEXT @@ -1938,6 +1749,7 @@ TIMESTAMP_TO_SCN TO_BINARY_DOUBLE TO_BINARY_FLOAT + TO_BLOB TO_CHAR TO_CLOB TO_DATE @@ -1969,11 +1781,24 @@ VSIZE WIDTH_BUCKET XMLAGG + XMLCAST + XMLCDATA XMLCOLATTVAL + XMLCOMMENT XMLCONCAT + XMLDIFF XMLELEMENT + XMLEXISTS XMLFOREST + XMLISVALID + XMLPARSE + XMLPATCH + XMLPI + XMLQUERY + XMLROOT XMLSEQUENCE + XMLSERIALIZE + XMLTABLE XMLTRANSFORM @@ -2044,19 +1869,26 @@ - - - - - - - - + + + + + + + + + - + + + + + + + @@ -2076,7 +1908,7 @@ - + @@ -2097,21 +1929,23 @@ - - - - - + + + + + + + - + - + diff --git a/data/syntax/sql-postgresql.xml b/data/syntax/sql-postgresql.xml --- a/data/syntax/sql-postgresql.xml +++ b/data/syntax/sql-postgresql.xml @@ -3,38 +3,74 @@ - + + + CASE + ELSE + EXCEPTION + FOR + IF + RETURN + THEN + WHEN + + + AND + BETWEEN + IN + IS + LIKE + NOT + OR + + A ABORT + ABSENT + ABSOLUTE ACCESS + ACCORDING ACTION + ADA ADD ADMIN AFTER AGGREGATE - ALIAS ALL ALLOCATE + ALSO ALTER - ANALYSE + ALWAYS ANALYZE ANY ARE + ARRAY + ARRAY_AGG + ARRAY_MAX_CARDINALITY AS ASC ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC + ATTACH + ATTRIBUTE + ATTRIBUTES AUTHORIZATION BACKWARD + BASE64 BEFORE BEGIN - BETWEEN + BEGIN_FRAME + BEGIN_PARTITION + BERNOULLI BINARY + BLOB + BLOCKED + BOM BOTH BREADTH BY @@ -45,141 +81,186 @@ CARDINALITY CASCADE CASCADED - CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS - CHARACTER_LENGTH + CHARACTERS CHARACTER_SET_CATALOG CHARACTER_SET_NAME CHARACTER_SET_SCHEMA - CHAR_LENGTH CHECK - CHECKED CHECKPOINT CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER - COALESCE COBOL COLLATE COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA + COLLECT COLUMN + COLUMNS COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE COMMENT + COMMENTS COMMIT COMMITTED - COMPLETION + CONCURRENTLY + CONDITION CONDITION_NUMBER + CONFIGURATION + CONFLICT CONNECT CONNECTION CONNECTION_NAME - CONSTRAINTS CONSTRAINT + CONSTRAINTS CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA CONSTRUCTOR CONTAINS + CONTENT CONTINUE - CONVERT + CONTROL + CONVERSION COPY + CORR CORRESPONDING - COUNT + COST + COVAR_POP + COVAR_SAMP CREATE - CREATEDB - CREATEUSER CROSS + CSV CUBE + CUME_DIST CURRENT + CURRENT_CATALOG CURRENT_DATE + CURRENT_DEFAULT_TRANSFORM_GROUP CURRENT_PATH CURRENT_ROLE + CURRENT_ROW CURRENT_TIME CURRENT_TIMESTAMP - CURRENT_USER + CURRENT_TRANSFORM_GROUP_FOR_TYPE CURSOR CURSOR_NAME CYCLE DATA DATABASE - DATE + DATALINK DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION DAY + DB DEALLOCATE DEC - DECIMAL DECLARE DEFAULT + DEFAULTS DEFERRABLE DEFERRED DEFINED DEFINER + DEGREE DELETE + DELIMITER DELIMITERS + DENSE_RANK + DEPENDS DEPTH DEREF + DERIVED DESC DESCRIBE DESCRIPTOR - DESTROY - DESTRUCTOR + DETACH DETERMINISTIC DIAGNOSTICS DICTIONARY + DISABLE + DISCARD DISCONNECT DISPATCH DISTINCT + DLNEWCOPY + DLPREVIOUSCOPY + DLURLCOMPLETE + DLURLCOMPLETEONLY + DLURLCOMPLETEWRITE + DLURLPATH + DLURLPATHONLY + DLURLPATHWRITE + DLURLSCHEME + DLURLSERVER + DLVALUE DO + DOCUMENT DOMAIN - DOUBLE DROP DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH - ELSE + ELEMENT + EMPTY + ENABLE ENCODING ENCRYPTED END END-EXEC + END_FRAME + END_PARTITION + ENFORCED + ENUM EQUALS ESCAPE - EVERY + EVENT EXCEPT - EXCEPTION + EXCLUDE + EXCLUDING EXCLUSIVE EXEC EXECUTE - EXISTING EXISTS EXPLAIN + EXPRESSION + EXTENSION EXTERNAL FALSE FETCH + FILE + FILTER FINAL FIRST - FOR + FIRST_VALUE + FLAG + FLOAT + FOLLOWING FORCE FOREIGN FORTRAN FORWARD FOUND + FRAME_ROW FREE FREEZE FROM + FS FULL FUNCTION + FUNCTIONS + FUSION G GENERAL GENERATED @@ -189,180 +270,246 @@ GOTO GRANT GRANTED + GREATEST GROUP GROUPING + GROUPS HANDLER HAVING + HEADER + HEX HIERARCHY HOLD - HOST HOUR + ID IDENTITY IGNORE ILIKE IMMEDIATE + IMMEDIATELY IMMUTABLE IMPLEMENTATION - IN + IMPLICIT + IMPORT + INCLUDING INCREMENT + INDENT INDEX + INDEXES INDICATOR - INFIX + INHERIT INHERITS - INITIALIZE INITIALLY + INLINE INNER INOUT INPUT INSENSITIVE INSERT INSTANCE INSTANTIABLE INSTEAD + INTEGRITY INTERSECT - INTERVAL + INTERSECTION INTO INVOKER - IS ISNULL ISOLATION - ITERATE JOIN K KEY KEY_MEMBER KEY_TYPE - LANCOMPILER + LABEL + LAG LANGUAGE LARGE LAST + LAST_VALUE LATERAL + LEAD LEADING + LEAKPROOF + LEAST LEFT - LENGTH - LESS LEVEL - LIKE + LIBRARY + LIKE_REGEX LIMIT + LINK LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK - LOWER + LOCKED + LOGGED M MAP + MAPPING MATCH - MAX + MATCHED + MATERIALIZED MAXVALUE + MAX_CARDINALITY + MEMBER + MERGE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT METHOD - MIN MINUTE MINVALUE - MOD MODE MODIFIES - MODIFY MODULE MONTH MORE MOVE + MULTISET MUMPS NAME NAMES + NAMESPACE NATIONAL NATURAL + NCHAR + NCLOB + NESTING NEW NEXT + NFC + NFD + NFKC + NFKD + NIL NO - NOCREATEDB - NOCREATEUSER NONE - NOT + NORMALIZE + NORMALIZED NOTHING NOTIFY NOTNULL + NOWAIT + NTH_VALUE + NTILE NULL NULLABLE - NULLIF + NULLS NUMBER - NUMERIC OBJECT - OCTET_LENGTH + OCCURRENCES_REGEX + OCTETS OF OFF OFFSET OIDS OLD ON ONLY OPEN - OPERATION OPERATOR OPTION OPTIONS ORDER + ORDERING ORDINALITY + OTHERS OUT OUTER OUTPUT + OVER OVERLAPS - OVERLAY OVERRIDING + OWNED OWNER + P PAD + PARALLEL PARAMETER - PARAMETERS PARAMETER_MODE PARAMETER_NAME PARAMETER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG PARAMETER_SPECIFIC_NAME PARAMETER_SPECIFIC_SCHEMA + PARSER PARTIAL + PARTITION PASCAL + PASSING + PASSTHROUGH PASSWORD - PATH - PENDANT + PERCENT + PERCENTILE_CONT + PERCENTILE_DISC + PERCENT_RANK + PERIOD + PERMISSION + PLACING + PLANS PLI - POSITION - POSTFIX + POLICY + PORTION + POSITION_REGEX + PRECEDES + PRECEDING PRECISION - PREFIX - PREORDER PREPARE + PREPARED PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE + PROGRAM PUBLIC + PUBLICATION + QUOTE + RANGE + RANK READ READS - REAL + REASSIGN + RECHECK + RECOVERY RECURSIVE REF REFERENCES REFERENCING + REFRESH + REGR_AVGX + REGR_AVGY + REGR_COUNT + REGR_INTERCEPT + REGR_R2 + REGR_SLOPE + REGR_SXX + REGR_SXY + REGR_SYY REINDEX RELATIVE + RELEASE RENAME REPEATABLE - REPLACE + REPLICA + REQUIRING RESET + RESPECT + RESTART + RESTORE RESTRICT RESULT - RETURN + RETURNED_CARDINALITY RETURNED_LENGTH RETURNED_OCTET_LENGTH RETURNED_SQLSTATE + RETURNING RETURNS REVOKE RIGHT @@ -376,33 +523,42 @@ ROW ROWS ROW_COUNT + ROW_NUMBER RULE SAVEPOINT SCALE SCHEMA + SCHEMAS SCHEMA_NAME SCOPE + SCOPE_CATALOG + SCOPE_NAME + SCOPE_SCHEMA SCROLL SEARCH SECOND SECTION SECURITY SELECT + SELECTIVE SELF SENSITIVE SEQUENCE + SEQUENCES SERIALIZABLE + SERVER SERVER_NAME SESSION - SESSION_USER SET SETOF SETS SHARE SHOW SIMILAR SIMPLE SIZE + SKIP + SNAPSHOT SOME SOURCE SPACE @@ -416,169 +572,166 @@ SQLSTATE SQLWARNING STABLE + STANDALONE START STATE STATEMENT STATIC STATISTICS + STDDEV_POP + STDDEV_SAMP STDIN STDOUT + STORAGE + STRICT + STRIP STRUCTURE STYLE SUBCLASS_ORIGIN - SUBLIST - SUBSTRING - SUM + SUBMULTISET + SUBSCRIPTION + SUBSTRING_REGEX + SUCCEEDS SYMMETRIC SYSID SYSTEM + SYSTEM_TIME SYSTEM_USER + T TABLE + TABLES + TABLESAMPLE + TABLESPACE TABLE_NAME TEMP TEMPLATE TEMPORARY - TERMINATE - THAN - THEN + TIES TIMEZONE_HOUR TIMEZONE_MINUTE TO - TOAST + TOKEN + TOP_LEVEL_COUNT TRAILING TRANSACTION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK TRANSACTION_ACTIVE TRANSFORM TRANSFORMS - TRANSLATE + TRANSLATE_REGEX TRANSLATION TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA - TRIM + TRIM_ARRAY TRUE TRUNCATE TRUSTED TYPE + TYPES + UESCAPE + UNBOUNDED UNCOMMITTED UNDER UNENCRYPTED UNION UNIQUE UNKNOWN + UNLINK UNLISTEN + UNLOGGED UNNAMED UNNEST UNTIL + UNTYPED UPDATE - UPPER + URI USAGE USER USER_DEFINED_TYPE_CATALOG + USER_DEFINED_TYPE_CODE USER_DEFINED_TYPE_NAME USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID + VALIDATE + VALIDATOR VALUE VALUES - VARIABLE + VALUE_OF + VARBINARY + VARIADIC VARYING + VAR_POP + VAR_SAMP VERBOSE - VERSION + VERSIONING VIEW + VIEWS VOLATILE - WHEN WHENEVER WHERE - WHILE + WHITESPACE + WINDOW WITH + WITHIN WITHOUT WORK + WRAPPER WRITE + XMLAGG + XMLATTRIBUTES + XMLBINARY + XMLCAST + XMLCOMMENT + XMLCONCAT + XMLDECLARATION + XMLDOCUMENT + XMLELEMENT + XMLEXISTS + XMLFOREST + XMLITERATE + XMLNAMESPACES + XMLPARSE + XMLPI + XMLQUERY + XMLROOT + XMLSCHEMA + XMLSERIALIZE + XMLTABLE + XMLTEXT + XMLVALIDATE YEAR + YES ZONE - - + - - - * - / - || - |/ - ||/ - ! - !! - @ - & - | - # - << - >> - % - ^ - = - != - <> - < - <= - > - >= - ~ - ~* - !~ - !~* - ^= - := - => - ** - .. - AND - OR - NOT - - ## - && - &< - &> - <-> - <^ - >^ - ?# - ?- - ?-| - @-@ - ?| - ?|| - @@ - ~= - - <<= - >>= - ABS CBRT CEIL + CEILING DEGREES EXP FLOOR LN LOG MOD PI POW + POWER RADIANS RANDOM ROUND + SETSEED SIGN SQRT TRUNC + WIDTH_BUCKET ACOS ASIN @@ -592,31 +745,42 @@ BIT_LENGTH CHAR_LENGTH CHARACTER_LENGTH + CONVERT + GET_BYTE + GET_BIT LOWER OCTET_LENGTH + OVERLAY POSITION + SET_BIT SUBSTRING TRIM UPPER ASCII BTRIM CHR - CONVERT + DECODE + ENCODE INITCAP LENGTH LPAD LTRIM + MD5 PG_CLIENT_ENCODING + QUOTE_IDENT + QUOTE_LITERAL + REGEXP_REPLACE REPEAT + REPLACE RPAD RTRIM + SPLIT_PART STRPOS SUBSTR TO_ASCII + TO_HEX TRANSLATE - ENCODE - DECODE TO_CHAR TO_DATE @@ -628,20 +792,20 @@ DATE_TRUNC EXTRACT ISFINITE + JUSTIFY_HOURS + JUSTIFY_DAYS NOW TIMEOFDAY TIMESTAMP - EXTRACT AREA - BOX CENTER DIAMETER HEIGHT ISCLOSED ISOPEN + NPOINTS PCLOSE - NPOINT POPEN RADIUS WIDTH @@ -652,37 +816,111 @@ PATH POINT POLYGON + + ARRAY_CAT + ARRAY_APPEND + ARRAY_PREPEND + ARRAY_DIMS + ARRAY_LOWER + ARRAY_UPPER + ARRAY_TO_STRING + STRING_TO_ARRAY BROADCAST HOST MASKLEN SET_MASKLEN NETMASK + HOSTMASK NETWORK + TEXT ABBREV + FAMILY NEXTVAL CURRVAL + LASTVAL SETVAL COALESCE NULLIF - - HAS_TABLE_PRIVILEGE - PG_GET_VIEWDEF - PG_GET_RULEDEF - PG_GET_INDEXDEF - PG_GET_USERBYID - OBJ_DESCRIPTION - COL_DESCRIPTION AVG + BIT_AND + BIT_OR + BOOL_AND + BOOL_OR COUNT + EVERY MAX MIN STDDEV SUM VARIANCE + + GENERATE_SERIES + + CURRENT_DATABASE + CURRENT_SCHEMA + CURRENT_SCHEMAS + CURRENT_USER + INET_CLIENT_ADDR + INET_CLIENT_PORT + INET_SERVER_ADDR + INET_SERVER_PORT + SESSION_USER + PG_POSTMASTER_START_TIME + VERSION + + HAS_TABLE_PRIVILEGE + HAS_DATABASE_PRIVILEGE + HAS_FUNCTION_PRIVILEGE + HAS_LANGUAGE_PRIVILEGE + PG_HAS_ROLE + HAS_SCHEMA_PRIVILEGE + HAS_TABLESPACE_PRIVILEGE + + PG_TABLE_IS_VISIBLE + PG_TYPE_IS_VISIBLE + PG_FUNCTION_IS_VISIBLE + PG_OPERATOR_IS_VISIBLE + PG_OPCLASS_IS_VISIBLE + PG_CONVERSION_IS_VISIBLE + + FORMAT_TYPE + PG_GET_CONSTRAINTDEF + PG_GET_EXPR + PG_GET_INDEXDEF + PG_GET_RULEDEF + PG_GET_SERIAL_SEQUENCE + PG_TABLESPACE_DATABASES + PG_GET_TRIGGERDEF + PG_GET_USERBYID + PG_GET_VIEWDEF + + OBJ_DESCRIPTION + COL_DESCRIPTION + + CURRENT_SETTING + SET_CONFIG + + PG_CANCEL_BACKEND + PG_RELOAD_CONF + PG_ROTATE_LOGFILE + + PG_START_BACKUP + PG_STOP_BACKUP + + PG_COLUMN_SIZE + PG_TABLESPACE_SIZE + PG_DATABASE_SIZE + PG_RELATION_SIZE + PG_TOTAL_RELATION_SIZE + PG_SIZE_PRETTY + + PG_LS_DIR + PG_READ_FILE + PG_STAT_FILE BIGINT @@ -698,35 +936,46 @@ CIRCLE DATE DECIMAL + DOUBLE + FLOAT4 FLOAT8 INET INT INT2 INT4 INT8 INTEGER INTERVAL + JSON + JSONB LINE LSEG - LZTEXT MACADDR MONEY NUMERIC - OID PATH + PG_LSN POINT POLYGON REAL SERIAL + SERIAL2 + SERIAL4 SERIAL8 SMALLINT + SMALLSERIAL TEXT TIME TIMESTAMP TIMESTAMPTZ TIMETZ + TSQUERY + TSVECTOR + TXID_SNAPSHOT + UUID VARBIT VARCHAR + XML @@ -742,36 +991,37 @@ - + + - - - - - - - - + - + + + + + + + + - + - + @@ -790,26 +1040,28 @@ - - - - - - - + + + + + + + + + - + - - - + + + - + diff --git a/data/syntax/sql.xml b/data/syntax/sql.xml --- a/data/syntax/sql.xml +++ b/data/syntax/sql.xml @@ -5,8 +5,28 @@ v3 fix comments by Gene Thomas --> - + + + CASE + ELSE + ELSIF + FOR + IF + LOOP + THEN + WHEN + WHILE + + + AND + BETWEEN + IN + IS + LIKE + NOT + OR + ACCESS ACCOUNT @@ -22,7 +42,6 @@ ALTER ANALYZE ANCILLARY - AND ANY ARCHIVE ARCHIVELOG @@ -45,7 +64,6 @@ BEFORE BEGIN BEHALF - BETWEEN BINDING BITMAP BLOCK @@ -65,7 +83,6 @@ CALL CANCEL CASCADE - CASE CATEGORY CHAINED CHANGE @@ -80,7 +97,6 @@ CLOSE CLOSE_CACHED_OPEN_CURSORS CLUSTER - COALESCE COLUMN COLUMNS COLUMN_VALUE @@ -149,8 +165,6 @@ DROP DYNAMIC EACH - ELSE - ELSIF EMPTY ENABLE END @@ -185,7 +199,6 @@ FLASHBACK FLUSH FOLLOWING - FOR FORCE FOREIGN FREELIST @@ -214,9 +227,7 @@ IDENTIFIER IDGENERATORS IDLE_TIME - IF IMMEDIATE - IN INCLUDING INCREMENT INCREMENTAL @@ -239,7 +250,6 @@ INTERSECT INTO INVALIDATE - IS ISOLATION ISOLATION_LEVEL JAVA @@ -254,7 +264,6 @@ LESS LEVEL LIBRARY - LIKE LIMIT LINK LIST @@ -268,7 +277,6 @@ LOGICAL_READS_PER_SESSION LOGOFF LOGON - LOOP MANAGE MANAGED MANAGEMENT @@ -345,7 +353,6 @@ NORMAL NOSEGMENT NOSORT - NOT NOTHING NOVALIDATE NOWAIT @@ -368,7 +375,6 @@ OPTIMAL OPTIMIZER_GOAL OPTION - OR ORDER ORGANIZATION OUT @@ -538,7 +544,6 @@ TEMPORARY THAN THE - THEN THREAD THROUGH TIMEOUT @@ -584,35 +589,13 @@ VALIDATION VALUES VIEW - WHEN WHENEVER WHERE - WHILE WITH WITHOUT WORK WRITE - - + - - - * - / - || - = - != - <> - < - <= - > - >= - ~= - ^= - := - => - ** - .. - ABS ACOS @@ -895,7 +878,16 @@ - + + + + + + + + + + @@ -911,7 +903,6 @@ - @@ -932,28 +923,30 @@ - - - - - - - - + + + + + + + + + + - + - - - - + + + + - + diff --git a/src/indexer/katehighlightingindexer.cpp b/src/indexer/katehighlightingindexer.cpp --- a/src/indexer/katehighlightingindexer.cpp +++ b/src/indexer/katehighlightingindexer.cpp @@ -32,6 +32,10 @@ #include #endif +#include +#include +#include + namespace { QStringList readListing(const QString &fileName) @@ -117,13 +121,15 @@ const QString c = xml.attributes().value(QLatin1String("char")).toString(); if (c.size() != 1) { qWarning() << hlFilename << "line" << xml.lineNumber() << "'char' must contain exactly one char:" << c; + return false; } } if (testChar1) { const QString c = xml.attributes().value(QLatin1String("char1")).toString(); if (c.size() != 1) { qWarning() << hlFilename << "line" << xml.lineNumber() << "'char1' must contain exactly one char:" << c; + return false; } } @@ -375,6 +381,182 @@ QSet m_existingAttributeNames; }; +//! Proposes to replace StringDetect with DetectChar or Detect2Chars +bool suggestForStringDetect(const QString &hlFilename, QXmlStreamReader &xml) +{ + if (xml.name() == QLatin1String("StringDetect")) { + const auto insensitive = xml.attributes().value(QLatin1String("insensitive")); + if (insensitive != QStringLiteral("true")) { + const auto str = xml.attributes().value(QLatin1String("String")).toString(); + if (str.size() == 1) { + qWarning() << hlFilename << "line" << xml.lineNumber() << "StringDetect candidate for DetectChar:" << str; + return false; + } + else if (str.size() == 2) { + qWarning() << hlFilename << "line" << xml.lineNumber() << "StringDetect candidate for Detect2Chars:" << str; + return false; + } + } + } + + return true; +} + +//! Proposes to replace AnyChar with DetectChar +bool suggestForAnyChar(const QString &hlFilename, QXmlStreamReader &xml) +{ + if (xml.name() == QLatin1String("AnyChar")) { + const auto string = xml.attributes().value(QLatin1String("String")).toString(); + if (string.size() == 1) { + qWarning() << hlFilename << "line" << xml.lineNumber() << "AnyChar candidate for DetectChar:" << string; + return false; + } + } + + return true; +} + +struct SuggestPattern +{ + QLatin1String suggest; + QRegularExpression regex; + bool hasInsensitiveAttribute; + + SuggestPattern(const char *suggest, const QString &stringRegex, bool hasInsensitiveAttribute) + : suggest(suggest) + , regex(stringRegex) + , hasInsensitiveAttribute(hasInsensitiveAttribute) + { + Q_ASSERT(regex.isValid()); + } +}; + +#define CharReg R"((?:\\[^a-su-zA-Z]|[^^$.+*?|{\[\\]))" +SuggestPattern suggestPatterns[]{ + {"HlCHex", QStringLiteral(R"(^0x\[(?:0-9|a-f|A-F){3}\][*+]$)"), false}, + {"HlCStringChar", QStringLiteral(R"(^\\\[[abefnrtv"'?]{11}\]$)"), false}, + {"RangeDetect", QStringLiteral("^(" CharReg R"()\[\^\1\]\*\1$)"), false}, + {"Int", QStringLiteral(R"(^(?:\[0-9\]|\\d)(?:\+|(?:(?:\[0-9\]|\\d)\*))$)"), false}, + {"LineContinue", QStringLiteral("^" CharReg "\\$$"), false}, + {"LineContinue with column=\"0\"", QStringLiteral("^\\^" CharReg "\\$$"), false}, + {"DetectChar", QStringLiteral("^" CharReg "$"), false}, + {"Detect2Chars", QStringLiteral("^" CharReg CharReg "$"), false}, + {"DetectChar with column=\"0\"", QStringLiteral("^\\^" CharReg "$"), false}, + {"Detect2Chars with column=\"0\"", QStringLiteral("^\\^" CharReg CharReg "$"), false}, + {"AnyChar", QStringLiteral(R"(^\^?\[(?:\\\]|[^\]])+\]\$?$)"), true}, + {"StringDetect", QStringLiteral("^" CharReg "*$"), true}, + {"WordDetect", QStringLiteral(R"(^\\b)" CharReg R"(*\\b$)"), true}, + {"DetectIdentifier", QStringLiteral(R"(^\[(?:_|a-z){2}\]\[(?:(?:0-9|a-z|_){3}|\\w)\]\*$)"), false}, + {"DetectIdentifier", QStringLiteral(R"(^\[(?:_|a-z|A-Z){3}\]\[(?:(?:0-9|a-z|A-Z|_){4}|\\w)\]\*$)"), true}, +}; +#undef CharReg + +//! Proposes to replace RegExpr with another element (HlCHex, HlCStringChar, RangeDetect, etc) +bool suggestForRegExp(const QString &hlFilename, QXmlStreamReader &xml) +{ + if (xml.name() == QLatin1String("RegExpr")) { + auto string = xml.attributes().value(QLatin1String("String")).toString(); + if (xml.attributes().hasAttribute(QLatin1String("lookAhead"))) { + const auto lookAhead = xml.attributes().value(QLatin1String("lookAhead")); + if (string == QLatin1String("^$") || (lookAhead == QLatin1String("true") && string == QLatin1String("."))) { + const auto context = xml.attributes().value(QLatin1String("context")); + qWarning() << hlFilename << "line" << xml.lineNumber() + << QStringLiteral("RegExpr candidate for fallthroughContext=\"") + context + QStringLiteral("\" fallthrough=\"true\""); + return false; + } + } + + const auto insensitive = xml.attributes().value(QLatin1String("insensitive")); + const bool isFirstNonSpace = string.startsWith(QLatin1String("^\\s*")); + if (isFirstNonSpace) { + string.remove(0, 4); + } + for (const auto &suggestPattern : suggestPatterns) { + if (insensitive == QLatin1String("true") && !suggestPattern.hasInsensitiveAttribute) { + continue; + } + if (suggestPattern.regex.match(string).hasMatch()) { + const auto extra = (isFirstNonSpace ? " with firstNonSpace=\"true\":" : ":"); + qWarning() << hlFilename << "line" << xml.lineNumber() << "RegExpr candidate for " << suggestPattern.suggest << extra << string; + return false; + } + } + } + + return true; +} + +/** + * Helper class that suggests rule mergers + */ +class RuleMergeSuggest +{ +public: + bool suggest(const QString &hlFilename, QXmlStreamReader &xml) + { + if (xml.attributes().hasAttribute(QLatin1String("attribute")) && xml.name() != QLatin1String("context")) { + const std::size_t specificAttributeLength = 3; + const QStringRef values[] { + xml.attributes().value(QLatin1String("String")), + xml.attributes().value(QLatin1String("char")), + xml.attributes().value(QLatin1String("char1")), + xml.name(), + xml.attributes().value(QLatin1String("attribute")), + xml.attributes().value(QLatin1String("context")), + xml.attributes().value(QLatin1String("beginRegion")), + xml.attributes().value(QLatin1String("endRegion")), + xml.attributes().value(QLatin1String("lookAhead")), + xml.attributes().value(QLatin1String("firstNonSpace")), + xml.attributes().value(QLatin1String("column")), + }; + // check the size of the tables and display the number of elements in a compilation error in case of mismatch + std::extent::type{} = std::extent::type{}; + + if (std::equal(std::begin(values) + specificAttributeLength, std::end(values), std::begin(m_previousRule) + specificAttributeLength) + && (canBeMerged(m_previousRule, values) + || canBeMerged(values, m_previousRule) + || std::equal(std::begin(values), std::end(values) - specificAttributeLength, std::begin(m_previousRule)) + )) { + qWarning() << hlFilename << "line" << xml.lineNumber() << xml.name() << "can be merged with the previous rule"; + return false; + } + + std::size_t i = 0; + for (auto& stringRef : values) { + m_previousRule[i] = stringRef.toString(); + ++i; + } + } + else { + m_previousRule[3].clear(); + } + + return true; + } + +private: + template + bool canBeMerged(const Array1 &array1, const Array2 &array2) { + if (array1[3] == QLatin1String("RegExpr")) { + return true; + } + if (array1[3] == QLatin1String("DetectChar")) { + if (array2[3] == QLatin1String("AnyChar")) { + return true; + } + if (array2[3] == QLatin1String("RangeDetect")) { + const auto cleft = array2[1][0].digitValue(); + const auto cright = array2[2][0].digitValue(); + const auto c = array1[1][0].digitValue(); + return ((cleft <= c && c <= cright) || (c + 1 == cleft) || (cright + 1 == c)); + } + } + return false; + } + + QString m_previousRule[11]; +}; + } int main(int argc, char *argv[]) @@ -464,6 +646,7 @@ AttributeChecker attributeChecker(hlFilename); KeywordChecker keywordChecker(hlFilename); + RuleMergeSuggest ruleMergeSuggest; const QString hlName = hl[QStringLiteral("name")].toString(); // scan for broken regex or keywords with spaces @@ -505,6 +688,30 @@ anyError = 7; continue; } + + // suggestions for StringDetect + if (!suggestForStringDetect(hlFilename, xml)) { + //anyError = 12; + continue; + } + + // suggestions for AnyChar + if (!suggestForAnyChar(hlFilename, xml)) { + //anyError = 12; + continue; + } + + // suggestions for RegExp + if (!suggestForRegExp(hlFilename, xml)) { + //anyError = 12; + continue; + } + + // suggestions for a rule merge + if (ruleMergeSuggest.suggest(hlFilename, xml)) { + //anyError = 12; + continue; + } } if (!attributeChecker.check()) { diff --git a/src/lib/rule.cpp b/src/lib/rule.cpp --- a/src/lib/rule.cpp +++ b/src/lib/rule.cpp @@ -672,6 +672,7 @@ bool WordDetect::doLoad(QXmlStreamReader& reader) { m_word = reader.attributes().value(QStringLiteral("String")).toString(); + m_caseSensitivity = Xml::attrToBool(reader.attributes().value(QStringLiteral("insensitive"))) ? Qt::CaseInsensitive : Qt::CaseSensitive; return !m_word.isEmpty(); } @@ -684,7 +685,7 @@ if (offset > 0 && !isDelimiter(text.at(offset - 1))) return offset; - if (text.midRef(offset, m_word.size()) != m_word) + if (text.midRef(offset, m_word.size()).compare(m_word, m_caseSensitivity) != 0) return offset; if (text.size() == offset + m_word.size() || isDelimiter(text.at(offset + m_word.size()))) diff --git a/src/lib/rule_p.h b/src/lib/rule_p.h --- a/src/lib/rule_p.h +++ b/src/lib/rule_p.h @@ -246,6 +246,7 @@ private: QString m_word; + Qt::CaseSensitivity m_caseSensitivity; }; }