This commit is contained in:
Raúl Marín 2023-02-01 11:11:03 +01:00
parent 0b201ebff2
commit 61dfebd299

View File

@ -26,430 +26,430 @@ namespace
const std::unordered_set<std::string_view> keywords
{
"!=",
"",
"%",
"*",
"+",
"-",
"->",
".",
"/",
":",
"::",
"<",
"<=",
"<>",
"=",
"==",
">",
">=",
"?",
"[",
"]+",
"]+|[",
"^[",
"||",
"]+$",
"ACCESS",
"ACTION",
"ADD",
"ADMIN",
"AFTER",
"ALGORITHM",
"ALIAS",
"ALL",
"ALLOWED_LATENESS",
"ALTER",
"AND",
"ANTI",
"ANY",
"APPLY",
"ARRAY",
"AS",
"ASC",
"ASCENDING",
"ASOF",
"ASSUME",
"AST",
"ASYNC",
"ATTACH",
"AUTO_INCREMENT",
"BACKUP",
"BASE_BACKUP",
"BEGIN",
"BETWEEN",
"BIDIRECTIONAL",
"BOTH",
"BY",
"CACHE",
"CACHES",
"CASCADE",
"CASE",
"CASEWITHEXPRESSION",
"CAST",
"CHANGE",
"CHANGEABLE_IN_READONLY",
"CHANGED",
"CHAR",
"CHARACTER",
"CHECK",
"CLEAR",
"CLUSTER",
"CLUSTER_HOST_IDS",
"CLUSTERS",
"CN",
"CODEC",
"COLLATE",
"COLLECTION",
"COLUMN",
"COLUMNS",
"COMMENT",
"COMMIT",
"COMPRESSION",
"CONCAT",
"CONSTRAINT",
"CREATE",
"CROSS",
"CUBE",
"CURRENT",
"CURRENT_USER",
"DATABASE",
"DATABASES",
"DATE",
"DATE_ADD",
"DATEADD",
"DATE_DIFF",
"DATEDIFF",
"DATE_SUB",
"DATESUB",
"DAY",
"DD",
"DDL",
"DEDUPLICATE",
"DEFAULT",
"DELAY",
"DELETE",
"DESC",
"DESCENDING",
"DESCRIBE",
"DETACH",
"DETACHED",
"DICTIONARIES",
"DICTIONARY",
"DISK",
"DISTINCT",
"DIV",
"DOUBLE_SHA1_HASH",
"DROP",
"ELSE",
"EMPTY",
"ENABLED",
"END",
"ENFORCED",
"ENGINE",
"EPHEMERAL",
"EQUALS",
"ESTIMATE",
"EVENT",
"EVENTS",
"EXCEPT",
"EXCHANGE",
"EXISTS",
"EXPLAIN",
"EXPRESSION",
"EXTERNAL",
"EXTRACT",
"FALSE",
"FETCH",
"FILE",
"FILESYSTEM",
"FILL",
"FILTER",
"FINAL",
"FIRST",
"FOLLOWING",
"FOR",
"FOREIGN",
"FORMAT",
"FREEZE",
"FROM",
"FULL",
"FULLTEXT",
"FUNCTION",
"GLOBAL",
"GRANT",
"GRANTEES",
"GRANTS",
"GRANULARITY",
"GREATER",
"GREATEROREQUALS",
"GROUP",
"GROUPING",
"GROUPS",
"HASH",
"HAVING",
"HDFS",
"HH",
"HIERARCHICAL",
"HOST",
"HOUR",
"ID",
"IDENTIFIED",
"IF",
"ILIKE",
"IN",
"INDEX",
"INFILE",
"INHERIT",
"INJECTIVE",
"INNER",
"INSERT",
"INTERPOLATE",
"INTERSECT",
"INTERVAL",
"INTO",
"INVISIBLE",
"IP",
"IS",
"IS_OBJECT_ID",
"JOIN",
"KEY",
"KEYED",
"KILL",
"LAMBDA",
"LARGE",
"LAST",
"LAYOUT",
"LEADING",
"LEFT",
"LESS",
"LESSOREQUALS",
"LEVEL",
"LIFETIME",
"LIKE",
"LIMIT",
"LIMITS",
"LINEAR",
"LIST",
"LITERAL",
"LIVE",
"LOCAL",
"LTRIM",
"MATCH",
"MATERIALIZE",
"MATERIALIZED",
"MAX",
"MCS",
"MEMORY",
"MI",
"MICROSECOND",
"MILLISECOND",
"MIN",
"MINUS",
"MINUTE",
"MM",
"MOD",
"MODIFY",
"MONTH",
"MOVE",
"MS",
"MULTIIF",
"MUTATION",
"NAME",
"NAMED",
"NANOSECOND",
"NEXT",
"NO",
"NONE",
"NOT",
"NOTEQUALS",
"NOTIN",
"NS",
"NULL",
"NULLS",
"OBJECT",
"OFFSET",
"ON",
"ONLY",
"OPTIMIZE",
"OPTION",
"OR",
"ORDER",
"OUTER",
"OUTFILE",
"OVER",
"OVERRIDE",
"PART",
"PARTIAL",
"PARTITION",
"PARTITIONS",
"PART_MOVE_TO_SHARD",
"PERMANENTLY",
"PERMISSIVE",
"PIPELINE",
"PLAN",
"PLUS",
"POLICY",
"POPULATE",
"POSITION",
"PRECEDING",
"PRECISION",
"PREWHERE",
"PRIMARY",
"PRIVILEGES",
"PROCESSLIST",
"PROFILE",
"PROJECTION",
"QQ",
"QUARTER",
"QUERY",
"QUOTA",
"RANDOMIZED",
"RANGE",
"READONLY",
"REALM",
"RECOMPRESS",
"REFERENCES",
"REFRESH",
"REGEXP",
"REGEXPQUOTEMETA",
"REMOVE",
"RENAME",
"REPLACE",
"REPLACEREGEXPALL",
"REPLACEREGEXPONE",
"RESET",
"RESTORE",
"RESTRICT",
"RESTRICTIVE",
"RESUME",
"REVOKE",
"RIGHT",
"ROLE",
"ROLES",
"ROLLBACK",
"ROLLUP",
"ROW",
"ROWS",
"RTRIM",
"S3",
"SALT",
"SAMPLE",
"SECOND",
"SELECT",
"SEMI",
"SERVER",
"SET",
"SETS",
"SETTING",
"SETTINGS",
"SHA256_HASH",
"SHARD",
"SHOW",
"SIGNED",
"SIMPLE",
"SINGLEVALUEORNULL",
"SNAPSHOT",
"SOURCE",
"SPATIAL",
"SS",
"STDOUT",
"STEP",
"STORAGE",
"STRICT",
"STRICTLY_ASCENDING",
"SUBPARTITION",
"SUBPARTITIONS",
"SUBSTRING",
"SUSPEND",
"SYNC",
"SYNTAX",
"SYSTEM",
"TABLE",
"TABLES",
"TEMPORARY",
"TEST",
"THAN",
"THEN",
"TIES",
"TIMESTAMP",
"TIMESTAMP_ADD",
"TIMESTAMPADD",
"TIMESTAMP_DIFF",
"TIMESTAMPDIFF",
"TIMESTAMP_SUB",
"TIMESTAMPSUB",
"TO",
"TODATE",
"TODATETIME",
"TOP",
"TOTALS",
"TRACKING",
"TRAILING",
"TRANSACTION",
"TREE",
"TRIGGER",
"TRIM",
"TRIMBOTH",
"TRIMLEFT",
"TRIMRIGHT",
"TRUE",
"TRUNCATE",
"TTL",
"TUPLE",
"TYPE",
"UNBOUNDED",
"UNFREEZE",
"UNION",
"UNIQUE",
"UNSIGNED",
"UNTUPLE",
"UPDATE",
"URL",
"USE",
"USER",
"USING",
"UUID",
"VALUES",
"VARYING",
"VIEW",
"VIEWIFPERMITTED",
"VISIBLE",
"VOLUME",
"WATCH",
"WATERMARK",
"WEEK",
"WHEN",
"WHERE",
"WINDOW",
"WITH",
"WK",
"WRITABLE",
"YEAR",
"YYYY",
"ZKPATH"
"!=",
"",
"%",
"*",
"+",
"-",
"->",
".",
"/",
":",
"::",
"<",
"<=",
"<>",
"=",
"==",
">",
">=",
"?",
"[",
"]+",
"]+|[",
"^[",
"||",
"]+$",
"ACCESS",
"ACTION",
"ADD",
"ADMIN",
"AFTER",
"ALGORITHM",
"ALIAS",
"ALL",
"ALLOWED_LATENESS",
"ALTER",
"AND",
"ANTI",
"ANY",
"APPLY",
"ARRAY",
"AS",
"ASC",
"ASCENDING",
"ASOF",
"ASSUME",
"AST",
"ASYNC",
"ATTACH",
"AUTO_INCREMENT",
"BACKUP",
"BASE_BACKUP",
"BEGIN",
"BETWEEN",
"BIDIRECTIONAL",
"BOTH",
"BY",
"CACHE",
"CACHES",
"CASCADE",
"CASE",
"CASEWITHEXPRESSION",
"CAST",
"CHANGE",
"CHANGEABLE_IN_READONLY",
"CHANGED",
"CHAR",
"CHARACTER",
"CHECK",
"CLEAR",
"CLUSTER",
"CLUSTER_HOST_IDS",
"CLUSTERS",
"CN",
"CODEC",
"COLLATE",
"COLLECTION",
"COLUMN",
"COLUMNS",
"COMMENT",
"COMMIT",
"COMPRESSION",
"CONCAT",
"CONSTRAINT",
"CREATE",
"CROSS",
"CUBE",
"CURRENT",
"CURRENT_USER",
"DATABASE",
"DATABASES",
"DATE",
"DATE_ADD",
"DATEADD",
"DATE_DIFF",
"DATEDIFF",
"DATE_SUB",
"DATESUB",
"DAY",
"DD",
"DDL",
"DEDUPLICATE",
"DEFAULT",
"DELAY",
"DELETE",
"DESC",
"DESCENDING",
"DESCRIBE",
"DETACH",
"DETACHED",
"DICTIONARIES",
"DICTIONARY",
"DISK",
"DISTINCT",
"DIV",
"DOUBLE_SHA1_HASH",
"DROP",
"ELSE",
"EMPTY",
"ENABLED",
"END",
"ENFORCED",
"ENGINE",
"EPHEMERAL",
"EQUALS",
"ESTIMATE",
"EVENT",
"EVENTS",
"EXCEPT",
"EXCHANGE",
"EXISTS",
"EXPLAIN",
"EXPRESSION",
"EXTERNAL",
"EXTRACT",
"FALSE",
"FETCH",
"FILE",
"FILESYSTEM",
"FILL",
"FILTER",
"FINAL",
"FIRST",
"FOLLOWING",
"FOR",
"FOREIGN",
"FORMAT",
"FREEZE",
"FROM",
"FULL",
"FULLTEXT",
"FUNCTION",
"GLOBAL",
"GRANT",
"GRANTEES",
"GRANTS",
"GRANULARITY",
"GREATER",
"GREATEROREQUALS",
"GROUP",
"GROUPING",
"GROUPS",
"HASH",
"HAVING",
"HDFS",
"HH",
"HIERARCHICAL",
"HOST",
"HOUR",
"ID",
"IDENTIFIED",
"IF",
"ILIKE",
"IN",
"INDEX",
"INFILE",
"INHERIT",
"INJECTIVE",
"INNER",
"INSERT",
"INTERPOLATE",
"INTERSECT",
"INTERVAL",
"INTO",
"INVISIBLE",
"IP",
"IS",
"IS_OBJECT_ID",
"JOIN",
"KEY",
"KEYED",
"KILL",
"LAMBDA",
"LARGE",
"LAST",
"LAYOUT",
"LEADING",
"LEFT",
"LESS",
"LESSOREQUALS",
"LEVEL",
"LIFETIME",
"LIKE",
"LIMIT",
"LIMITS",
"LINEAR",
"LIST",
"LITERAL",
"LIVE",
"LOCAL",
"LTRIM",
"MATCH",
"MATERIALIZE",
"MATERIALIZED",
"MAX",
"MCS",
"MEMORY",
"MI",
"MICROSECOND",
"MILLISECOND",
"MIN",
"MINUS",
"MINUTE",
"MM",
"MOD",
"MODIFY",
"MONTH",
"MOVE",
"MS",
"MULTIIF",
"MUTATION",
"NAME",
"NAMED",
"NANOSECOND",
"NEXT",
"NO",
"NONE",
"NOT",
"NOTEQUALS",
"NOTIN",
"NS",
"NULL",
"NULLS",
"OBJECT",
"OFFSET",
"ON",
"ONLY",
"OPTIMIZE",
"OPTION",
"OR",
"ORDER",
"OUTER",
"OUTFILE",
"OVER",
"OVERRIDE",
"PART",
"PARTIAL",
"PARTITION",
"PARTITIONS",
"PART_MOVE_TO_SHARD",
"PERMANENTLY",
"PERMISSIVE",
"PIPELINE",
"PLAN",
"PLUS",
"POLICY",
"POPULATE",
"POSITION",
"PRECEDING",
"PRECISION",
"PREWHERE",
"PRIMARY",
"PRIVILEGES",
"PROCESSLIST",
"PROFILE",
"PROJECTION",
"QQ",
"QUARTER",
"QUERY",
"QUOTA",
"RANDOMIZED",
"RANGE",
"READONLY",
"REALM",
"RECOMPRESS",
"REFERENCES",
"REFRESH",
"REGEXP",
"REGEXPQUOTEMETA",
"REMOVE",
"RENAME",
"REPLACE",
"REPLACEREGEXPALL",
"REPLACEREGEXPONE",
"RESET",
"RESTORE",
"RESTRICT",
"RESTRICTIVE",
"RESUME",
"REVOKE",
"RIGHT",
"ROLE",
"ROLES",
"ROLLBACK",
"ROLLUP",
"ROW",
"ROWS",
"RTRIM",
"S3",
"SALT",
"SAMPLE",
"SECOND",
"SELECT",
"SEMI",
"SERVER",
"SET",
"SETS",
"SETTING",
"SETTINGS",
"SHA256_HASH",
"SHARD",
"SHOW",
"SIGNED",
"SIMPLE",
"SINGLEVALUEORNULL",
"SNAPSHOT",
"SOURCE",
"SPATIAL",
"SS",
"STDOUT",
"STEP",
"STORAGE",
"STRICT",
"STRICTLY_ASCENDING",
"SUBPARTITION",
"SUBPARTITIONS",
"SUBSTRING",
"SUSPEND",
"SYNC",
"SYNTAX",
"SYSTEM",
"TABLE",
"TABLES",
"TEMPORARY",
"TEST",
"THAN",
"THEN",
"TIES",
"TIMESTAMP",
"TIMESTAMP_ADD",
"TIMESTAMPADD",
"TIMESTAMP_DIFF",
"TIMESTAMPDIFF",
"TIMESTAMP_SUB",
"TIMESTAMPSUB",
"TO",
"TODATE",
"TODATETIME",
"TOP",
"TOTALS",
"TRACKING",
"TRAILING",
"TRANSACTION",
"TREE",
"TRIGGER",
"TRIM",
"TRIMBOTH",
"TRIMLEFT",
"TRIMRIGHT",
"TRUE",
"TRUNCATE",
"TTL",
"TUPLE",
"TYPE",
"UNBOUNDED",
"UNFREEZE",
"UNION",
"UNIQUE",
"UNSIGNED",
"UNTUPLE",
"UPDATE",
"URL",
"USE",
"USER",
"USING",
"UUID",
"VALUES",
"VARYING",
"VIEW",
"VIEWIFPERMITTED",
"VISIBLE",
"VOLUME",
"WATCH",
"WATERMARK",
"WEEK",
"WHEN",
"WHERE",
"WINDOW",
"WITH",
"WK",
"WRITABLE",
"YEAR",
"YYYY",
"ZKPATH"
};
/// We want to keep some words inside quotes. For example we want to keep HOUR inside:
/// Select now() + INTERVAL '1 HOUR'
const std::unordered_set<std::string_view> keep_words
{
"DAY",
"HOUR",
"ID",
"NAME",
"NANOSECOND",
"MICROSECOND",
"MILLISECOND",
"SECOND",
"MINUTE",
"NUM",
"VALUE",
"WEEK",
"MONTH",
"QUARTER",
"YEAR"
"DAY",
"HOUR",
"ID",
"NAME",
"NANOSECOND",
"MICROSECOND",
"MILLISECOND",
"SECOND",
"MINUTE",
"NUM",
"VALUE",
"WEEK",
"MONTH",
"QUARTER",
"YEAR"
};
/// The list of nouns collected from here: http://www.desiquintans.com/nounlist, Public domain.
@ -1212,29 +1212,29 @@ void obfuscateLiteral(std::string_view src, WriteBuffer & result, SipHash hash_f
while (alpha_end < src_end && isAlphaASCII(*alpha_end))
++alpha_end;
String wordcopy(src_pos, alpha_end);
Poco::toUpperInPlace(wordcopy);
if (keep_words.contains(wordcopy))
{
result.write(src_pos, alpha_end - src_pos);
src_pos = alpha_end;
}
else
{
hash_func.update(src_pos, alpha_end - src_pos);
pcg64 rng(hash_func.get64());
String wordcopy(src_pos, alpha_end);
Poco::toUpperInPlace(wordcopy);
if (keep_words.contains(wordcopy))
{
result.write(src_pos, alpha_end - src_pos);
src_pos = alpha_end;
}
else
{
hash_func.update(src_pos, alpha_end - src_pos);
pcg64 rng(hash_func.get64());
while (src_pos < alpha_end)
{
auto random = rng();
if (isLowerAlphaASCII(*src_pos))
result.write('a' + random % 26);
else
result.write('A' + random % 26);
while (src_pos < alpha_end)
{
auto random = rng();
if (isLowerAlphaASCII(*src_pos))
result.write('a' + random % 26);
else
result.write('A' + random % 26);
++src_pos;
}
}
++src_pos;
}
}
}
else if (isASCII(src_pos[0]))
{