Created
April 7, 2017 16:33
-
-
Save lshifr/97ef1b61823fb175e52c89058143fc82 to your computer and use it in GitHub Desktop.
Simple SQL formatter / highlighter, for Mathematica
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$sqlKeywords = { | |
"ABSOLUTE","ACTION","ADD","AFTER","ALL","ALLOCATE","ALTER","AND","ANY","ARE","ARRAY","AS", | |
"ASC","ASENSITIVE","ASSERTION","ASYMMETRIC","AT","ATOMIC","AUTHORIZATION","AVG","BEFORE", | |
"BEGIN","BETWEEN","BIGINT","BINARY","BIT","BIT_LENGTH","BLOB","BOOLEAN","BOTH","BREADTH", | |
"BY","CALL","CALLED","CASCADE","CASCADED","CASE","CAST","CATALOG","CHAR","CHARACTER", | |
"CHARACTER_LENGTH","CHAR_LENGTH","CHECK","CLOB","CLOSE","COALESCE","COLLATE","COLLATION", | |
"COLUMN","COMMIT","CONDITION","CONNECT","CONNECTION","CONSTRAINT","CONSTRAINTS","CONSTRUCTOR", | |
"CONTAINS","CONTINUE","CONVERT","CORRESPONDING","COUNT","CREATE","CROSS","CUBE","CURRENT", | |
"CURRENT_DATE","CURRENT_DEFAULT_TRANSFORM_GROUP","CURRENT_PATH","CURRENT_ROLE","CURRENT_TIME", | |
"CURRENT_TIMESTAMP","CURRENT_TRANSFORM_GROUP_FOR_TYPE","CURRENT_USER","CURSOR","CYCLE","DATA", | |
"DATE","DAY","DEALLOCATE","DEC","DECIMAL","DECLARE","DEFAULT","DEFERRABLE","DEFERRED","DELETE", | |
"DEPTH","DEREF","DESC","DESCRIBE","DESCRIPTOR","DETERMINISTIC","DIAGNOSTICS","DISCONNECT", | |
"DISTINCT","DO","DOMAIN","DOUBLE","DROP","DYNAMIC","EACH","ELEMENT","ELSE","ELSEIF","END", | |
"EQUALS","ESCAPE","EXCEPT","EXCEPTION","EXEC","EXECUTE","EXISTS","EXIT","EXTERNAL","EXTRACT", | |
"FALSE","FETCH","FILTER","FIRST","FLOAT","FOR","FOREIGN","FOUND","FREE","FROM","FULL", | |
"FUNCTION","GENERAL","GET","GLOBAL","GO","GOTO","GRANT","GROUP","GROUPING","HANDLER","HAVING", | |
"HOLD","HOUR","IDENTITY","IF","IMMEDIATE","IN","INDICATOR","INITIALLY","INNER","INOUT","INPUT", | |
"INSENSITIVE","INSERT","INT","INTEGER","INTERSECT","INTERVAL","INTO","IS","ISOLATION","ITERATE", | |
"JOIN","KEY","LANGUAGE","LARGE","LAST","LATERAL","LEADING","LEAVE","LEFT","LEVEL","LIKE","LOCAL", | |
"LOCALTIME","LOCALTIMESTAMP","LOCATOR","LOOP","LOWER","MAP","MATCH","MAX","MEMBER","MERGE", | |
"METHOD","MIN","MINUTE","MODIFIES","MODULE","MONTH","MULTISET","NAMES","NATIONAL","NATURAL", | |
"NCHAR","NCLOB","NEW","NEXT","NO","NONE","NOT","NULL","NULLIF","NUMERIC","OBJECT","OCTET_LENGTH", | |
"OF","OLD","ON","ONLY","OPEN","OPTION","OR","ORDER","ORDINALITY","OUT","OUTER","OUTPUT","OVER", | |
"OVERLAPS","PAD","PARAMETER","PARTIAL","PARTITION","PATH","POSITION","PRECISION","PREPARE", | |
"PRESERVE","PRIMARY","PRIOR","PRIVILEGES","PROCEDURE","PUBLIC","RANGE","READ","READS","REAL", | |
"RECURSIVE","REF","REFERENCES","REFERENCING","RELATIVE","RELEASE","REPEAT","RESIGNAL", | |
"RESTRICT","RESULT","RETURN","RETURNS","REVOKE","RIGHT","ROLE","ROLLBACK","ROLLUP","ROUTINE", | |
"ROW","ROWS","SAVEPOINT","SCHEMA","SCOPE","SCROLL","SEARCH","SECOND","SECTION","SELECT", | |
"SENSITIVE","SESSION","SESSION_USER","SET","SETS","SIGNAL","SIMILAR","SIZE","SMALLINT","SOME", | |
"SPACE","SPECIFIC","SPECIFICTYPE","SQL","SQLCODE","SQLERROR","SQLEXCEPTION","SQLSTATE", | |
"SQLWARNING","START","STATE","STATIC","SUBMULTISET","SUBSTRING","SUM","SYMMETRIC","SYSTEM", | |
"SYSTEM_USER","TABLE","TABLESAMPLE","TEMPORARY","THEN","TIME","TIMESTAMP","TIMEZONE_HOUR", | |
"TIMEZONE_MINUTE","TO","TRAILING","TRANSACTION","TRANSLATE","TRANSLATION","TREAT","TRIGGER", | |
"TRIM","TRUE","UNDER","UNDO","UNION","UNIQUE","UNKNOWN","UNNEST","UNTIL","UPDATE","UPPER", | |
"USAGE","USER","USING","VALUE","VALUES","VARCHAR","VARYING","VIEW","WHEN","WHENEVER","WHERE", | |
"WHILE","WINDOW","WITH","WITHIN","WITHOUT","WORK","WRITE","YEAR","ZONE"}; | |
ClearAll[sqlHighlight]; | |
sqlHighlight[sqlString_String]:= | |
StringJoin @ Replace[ | |
StringSplit[sqlString, w:Whitespace :> w], | |
{ | |
kw: Alternatives @@ $sqlKeywords :> | |
ToString[Style[kw, Purple, FontWeight->Bold], StandardForm], | |
op: Alternatives["+", "-", "*", "/", ">", ">=", "<", "<=", "=", "<>", "!="]:> | |
ToString[Style[op, Blue, FontWeight->Bold], StandardForm] | |
}, | |
{1} | |
]; | |
ClearAll[checkFailure]; | |
checkFailure = If[FailureQ[#], Return[#, Composition], #]&; | |
ClearAll[sqlFormat]; | |
sqlFormat[sqlString_String, colorize_:True]:= | |
Module[{resp, highlighter}, | |
highlighter = If[TrueQ @ colorize, sqlHighlight, Identity]; | |
resp = URLRead @ HTTPRequest[ | |
URL["https://sqlformat.org/api/v1/format"], | |
<| | |
"Query"-> {"sql" -> sqlString, "reindent" -> 1}, | |
"Scheme" -> "https" | |
|> | |
]; | |
If[resp["StatusCode"] =!= 200, | |
Return[$Failed] | |
]; | |
Composition[ | |
highlighter, | |
Lookup["result"], | |
checkFailure, | |
ImportString[#,"JSON"]& | |
] @ resp["Body"] | |
]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment