Commit 2ac2ff1
Add kql() function transformation to view() in EXPLAIN AST output (#115)
* Add kql() function transformation to view() in EXPLAIN AST output
Implements KQL (Kusto Query Language) parsing for the kql() table function.
The kql() function is transformed to view() with the KQL content parsed
into equivalent SQL. Supports:
- Table names as first pipe segment
- project operator for column selection
- filter operator for WHERE conditions with comparison operators
Fixes 02366_kql_create_table test (3 statements: stmt5, stmt7, stmt11).
* Support dotted identifiers in ALTER TABLE RENAME COLUMN
Add parseDottedIdentifier helper to handle nested column names like n.x
in RENAME COLUMN statements. Previously only single-part identifiers were
captured, causing statements like "RENAME COLUMN n.x TO n.renamed_x" to
lose the dot-separated suffix.
Fixes tests:
- 01213_alter_table_rename_nested (3 statements)
- 01213_alter_rename_nested (2 statements)
- 01278_alter_rename_combination (2 statements)
- 03526_columns_substreams_in_wide_parts (2 statements)
* Add support for multi-word data types in parser
Handle SQL standard multi-word type names:
- DOUBLE PRECISION
- INT/INTEGER/TINYINT/SMALLINT/BIGINT/INT1 with SIGNED/UNSIGNED
- CHAR/CHARACTER/NCHAR with VARYING or LARGE OBJECT
- BINARY with VARYING or LARGE OBJECT
- NATIONAL CHAR/CHARACTER with optional VARYING or LARGE OBJECT
Fixes 01144_multiword_data_types test (3 statements).
* Escape single quotes in alias names in EXPLAIN output
When an alias contains single quotes (e.g., "'String'" as an alias),
they need to be escaped as \' in the EXPLAIN AST output to match
ClickHouse behavior.
Fixes tests:
- 01101_literal_column_clash (3 statements)
- 01950_aliases_bad_cast (1 statement)
* Fix handling of INT64_MIN and very large negative integers in CAST
Two fixes:
1. In formatExprAsString, avoid overflow when formatting INT64_MIN by checking
if the value is already negative before trying to negate it
2. In parseUnaryMinus, properly handle negative numbers larger than int64 can
hold (like -9223372036854775809 for Int128) by storing them as strings
when strconv.ParseInt fails
Fixes 02887_byteswap test (3 statements: stmt27, stmt29, stmt31).
* Add tuple expansion and regex pattern EXCEPT support
- Handle expression.* syntax for tuple expansion in parseDotAccess()
- Add Pattern field to ColumnTransformer for regex-based EXCEPT
- Parse string patterns in EXCEPT clauses (e.g., EXCEPT('hello|world'))
- Output pattern-based EXCEPT as ColumnsExceptTransformer with String node
Fixes test 03101_analyzer_identifiers_4 (stmt7, stmt9, stmt14)
Also fixes 01470_columns_transformers2 (stmt4)
* Add INDEX and SETTINGS support for ATTACH TABLE statements
- Add Indexes field to AttachQuery struct in ast.go
- Add Settings field to AttachQuery struct in ast.go
- Parse INDEX definitions in ATTACH TABLE column lists
- Parse SETTINGS clause in ATTACH TABLE statements
- Update explainAttachQuery to output indexes and settings correctly
- Handle engine parentheses with empty argument list
Fixes test 01249_bad_arguments_for_bloom_filter (stmt10, stmt13, stmt16)
Also fixes 01601_detach_permanently and 02990_rmt_replica_path_uuid
* Handle COMMENT in MODIFY COLUMN without data type
When parsing MODIFY COLUMN col_name COMMENT 'comment', the COMMENT
keyword should not be parsed as a data type. Add COMMENT to the list
of tokens that indicate the type is omitted in parseColumnDeclaration.
Fixes test 00725_comment_columns_long (stmt9, stmt19, stmt21)
* Fix ANY/ALL keyword conflict with any()/all() function calls in expressions
The ANY/ALL subquery modifier check in parseBinaryExpression was
incorrectly triggering for all binary operators. When parsing expressions
like `any(x) >= 1 AND any(y) >= 2`, the parser would see the `any` keyword
after the AND operator and attempt to parse it as `expr >= ANY(subquery)`
pattern, causing incorrect AST structure.
This fix restricts the ANY/ALL check to only comparison operators
(=, ==, !=, <>, <, <=, >, >=) where this pattern is valid, preventing
conflicts with any()/all() function calls in AND/OR expressions.
Also flatten both sides of AND/OR chains in collectLogicalOperands
for correct EXPLAIN output matching ClickHouse format.
* Remove incorrect ln->log function name normalization
ClickHouse's EXPLAIN AST outputs 'ln' for the natural logarithm function,
not 'log'. The previous incorrect mapping was causing test failures.
* Handle boolean literals correctly in CAST expressions
Boolean literals in :: cast syntax should output as Bool_1/Bool_0
format instead of string 'true'/'false' to match ClickHouse EXPLAIN.
* Parse column definitions after TO target in MATERIALIZED VIEW
For MATERIALIZED VIEW ... TO target (columns) AS SELECT syntax,
column definitions can appear after the TO clause. Added parsing
support for this variant.
* Fix IN expression to include :: cast on right side without parentheses
When parsing `expr IN value::Type` (without parentheses around the IN list),
the :: cast was being applied to the entire IN expression instead of just
the value. Changed precedence from CALL to MUL_PREC to ensure :: is consumed
as part of the right-hand expression.
* Add IF NOT EXISTS support for ATTACH TABLE statement
The parser was treating IF as the table name instead of handling
IF NOT EXISTS as a modifier. Added IfNotExists field to AttachQuery
and parsing logic to handle the IF NOT EXISTS clause.
* Add implicit NULL for caseWithExpression without ELSE clause
When a CASE x WHEN form has no ELSE clause, ClickHouse implicitly uses
NULL as the else value. The explain output was missing this implicit NULL
for caseWithExpression (it was already correct for multiIf form).
* Add BACKUP and RESTORE statement support
Implement parsing and explain output for BACKUP and RESTORE statements:
- Add BACKUP and RESTORE tokens
- Add BackupQuery and RestoreQuery AST types
- Add parseBackup() and parseRestore() parser functions
- Add explain handlers for both query types
Fixes tests: 03286_backup_to_null and 03593_backup_with_broken_projection
* Distinguish EXCEPT set operation from column exclusion
When parsing expressions, check if EXCEPT is followed by SELECT to
determine if it's a set operation (SELECT (*) EXCEPT SELECT 1) vs
column exclusion (SELECT * EXCEPT (col1, col2)).
Fixes test: 03457_inconsistent_formatting_except
* Include function arguments in BACKUP/RESTORE explain output
Update explainBackupQuery and explainRestoreQuery to output function
arguments (e.g., Memory('b1') shows the ExpressionList with 'b1').
Fixes tests: 03286_backup_to_memory, 03276_database_backup_merge_tree_table_file_engine,
03278_database_backup_merge_tree_table_disk_engine, 03279_database_backup_database_disk_engine
* Allow keywords as CTE names in WITH clause
Support using keywords like 'table' as CTE names (e.g., WITH table AS
(SELECT 1 AS key)). Exclude NULL/TRUE/FALSE since they have special
literal meanings.
Fixes test: 03518_left_to_cross_incorrect
* Support WITH TIES modifier after TOP clause
Handle `SELECT TOP n WITH TIES *` syntax by consuming the WITH TIES
tokens after parsing the TOP expression.
Fixes test: 03725_empty_tuple_some_limit_with_ties_distinct
* Support SHOW TABLE and SHOW DATABASE as aliases
Treat `SHOW TABLE tablename` as equivalent to `SHOW CREATE TABLE tablename`
and `SHOW DATABASE dbname` as equivalent to `SHOW CREATE DATABASE dbname`.
Fixes tests: 02710_show_table, 03663_parameterized_views_formatting_of_substitutions_excessive_backticks
* Strip session/global prefix from MySQL system variables
For @@session.varname or @@global.varname syntax, strip the session/global
scope qualifier since ClickHouse treats them as just @@varname in EXPLAIN.
Fixes test: 01337_mysql_global_variables
* Add \e escape sequence support for PHP/MySQL style strings
Handle the \e escape sequence (escape character, ASCII 27) in string
literals for MySQL/PHP compatibility.
Fixes test: 01284_escape_sequences_php_mysql_style
* Fix OFFSET ROW parsing to accept both singular and plural forms
The SQL standard OFFSET...FETCH syntax uses singular "ROW" (e.g.,
"OFFSET 1 ROW") but the parser only checked for "ROWS" (plural).
This caused ROW to be incorrectly parsed as a subquery alias.
Fixed by checking for both "ROW" and "ROWS" when consuming the
optional keyword after the OFFSET expression.
* Support empty USING () clause in JOINs
When parsing USING (), distinguish between "no USING clause" (nil) and
"empty USING clause" (empty non-nil slice). This ensures the explain
output correctly shows the ExpressionList node even when empty.
* Fix SYSTEM command parsing for TTL MERGES table names
When parsing SYSTEM STOP/START TTL MERGES commands, the table name
was being consumed as part of the command because isSystemCommandKeyword()
uses case-insensitive matching. A table named 'ttl' would match 'TTL'.
Added check to break command parsing after certain complete command
suffixes (MERGES, MOVES, FETCHES, SENDS, MUTATIONS) so the next token
is correctly parsed as the table name.
* Allow EXISTS keyword as column identifier when not followed by (
In queries like 'WHERE exists' where 'exists' is a column name,
the parser was treating EXISTS as the start of an EXISTS(subquery)
expression and failing when no ( was found.
Now if EXISTS is not followed by (, it's treated as an identifier
(column name) instead of the subquery existence operator.
* Fix table alias parsing order - alias before FINAL
In ClickHouse syntax, table aliases come BEFORE the FINAL keyword:
FROM table_name t FINAL WHERE ...
The parser was checking for FINAL before alias, which meant FINAL
wasn't being consumed when an alias was present. This caused the
subsequent UNION or WHERE clause to be missed.
Reordered to parse alias first, then FINAL, then SAMPLE.
* Fix ADD CONSTRAINT explain output to show expression
For ALTER TABLE ADD CONSTRAINT, the explain output was showing just
the constraint name as an Identifier. Changed to show the constraint's
expression properly:
Constraint (children 1)
Subquery/Function/etc (the expression)
This fixes subquery constraints like CHECK (SELECT 1).
* Fix tuple literal expansion in IN expressions and explain output
- In IN expressions, only expand tuple literals when all elements are
parenthesized primitives (e.g., `1 IN (((1), (2)))` expands to
Function tuple with 2 elements)
- Tuples with non-parenthesized elements or nested tuples stay as
Literal Tuple_ (e.g., `(1, '') IN ((1, ''))` renders as
Literal Tuple_(...))
- Update explainLiteral to check for parenthesized elements when
deciding between Function tuple and Literal Tuple_ format
This fixes test 02370_analyzer_in_function and also enables
stmt8 in 03552_inconsistent_formatting_operator_as_table_function.
* Propagate WITH clause to subsequent SELECTs in UNION queries
In ClickHouse's EXPLAIN AST output, the WITH clause from the first
SELECT in a UNION ALL/UNION query is propagated to subsequent SELECTs.
The inherited WITH clause is output at the END of children for those
subsequent SELECT queries.
This fix applies the same WITH clause propagation logic that was
already implemented for INTERSECT/EXCEPT queries to plain UNION queries.
Fixes tests:
- 01515_with_global_and_with_propagation (stmt5, stmt11)
- 03671_pk_in_subquery_context_expired (stmt7)
- 03611_uniqExact_bug (stmt2)
- 03033_analyzer_resolve_from_parent_scope (stmt4)
- 01236_graphite_mt (stmt4)
* Fix database-qualified dictionary names in DETACH/ATTACH statements
The parser was not handling database-qualified dictionary names like
`db.dict` in DETACH DICTIONARY and ATTACH DICTIONARY statements.
Parser changes:
- parseDetach: Allow qualified names for DICTIONARY (database.dict)
- parseAttach: Allow qualified names for DICTIONARY (database.dict)
Explain changes:
- explainDetachQuery: Handle Database + Dictionary case
- explainAttachQuery: Handle Database + Dictionary case
Fixes tests:
- 01110_dictionary_layout_without_arguments (stmt7, stmt8)
- 01575_disable_detach_table_of_dictionary (stmt7, stmt9)
- 01018_ddl_dictionaries_create (stmt17, stmt22)
* Accept keywords as index type names in ALTER ADD INDEX
The parser was only accepting identifiers (token.IDENT) for index type
names like "set" in "ADD INDEX idx c TYPE set(0)". However, "set" is
tokenized as a keyword (token.SET). This fix allows keywords to be used
as index type names and AFTER index names, matching ClickHouse behavior.
Fixes tests:
- 01932_alter_index_with_order (stmt5, stmt6)
- 03629_storage_s3_disallow_index_alter (stmt3)
- 02131_skip_index_not_materialized (stmt4)
* Render arrays with parenthesized elements as Function array
Arrays containing parenthesized elements like [('a')] should be rendered
as Function array with children, not as Literal Array_[...]. This matches
ClickHouse's EXPLAIN AST behavior where parenthesized elements inside
arrays require the expanded function format.
Fixes tests:
- 02354_tuple_element_with_default (stmt5, stmt14)
- 03552_inconsistent_formatting_operator_as_table_function (stmt5)
* Handle LIMIT offset, count syntax after LIMIT BY clause
When parsing LIMIT after LIMIT BY (e.g., LIMIT 1 BY x LIMIT 5, 5), the
parser was only capturing the first value. This fix handles the comma
syntax to correctly parse both offset and count values.
Fixes test:
- 02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET
(stmt2, stmt3)
* Support IN PARTITION clause in DELETE statements
Added Partition field to DeleteQuery AST and parsing for the IN PARTITION
clause in lightweight DELETE statements. The syntax is:
DELETE FROM table IN PARTITION partition_expr WHERE condition
Fixes test:
- 02352_lightweight_delete_in_partition (stmt11, stmt12)
* Support qualified identifiers starting with keywords
When a keyword like SYSTEM is used as the start of a qualified name
(e.g., system.one.*), parseKeywordAsIdentifier was returning just the
keyword as a single-part identifier. Now it continues to parse DOT
sequences to build qualified identifiers and handle qualified asterisks.
Fixes tests:
- 00467_qualified_names (stmt19, stmt21)
- 00502_custom_partitioning_local (stmt17)
* Support TTL elements with WHERE conditions
Added TTLElement struct to store both the TTL expression and the optional
WHERE condition. Updated parser to correctly parse multiple TTL elements
separated by commas, including proper handling of SET clause comma
separation (SET assignments vs new TTL elements).
Fixes tests:
- 01622_multiple_ttls (stmt3, stmt11)
- 03236_create_query_ttl_where (stmt2)
- 03636_empty_projection_block (stmt1)
- 03622_ttl_infos_where (stmt3)
- 02932_set_ttl_where (stmt2)
* Support PARTITION ID syntax in OPTIMIZE TABLE statements
Add PartitionByID field to OptimizeQuery AST to distinguish PARTITION ID
'value' from PARTITION expr. The parser now detects the ID keyword after
PARTITION and sets this flag. The explain output renders Partition_ID with
the inline literal format matching ClickHouse's EXPLAIN AST output.
* Fix ALTER ADD INDEX tuple expression parsing
Simplified the index expression parsing in ALTER ADD INDEX to let
parseExpression handle parentheses naturally. This allows tuple
expressions like (a, b, c) to be parsed correctly, matching how
CREATE TABLE INDEX parsing works.
* Add support for KILL QUERY/MUTATION statements
Adds KillQuery AST type and parser for KILL QUERY/MUTATION statements.
The explain output matches ClickHouse format with the WHERE expression
operator in the header (e.g., Function_and) and SYNC/ASYNC mode.
* Enable duplicate output for RELOAD DICTIONARY in SYSTEM queries
Add RELOAD DICTIONARY to the list of SYSTEM commands that output
database/table identifiers twice in EXPLAIN AST format.
* Handle large number overflow and preserve original source text
- For hex numbers that overflow uint64 (like 0x123456789ABCDEF01), convert to Float64
- For decimal numbers that overflow, try float64 parsing
- Preserve original source text in Literal.Source for formatting in CAST expressions
- Update explain for negated uint64 values that overflow int64 to output Float64
- Use Source field in formatElementAsString to preserve exact text in array/tuple casts
* Add alias support for ArrayAccess and BetweenExpr in WITH clauses
- Add explainBetweenExprWithAlias to support aliases on BETWEEN expressions
- Add ArrayAccess and BetweenExpr cases to explainWithElement
- Enables WITH expr AS name syntax for array subscripts and BETWEEN clauses
* Handle empty PRIMARY KEY () in CREATE TABLE explain output
- Add HasEmptyColumnsPrimaryKey flag to CreateTableQuery and AttachQuery
- Set flag in parser when PRIMARY KEY () has empty parentheses
- Update explain output to show Function tuple with empty ExpressionList
* Support TTL DELETE WHERE clause in ALTER TABLE MODIFY TTL
- Update ALTER MODIFY TTL parsing to use parseTTLElement
- Capture WHERE condition in TTLElement for conditional deletion
- Update explain code to output TTLElement with WHERE as child
* Trim whitespace in query parameter name and type parsing
Parameters like {a1: Int32} with spaces after colon now
correctly parse as name=a1 type=Int32 without leading/trailing spaces
---------
Co-authored-by: Claude <[email protected]>1 parent 93d8182 commit 2ac2ff1
File tree
136 files changed
+1627
-861
lines changed- ast
- internal/explain
- lexer
- parser
- testdata
- 00031_parser_number
- 00087_math_functions
- 00467_qualified_names
- 00502_custom_partitioning_local
- 00725_comment_columns_long
- 00727_concat
- 00976_system_stop_ttl_merges
- 00984_materialized_view_to_columns
- 00988_constraints_replication_zookeeper_long
- 01018_ddl_dictionaries_create
- 01036_no_superfluous_dict_reload_on_create_database_2
- 01065_if_not_finite
- 01073_attach_if_not_exists
- 01101_literal_column_clash
- 01110_dictionary_layout_without_arguments
- 01114_materialize_clear_index_compact_parts
- 01144_multiword_data_types
- 01155_rename_move_materialized_view
- 01182_materialized_view_different_structure
- 01213_alter_rename_nested
- 01213_alter_table_rename_nested
- 01236_graphite_mt
- 01249_bad_arguments_for_bloom_filter
- 01257_dictionary_mismatch_types
- 01278_alter_rename_combination
- 01282_system_parts_ttl_info
- 01284_escape_sequences_php_mysql_style
- 01337_mysql_global_variables
- 01470_columns_transformers2
- 01515_mv_and_array_join_optimisation_bag
- 01515_with_global_and_with_propagation
- 01525_select_with_offset_fetch_clause
- 01527_dist_sharding_key_dictGet_reload
- 01575_disable_detach_table_of_dictionary
- 01601_detach_permanently
- 01622_multiple_ttls
- 01748_dictionary_table_dot
- 01788_update_nested_type_subcolumn_check
- 01880_materialized_view_to_table_type_check
- 01932_alter_index_with_order
- 01950_aliases_bad_cast
- 02003_WithMergeableStateAfterAggregationAndLimit_LIMIT_BY_LIMIT_OFFSET
- 02129_add_column_add_ttl
- 02131_skip_index_not_materialized
- 02346_additional_filters
- 02352_lightweight_delete_in_partition
- 02354_tuple_element_with_default
- 02366_kql_create_table
- 02370_analyzer_in_function
- 02380_analyzer_join_sample
- 02381_analyzer_join_final
- 02402_external_disk_metrics
- 02495_concat_with_separator
- 02542_case_no_else
- 02708_dotProduct
- 02710_allow_suspicious_indices
- 02710_show_table
- 02714_date_date32_in
- 02763_mutate_compact_part_with_skip_indices_and_projections
- 02787_transform_null
- 02790_optimize_skip_unused_shards_join
- 02887_byteswap
- 02921_parameterized_view_except_queries
- 02932_set_ttl_where
- 02935_format_with_arbitrary_types
- 02990_rmt_replica_path_uuid
- 03033_analyzer_resolve_from_parent_scope
- 03033_scalars_context_data_race
- 03037_union_view
- 03047_on_fly_mutations_non_deterministic
- 03071_fix_short_circuit_logic
- 03094_transform_return_first
- 03100_lwu_03_join
- 03100_lwu_06_apply_patches
- 03100_lwu_07_merge_patches
- 03100_lwu_09_different_structure
- 03100_lwu_18_sequence
- 03100_lwu_30_join_cache
- 03100_lwu_31_merge_memory_usage
- 03100_lwu_45_query_condition_cache
- 03100_lwu_deletes_3
- 03101_analyzer_identifiers_4
- 03156_nullable_number_tips
- 03166_mv_prewhere_duplicating_name_bug
- 03166_skip_indexes_vertical_merge_1
- 03166_skip_indexes_vertical_merge_2
- 03201_analyzer_resolve_in_parent_scope
- 03210_optimize_rewrite_aggregate_function_with_if_return_type_bug
- 03230_subcolumns_mv
- 03236_create_query_ttl_where
- 03254_last_2_samples_aggregate_function_simple
- 03254_last_2_samples_aggregate_function
- 03262_analyzer_materialized_view_in_with_cte
- 03275_matview_with_union
- 03276_database_backup_merge_tree_table_file_engine
- 03278_database_backup_merge_tree_table_disk_engine
- 03279_database_backup_database_disk_engine
- 03286_backup_to_memory
- 03286_backup_to_null
- 03306_materialized_vew_prewhere_supported_columns
- 03400_distributed_final
- 03412_materialized_view_to_distributed_different_headers
- 03457_inconsistent_formatting_except
- 03512_cast_logical_error
- 03518_left_to_cross_incorrect
- 03526_columns_substreams_in_wide_parts
- 03538_crash_in_parallel_hash_with_empty_using
- 03548_array_group_last_serialization
- 03552_inconsistent_formatting_operator_as_table_function
- 03561_two_mvs_bad_select
- 03593_backup_with_broken_projection
- 03594_constraint_subqery_logical_error
- 03595_funcs_on_zero
- 03611_uniqExact_bug
- 03622_ttl_infos_where
- 03626_case_function_with_dynamic_argument
- 03629_storage_s3_disallow_index_alter
- 03636_empty_projection_block
- 03654_case_non_constant_null
- 03663_parameterized_views_formatting_of_substitutions_excessive_backticks
- 03667_accurate_cast_datetime_overflow
- 03671_pk_in_subquery_context_expired
- 03725_empty_tuple_some_limit_with_ties_distinct
- 03749_materialized_view_not_supports_parallel_write
- token
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
136 files changed
+1627
-861
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
282 | 282 | | |
283 | 283 | | |
284 | 284 | | |
285 | | - | |
| 285 | + | |
| 286 | + | |
286 | 287 | | |
287 | 288 | | |
288 | 289 | | |
| |||
496 | 497 | | |
497 | 498 | | |
498 | 499 | | |
| 500 | + | |
499 | 501 | | |
500 | 502 | | |
501 | 503 | | |
502 | 504 | | |
503 | 505 | | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
504 | 516 | | |
505 | 517 | | |
506 | 518 | | |
| |||
707 | 719 | | |
708 | 720 | | |
709 | 721 | | |
710 | | - | |
711 | | - | |
712 | | - | |
713 | | - | |
714 | | - | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
715 | 728 | | |
716 | 729 | | |
717 | 730 | | |
| |||
743 | 756 | | |
744 | 757 | | |
745 | 758 | | |
| 759 | + | |
746 | 760 | | |
747 | 761 | | |
748 | 762 | | |
749 | 763 | | |
750 | | - | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
751 | 767 | | |
752 | 768 | | |
753 | 769 | | |
| |||
756 | 772 | | |
757 | 773 | | |
758 | 774 | | |
| 775 | + | |
759 | 776 | | |
760 | 777 | | |
761 | 778 | | |
762 | 779 | | |
763 | 780 | | |
764 | 781 | | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | + | |
| 795 | + | |
| 796 | + | |
| 797 | + | |
| 798 | + | |
| 799 | + | |
| 800 | + | |
| 801 | + | |
| 802 | + | |
| 803 | + | |
| 804 | + | |
| 805 | + | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
765 | 816 | | |
766 | 817 | | |
767 | 818 | | |
| |||
860 | 911 | | |
861 | 912 | | |
862 | 913 | | |
863 | | - | |
864 | | - | |
865 | | - | |
866 | | - | |
867 | | - | |
868 | | - | |
869 | | - | |
870 | | - | |
871 | | - | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
872 | 924 | | |
873 | 925 | | |
874 | 926 | | |
| |||
995 | 1047 | | |
996 | 1048 | | |
997 | 1049 | | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
998 | 1064 | | |
999 | 1065 | | |
1000 | 1066 | | |
| |||
1360 | 1426 | | |
1361 | 1427 | | |
1362 | 1428 | | |
| 1429 | + | |
1363 | 1430 | | |
1364 | 1431 | | |
1365 | 1432 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
238 | 238 | | |
239 | 239 | | |
240 | 240 | | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
241 | 245 | | |
242 | 246 | | |
243 | 247 | | |
| |||
254 | 258 | | |
255 | 259 | | |
256 | 260 | | |
| 261 | + | |
| 262 | + | |
257 | 263 | | |
258 | 264 | | |
259 | 265 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
14 | 17 | | |
15 | 18 | | |
16 | 19 | | |
| |||
53 | 56 | | |
54 | 57 | | |
55 | 58 | | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
65 | 62 | | |
66 | 63 | | |
67 | | - | |
| 64 | + | |
68 | 65 | | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
69 | 70 | | |
70 | 71 | | |
71 | 72 | | |
| |||
79 | 80 | | |
80 | 81 | | |
81 | 82 | | |
82 | | - | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
98 | | - | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
99 | 100 | | |
100 | 101 | | |
101 | 102 | | |
| |||
131 | 132 | | |
132 | 133 | | |
133 | 134 | | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
134 | 139 | | |
135 | 140 | | |
136 | 141 | | |
| |||
395 | 400 | | |
396 | 401 | | |
397 | 402 | | |
398 | | - | |
399 | | - | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
400 | 410 | | |
401 | 411 | | |
402 | 412 | | |
| |||
425 | 435 | | |
426 | 436 | | |
427 | 437 | | |
428 | | - | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
429 | 441 | | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
430 | 447 | | |
431 | 448 | | |
432 | 449 | | |
| |||
647 | 664 | | |
648 | 665 | | |
649 | 666 | | |
650 | | - | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
651 | 677 | | |
652 | 678 | | |
653 | 679 | | |
| |||
789 | 815 | | |
790 | 816 | | |
791 | 817 | | |
792 | | - | |
793 | | - | |
794 | | - | |
| 818 | + | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
795 | 826 | | |
796 | 827 | | |
797 | 828 | | |
| |||
1029 | 1060 | | |
1030 | 1061 | | |
1031 | 1062 | | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
1032 | 1067 | | |
1033 | 1068 | | |
1034 | 1069 | | |
| |||
0 commit comments