Last active
October 16, 2025 03:05
-
-
Save ardentperf/44e94ac484e53ff8353f6c1dc0b8f272 to your computer and use it in GitHub Desktop.
simple function to sanitize SQL text
This file contains hidden or 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
| CREATE OR REPLACE FUNCTION sanatize_sql(sql_text text) | |
| RETURNS text AS $$ | |
| DECLARE | |
| cleaned_text text; | |
| first_part_regex_3words text := '([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)'; | |
| first_part_regex_2words text := '([^[:space:]]+)[[:space:]]+([^[:space:]]+)'; | |
| first_part_regex_1words text := '([^[:space:]]+)'; | |
| first_part text; | |
| match_array text; | |
| from_parts_regex_3words text := '(FROM)[[:space:]]+([^[:space:]]+)[[:space:]]*([^[:space:]]*)'; | |
| from_parts text := ''; | |
| BEGIN | |
| -- Remove multi-line comments (/* ... */) | |
| cleaned_text := regexp_replace(sql_text, '/\*.*?\*/', '', 'g'); | |
| -- Remove single-line comments (-- to end of line) | |
| cleaned_text := regexp_replace(cleaned_text, '--.*?(\n|$)', '', 'g'); | |
| -- Extract the first keyword and up to two words after it | |
| first_part := array_to_string(regexp_match(cleaned_text,first_part_regex_3words),' '); | |
| if first_part is null or first_part ILIKE '% FROM %' or first_part ILIKE '% FROM' then | |
| first_part := array_to_string(regexp_match(cleaned_text,first_part_regex_2words),' '); | |
| if first_part is null or first_part ILIKE '% FROM' then | |
| first_part := array_to_string(regexp_match(cleaned_text,first_part_regex_1words),' '); | |
| end if; | |
| end if; | |
| first_part := regexp_replace(first_part, '\(.*','(...)'); | |
| -- Find all occurrences of FROM and two words after each | |
| FOR match_array IN | |
| SELECT array_to_string(regexp_matches(cleaned_text,from_parts_regex_3words,'gi'),' ') | |
| LOOP | |
| match_array := regexp_replace(match_array, '\(.*','(...)'); | |
| from_parts := from_parts || '...' || match_array; | |
| END LOOP; | |
| -- Return combined result | |
| RETURN first_part || from_parts; | |
| END; | |
| $$ LANGUAGE plpgsql; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment