diff --git a/lexer/lexer.go b/lexer/lexer.go index e9fc21a9b9..d7e918495b 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -92,6 +92,9 @@ func (l *Lexer) NextToken() Item { if l.ch == '-' && l.peekChar() == '-' { return l.readLineComment() } + if l.ch == '#' { + return l.readHashComment() + } if l.ch == '/' && l.peekChar() == '*' { return l.readBlockComment() } @@ -280,6 +283,20 @@ func (l *Lexer) readLineComment() Item { return Item{Token: token.COMMENT, Value: sb.String(), Pos: pos} } +func (l *Lexer) readHashComment() Item { + pos := l.pos + var sb strings.Builder + // Skip # + sb.WriteRune(l.ch) + l.readChar() + + for l.ch != '\n' && l.ch != 0 && !l.eof { + sb.WriteRune(l.ch) + l.readChar() + } + return Item{Token: token.COMMENT, Value: sb.String(), Pos: pos} +} + func (l *Lexer) readBlockComment() Item { pos := l.pos var sb strings.Builder diff --git a/parser/parser.go b/parser/parser.go index b5a201bfda..031165f261 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -3098,6 +3098,13 @@ func (p *Parser) parseIdentifierName() string { return name } + // Handle parameterized identifiers like {CLICKHOUSE_DATABASE:Identifier} + if p.currentIs(token.PARAM) { + name = "{" + p.current.Value + "}" + p.nextToken() + return name + } + // Handle name starting with number (e.g., 03657_test) if p.currentIs(token.NUMBER) { name = p.current.Value diff --git a/parser/parser_test.go b/parser/parser_test.go index 08de7a8352..85f6be7376 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -66,7 +66,7 @@ func TestParser(t *testing.T) { var queryParts []string for _, line := range strings.Split(string(queryBytes), "\n") { trimmed := strings.TrimSpace(line) - if trimmed == "" || strings.HasPrefix(trimmed, "--") { + if trimmed == "" || strings.HasPrefix(trimmed, "--") || strings.HasPrefix(trimmed, "#") { continue } // Remove trailing comment if present (but not inside strings - simple heuristic) diff --git a/parser/testdata/00080_show_tables_and_system_tables/metadata.json b/parser/testdata/00080_show_tables_and_system_tables/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/00080_show_tables_and_system_tables/metadata.json +++ b/parser/testdata/00080_show_tables_and_system_tables/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/00158_buffer_and_nonexistent_table/metadata.json b/parser/testdata/00158_buffer_and_nonexistent_table/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/00158_buffer_and_nonexistent_table/metadata.json +++ b/parser/testdata/00158_buffer_and_nonexistent_table/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/00571_non_exist_database_when_create_materializ_view/metadata.json b/parser/testdata/00571_non_exist_database_when_create_materializ_view/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/00571_non_exist_database_when_create_materializ_view/metadata.json +++ b/parser/testdata/00571_non_exist_database_when_create_materializ_view/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/00740_database_in_nested_view/metadata.json b/parser/testdata/00740_database_in_nested_view/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/00740_database_in_nested_view/metadata.json +++ b/parser/testdata/00740_database_in_nested_view/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01012_show_tables_limit/metadata.json b/parser/testdata/01012_show_tables_limit/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01012_show_tables_limit/metadata.json +++ b/parser/testdata/01012_show_tables_limit/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01041_create_dictionary_if_not_exists/metadata.json b/parser/testdata/01041_create_dictionary_if_not_exists/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01041_create_dictionary_if_not_exists/metadata.json +++ b/parser/testdata/01041_create_dictionary_if_not_exists/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01043_dictionary_attribute_properties_values/metadata.json b/parser/testdata/01043_dictionary_attribute_properties_values/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01043_dictionary_attribute_properties_values/metadata.json +++ b/parser/testdata/01043_dictionary_attribute_properties_values/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01050_clickhouse_dict_source_with_subquery/metadata.json b/parser/testdata/01050_clickhouse_dict_source_with_subquery/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01050_clickhouse_dict_source_with_subquery/metadata.json +++ b/parser/testdata/01050_clickhouse_dict_source_with_subquery/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01080_check_for_error_incorrect_size_of_nested_column/metadata.json b/parser/testdata/01080_check_for_error_incorrect_size_of_nested_column/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01080_check_for_error_incorrect_size_of_nested_column/metadata.json +++ b/parser/testdata/01080_check_for_error_incorrect_size_of_nested_column/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01084_regexp_empty/metadata.json b/parser/testdata/01084_regexp_empty/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/01084_regexp_empty/metadata.json +++ b/parser/testdata/01084_regexp_empty/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/01881_negate_formatting/metadata.json b/parser/testdata/01881_negate_formatting/metadata.json index ef120d978e..0967ef424b 100644 --- a/parser/testdata/01881_negate_formatting/metadata.json +++ b/parser/testdata/01881_negate_formatting/metadata.json @@ -1 +1 @@ -{"todo": true} +{} diff --git a/parser/testdata/02072_rdb_recovery_escaped_name/metadata.json b/parser/testdata/02072_rdb_recovery_escaped_name/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02072_rdb_recovery_escaped_name/metadata.json +++ b/parser/testdata/02072_rdb_recovery_escaped_name/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02192_comment/metadata.json b/parser/testdata/02192_comment/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02192_comment/metadata.json +++ b/parser/testdata/02192_comment/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02233_interpolate_1/metadata.json b/parser/testdata/02233_interpolate_1/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02233_interpolate_1/metadata.json +++ b/parser/testdata/02233_interpolate_1/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02294_system_certificates/metadata.json b/parser/testdata/02294_system_certificates/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02294_system_certificates/metadata.json +++ b/parser/testdata/02294_system_certificates/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02462_distributions/metadata.json b/parser/testdata/02462_distributions/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02462_distributions/metadata.json +++ b/parser/testdata/02462_distributions/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02483_add_engine_full_column_to_system_databases/metadata.json b/parser/testdata/02483_add_engine_full_column_to_system_databases/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02483_add_engine_full_column_to_system_databases/metadata.json +++ b/parser/testdata/02483_add_engine_full_column_to_system_databases/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02791_predicate_pushdown_different_types/metadata.json b/parser/testdata/02791_predicate_pushdown_different_types/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02791_predicate_pushdown_different_types/metadata.json +++ b/parser/testdata/02791_predicate_pushdown_different_types/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02808_aliases_inside_case/metadata.json b/parser/testdata/02808_aliases_inside_case/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02808_aliases_inside_case/metadata.json +++ b/parser/testdata/02808_aliases_inside_case/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02887_insert_quorum_wo_keeper_retries/metadata.json b/parser/testdata/02887_insert_quorum_wo_keeper_retries/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02887_insert_quorum_wo_keeper_retries/metadata.json +++ b/parser/testdata/02887_insert_quorum_wo_keeper_retries/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02888_system_tables_with_inaccessible_table_function/metadata.json b/parser/testdata/02888_system_tables_with_inaccessible_table_function/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02888_system_tables_with_inaccessible_table_function/metadata.json +++ b/parser/testdata/02888_system_tables_with_inaccessible_table_function/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/02891_rename_table_without_keyword/metadata.json b/parser/testdata/02891_rename_table_without_keyword/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/02891_rename_table_without_keyword/metadata.json +++ b/parser/testdata/02891_rename_table_without_keyword/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03222_ignore_nulls_query_tree_elimination/metadata.json b/parser/testdata/03222_ignore_nulls_query_tree_elimination/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03222_ignore_nulls_query_tree_elimination/metadata.json +++ b/parser/testdata/03222_ignore_nulls_query_tree_elimination/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03267_materialized_view_keeps_security_context/metadata.json b/parser/testdata/03267_materialized_view_keeps_security_context/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03267_materialized_view_keeps_security_context/metadata.json +++ b/parser/testdata/03267_materialized_view_keeps_security_context/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03310_create_database_with_settings/metadata.json b/parser/testdata/03310_create_database_with_settings/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03310_create_database_with_settings/metadata.json +++ b/parser/testdata/03310_create_database_with_settings/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03321_create_table_as_replicated_engine_args/metadata.json b/parser/testdata/03321_create_table_as_replicated_engine_args/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03321_create_table_as_replicated_engine_args/metadata.json +++ b/parser/testdata/03321_create_table_as_replicated_engine_args/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03362_create_table_after_truncate_replicated_database/metadata.json b/parser/testdata/03362_create_table_after_truncate_replicated_database/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03362_create_table_after_truncate_replicated_database/metadata.json +++ b/parser/testdata/03362_create_table_after_truncate_replicated_database/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03442_detach_view/metadata.json b/parser/testdata/03442_detach_view/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03442_detach_view/metadata.json +++ b/parser/testdata/03442_detach_view/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03512_join_using_parent_scope_matcher/metadata.json b/parser/testdata/03512_join_using_parent_scope_matcher/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03512_join_using_parent_scope_matcher/metadata.json +++ b/parser/testdata/03512_join_using_parent_scope_matcher/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03524_sign_argument/metadata.json b/parser/testdata/03524_sign_argument/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03524_sign_argument/metadata.json +++ b/parser/testdata/03524_sign_argument/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/parser/testdata/03546_leftover_dependencies/metadata.json b/parser/testdata/03546_leftover_dependencies/metadata.json index f3254bcc37..411deef791 100644 --- a/parser/testdata/03546_leftover_dependencies/metadata.json +++ b/parser/testdata/03546_leftover_dependencies/metadata.json @@ -1 +1 @@ -{"explain":false,"todo": true} +{"explain":false} diff --git a/scripts/clickhouse.sh b/scripts/clickhouse.sh index 7e7a28d173..5f88f2ca19 100755 --- a/scripts/clickhouse.sh +++ b/scripts/clickhouse.sh @@ -8,15 +8,30 @@ CLICKHOUSE_DIR="$PROJECT_DIR/.clickhouse" CONFIG_FILE="$CLICKHOUSE_DIR/config.xml" PID_FILE="$CLICKHOUSE_DIR/clickhouse.pid" +# ClickHouse version - use a specific stable version for reproducible test output +# Update this when regenerating test expectations +CLICKHOUSE_VERSION="${CLICKHOUSE_VERSION:-24.8.4.13}" + # Download ClickHouse if not present download() { if [ -f "$CLICKHOUSE_BIN" ]; then echo "ClickHouse binary already exists" + "$CLICKHOUSE_BIN" --version return 0 fi - echo "Downloading ClickHouse..." - curl -k -L -o "$CLICKHOUSE_BIN" https://builds.clickhouse.com/master/amd64/clickhouse + echo "Downloading ClickHouse v$CLICKHOUSE_VERSION..." + + # Use stable release URL format + DOWNLOAD_URL="https://github.com/ClickHouse/ClickHouse/releases/download/v${CLICKHOUSE_VERSION}-stable/clickhouse-linux-amd64" + + if ! curl -k -L -f -o "$CLICKHOUSE_BIN" "$DOWNLOAD_URL"; then + echo "Failed to download from releases, trying builds.clickhouse.com..." + # Fallback to builds server with version tag + DOWNLOAD_URL="https://builds.clickhouse.com/master/amd64/clickhouse" + curl -k -L -o "$CLICKHOUSE_BIN" "$DOWNLOAD_URL" + fi + chmod +x "$CLICKHOUSE_BIN" echo "Downloaded ClickHouse" "$CLICKHOUSE_BIN" --version @@ -150,10 +165,34 @@ client() { "$CLICKHOUSE_BIN" client "$@" } +# Force download (remove existing binary first) +force_download() { + if [ -f "$CLICKHOUSE_BIN" ]; then + echo "Removing existing ClickHouse binary..." + rm -f "$CLICKHOUSE_BIN" + fi + download +} + +# Show version info +version() { + echo "Configured version: $CLICKHOUSE_VERSION" + echo "Override with: CLICKHOUSE_VERSION=X.Y.Z.W $0 download" + if [ -f "$CLICKHOUSE_BIN" ]; then + echo "Installed:" + "$CLICKHOUSE_BIN" --version + else + echo "Binary not installed yet" + fi +} + case "$1" in download) download ;; + force-download) + force_download + ;; init) init ;; @@ -170,12 +209,22 @@ case "$1" in status) status ;; + version) + version + ;; client) shift client "$@" ;; *) - echo "Usage: $0 {download|init|start|stop|restart|status|client}" + echo "Usage: $0 {download|force-download|init|start|stop|restart|status|version|client}" + echo "" + echo "Environment variables:" + echo " CLICKHOUSE_VERSION - Override the ClickHouse version (default: $CLICKHOUSE_VERSION)" + echo "" + echo "Examples:" + echo " $0 download # Download default version" + echo " CLICKHOUSE_VERSION=24.3.1.5 $0 force-download # Download specific version" exit 1 ;; esac