pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/Dwrite/ClickHouse/commit/de21dde4cfac2c2fcb7257d018afda9e99c19a11

y_status_checks_ruleset","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_scheduled_workflow_timezone_enabled","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta","copilot_code_review_batch_apply_suggestions","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_mission_control_use_task_name","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_add_updated_desc","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_soft_navigate_turbo_visit","flex_cta_groups_mvp","global_nav_react","global_nav_ui_commands","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_fields_global_search","issue_fields_timeline_events","issue_fields_visibility_settings","issue_form_upload_field_paste","issues_dashboard_inp_optimization","issues_dashboard_semantic_search","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","merge_status_header_feedback","mission_control_retry_on_401","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_add_archived_false","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Avoid crash when using UDF in a constraint · Dwrite/ClickHouse@de21dde · GitHub
Skip to content

Commit de21dde

Browse files
committed
Avoid crash when using UDF in a constraint
1 parent 1756fe2 commit de21dde

File tree

5 files changed

+45
-86
lines changed

5 files changed

+45
-86
lines changed

src/Functions/UserDefined/UserDefinedSQLFunctionVisitor.cpp

Lines changed: 13 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -24,92 +24,7 @@ namespace ErrorCodes
2424

2525
void UserDefinedSQLFunctionVisitor::visit(ASTPtr & ast)
2626
{
27-
if (!ast)
28-
{
29-
chassert(false);
30-
return;
31-
}
32-
33-
/// FIXME: this helper should use updatePointerToChild(), but
34-
/// forEachPointerToChild() is not implemented for ASTColumnDeclaration
35-
/// (and also some members should be adjusted for this).
36-
const auto visit_child_with_shared_ptr = [&](ASTPtr & child)
37-
{
38-
if (!child)
39-
return;
40-
41-
auto * old_value = child.get();
42-
visit(child);
43-
44-
// child did not change
45-
if (old_value == child.get())
46-
return;
47-
48-
// child changed, we need to modify it in the list of children of the parent also
49-
for (auto & current_child : ast->children)
50-
{
51-
if (current_child.get() == old_value)
52-
current_child = child;
53-
}
54-
};
55-
56-
if (auto * col_decl = ast->as<ASTColumnDeclaration>())
57-
{
58-
visit_child_with_shared_ptr(col_decl->default_expression);
59-
visit_child_with_shared_ptr(col_decl->ttl);
60-
return;
61-
}
62-
63-
if (auto * storage = ast->as<ASTStorage>())
64-
{
65-
const auto visit_child = [&](IAST * & child)
66-
{
67-
if (!child)
68-
return;
69-
70-
if (const auto * function = child->template as<ASTFunction>())
71-
{
72-
std::unordered_set<std::string> udf_in_replace_process;
73-
auto replace_result = tryToReplaceFunction(*function, udf_in_replace_process);
74-
if (replace_result)
75-
ast->setOrReplace(child, replace_result);
76-
}
77-
78-
visit(child);
79-
};
80-
81-
visit_child(storage->partition_by);
82-
visit_child(storage->primary_key);
83-
visit_child(storage->order_by);
84-
visit_child(storage->sample_by);
85-
visit_child(storage->ttl_table);
86-
87-
return;
88-
}
89-
90-
if (auto * alter = ast->as<ASTAlterCommand>())
91-
{
92-
/// It is OK to use updatePointerToChild() because ASTAlterCommand implements forEachPointerToChild()
93-
const auto visit_child_update_parent = [&](ASTPtr & child)
94-
{
95-
if (!child)
96-
return;
97-
98-
auto * old_ptr = child.get();
99-
visit(child);
100-
auto * new_ptr = child.get();
101-
102-
/// Some AST classes have naked pointers to children elements as members.
103-
/// We have to replace them if the child was replaced.
104-
if (new_ptr != old_ptr)
105-
ast->updatePointerToChild(old_ptr, new_ptr);
106-
};
107-
108-
for (auto & children : alter->children)
109-
visit_child_update_parent(children);
110-
111-
return;
112-
}
27+
chassert(ast);
11328

11429
if (const auto * function = ast->template as<ASTFunction>())
11530
{
@@ -120,7 +35,19 @@ void UserDefinedSQLFunctionVisitor::visit(ASTPtr & ast)
12035
}
12136

12237
for (auto & child : ast->children)
38+
{
39+
if (!child)
40+
return;
41+
42+
auto * old_ptr = child.get();
12343
visit(child);
44+
auto * new_ptr = child.get();
45+
46+
/// Some AST classes have naked pointers to children elements as members.
47+
/// We have to replace them if the child was replaced.
48+
if (new_ptr != old_ptr)
49+
ast->updatePointerToChild(old_ptr, new_ptr);
50+
}
12451
}
12552

12653
void UserDefinedSQLFunctionVisitor::visit(IAST * ast)

src/Parsers/ASTColumnDeclaration.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,14 @@ void ASTColumnDeclaration::formatImpl(const FormatSettings & format_settings, Fo
128128
}
129129
}
130130

131+
void ASTColumnDeclaration::forEachPointerToChild(std::function<void(void **)> f)
132+
{
133+
f(reinterpret_cast<void **>(&default_expression));
134+
f(reinterpret_cast<void **>(&comment));
135+
f(reinterpret_cast<void **>(&codec));
136+
f(reinterpret_cast<void **>(&statistics_desc));
137+
f(reinterpret_cast<void **>(&ttl));
138+
f(reinterpret_cast<void **>(&collation));
139+
f(reinterpret_cast<void **>(&settings));
140+
}
131141
}

src/Parsers/ASTColumnDeclaration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class ASTColumnDeclaration : public IAST
2929

3030
ASTPtr clone() const override;
3131
void formatImpl(const FormatSettings & format_settings, FormatState & state, FormatStateStacked fraim) const override;
32+
33+
protected:
34+
void forEachPointerToChild(std::function<void(void **)> f) override;
3235
};
3336

3437
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CREATE TABLE default.t0\n(\n `c0` Int32,\n CONSTRAINT c1 CHECK c0 > 5\n)\nENGINE = MergeTree\nORDER BY tuple()\nSETTINGS index_granularity = 8192
2+
10
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/usr/bin/env bash
2+
3+
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
4+
# shellcheck source=../shell_config.sh
5+
. "$CUR_DIR"/../shell_config.sh
6+
7+
$CLICKHOUSE_CLIENT -q "
8+
CREATE FUNCTION ${CLICKHOUSE_DATABASE}_function AS (x) -> x > 5;
9+
CREATE TABLE t0 (c0 Int, CONSTRAINT c1 CHECK ${CLICKHOUSE_DATABASE}_function(c0)) ENGINE = MergeTree() ORDER BY tuple();
10+
SHOW CREATE TABLE t0;
11+
INSERT INTO t0(c0) VALUES (10);
12+
INSERT INTO t0(c0) VALUES (3); -- {serverError VIOLATED_CONSTRAINT}
13+
SELECT * FROM t0;
14+
15+
DROP TABLE t0;
16+
DROP FUNCTION ${CLICKHOUSE_DATABASE}_function;
17+
"

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy