Files
2026-06-24 13:47:14 +02:00

121 lines
5.7 KiB
Python

import random
from typing import Callable
import mutator_corpus_splicing
import mutator_equivalent_rewrites
import mutator_extra_statements
import mutator_operators
import mutator_values
_MUTATORS_WEIGHTED: list[tuple[Callable[[str], str], float]] = [
# # ##############################################################################################
(mutator_values.mut_replace_num_with_edge_int, 3),
(mutator_values.mut_replace_num_with_random_int, 2),
(mutator_values.mut_replace_num_with_edge_float, 2),
(mutator_values.mut_replace_num_with_edge_string, 2),
(mutator_values.mut_replace_num_with_random_hex, 2),
(mutator_values.mut_replace_num_with_null, 2),
(mutator_values.mut_wrap_num_in_cast, 3),
(mutator_values.mut_wrap_num_in_datetime_func, 2),
(mutator_values.mut_wrap_num_in_core_func, 10),
(mutator_values.mut_wrap_num_in_math_func, 5),
(mutator_values.mut_wrap_num_in_json_func, 5),
# # ##############################################################################################
(mutator_operators.mut_swap_comparison, 2),
(mutator_operators.mut_swap_boolean, 2),
(mutator_operators.mut_negate_where, 2),
(mutator_operators.mut_change_type, 2),
(mutator_operators.mut_swap_join_type, 2),
# # ##############################################################################################
(mutator_extra_statements.mut_append_select_star, 6),
(mutator_extra_statements.mut_append_count, 6),
(mutator_extra_statements.mut_append_join, 7),
(mutator_extra_statements.mut_append_subquery, 9),
(mutator_extra_statements.mut_append_cte, 9),
(mutator_extra_statements.mut_append_window, 7),
(mutator_extra_statements.mut_append_filter, 6),
(mutator_extra_statements.mut_append_aggregate, 7),
(mutator_extra_statements.mut_append_update, 6),
(mutator_extra_statements.mut_append_delete, 6),
(mutator_extra_statements.mut_append_index, 6),
(mutator_extra_statements.mut_append_view, 6),
(mutator_extra_statements.mut_append_trigger, 6),
(mutator_extra_statements.mut_wrap_savepoint, 6),
(mutator_extra_statements.mut_wrap_transaction, 6),
(mutator_extra_statements.mut_wrap_attach_detach, 5),
(mutator_extra_statements.mut_append_vacuum, 5),
(mutator_extra_statements.mut_append_analyze, 6),
(mutator_extra_statements.mut_append_reindex, 5),
(mutator_extra_statements.mut_append_null_insert, 6),
(mutator_extra_statements.mut_append_insert_default, 6),
(mutator_extra_statements.mut_append_insert_select, 6),
(mutator_extra_statements.mut_append_insert_or_x, 6),
(mutator_extra_statements.mut_append_upsert, 6),
(mutator_extra_statements.mut_append_alter_rename_table, 5),
(mutator_extra_statements.mut_append_alter_rename_column, 5),
(mutator_extra_statements.mut_append_alter_add_column, 6),
(mutator_extra_statements.mut_append_alter_drop_column, 5),
(mutator_extra_statements.mut_append_alter_drop_table_index_view_trigger, 5),
(mutator_extra_statements.mut_repeat, 6),
(mutator_extra_statements.mut_prepend_random_pragma, 9),
(mutator_extra_statements.mut_append_random_pragma, 6),
(mutator_extra_statements.mut_prepend_random_meta_command, 9),
# # ##############################################################################################
(mutator_corpus_splicing.mut_splice_append, 4),
(mutator_corpus_splicing.mut_splice_prepend, 4),
(mutator_corpus_splicing.mut_splice_intersperse, 4),
(mutator_corpus_splicing.mut_splice_replace, 1),
# # ##############################################################################################
(mutator_equivalent_rewrites.mut_between_to_and, 3),
(mutator_equivalent_rewrites.mut_and_to_between, 3),
(mutator_equivalent_rewrites.mut_in_to_or, 3),
(mutator_equivalent_rewrites.mut_arithmetic_identity, 3),
(mutator_equivalent_rewrites.mut_double_negate, 3),
(mutator_equivalent_rewrites.mut_string_concat_identity, 3),
(mutator_equivalent_rewrites.mut_double_not, 3),
(mutator_equivalent_rewrites.mut_de_morgan, 3),
(mutator_equivalent_rewrites.mut_tautology_and, 3),
(mutator_equivalent_rewrites.mut_tautology_or, 3),
(mutator_equivalent_rewrites.mut_is_null_to_isnull, 2),
(mutator_equivalent_rewrites.mut_eq_to_is, 2),
(mutator_equivalent_rewrites.mut_inject_null_check, 2),
(mutator_equivalent_rewrites.mut_subquery_in_from, 3),
(mutator_equivalent_rewrites.mut_add_indexed_by, 2),
(mutator_equivalent_rewrites.mut_qualify_with_main, 2),
(mutator_equivalent_rewrites.mut_predicate_pushdown_blocker, 2),
(mutator_equivalent_rewrites.mut_force_materialization, 2),
(mutator_equivalent_rewrites.mut_comma_join_to_explicit, 2),
(mutator_equivalent_rewrites.mut_swap_on_to_using, 2),
(mutator_equivalent_rewrites.mut_inject_empty_block_comment, 2),
(mutator_equivalent_rewrites.mut_inject_non_empty_block_comment, 2),
(mutator_equivalent_rewrites.mut_inject_line_comment, 2),
(mutator_equivalent_rewrites.mut_redundant_parens, 2),
(mutator_equivalent_rewrites.mut_quote_identifier, 2),
(mutator_equivalent_rewrites.mut_memeify, 2),
(mutator_equivalent_rewrites.mut_swap_whitespace, 2),
(mutator_equivalent_rewrites.mut_to_case_expr, 2),
(mutator_equivalent_rewrites.mut_iif_to_case, 2),
(mutator_equivalent_rewrites.mut_case_to_iif, 2),
]
MUTATIONS: list[Callable[[str], str]] = [m for m, _ in _MUTATORS_WEIGHTED]
_MUT_FUNCS = MUTATIONS
_MUT_WEIGHTS = [w for _, w in _MUTATORS_WEIGHTED]
def mutate(sql: str) -> str:
n = random.choices([1, 2, 3, 10, 20], weights=[3, 7, 13, 27, 50], k=1)[0]
out = sql
_MUT_SOFT_CAP = 100000
for _ in range(n):
if len(out) > _MUT_SOFT_CAP:
break
m = random.choices(_MUT_FUNCS, weights=_MUT_WEIGHTS, k=1)[0]
try:
new = m(out)
except Exception:
continue
if isinstance(new, str):
out = new
return out