CHAPTER 20: VISUAL LABS 20a AND 20b

These original exercises use the same synthetic Harbour dataset as the book.
The display/check runner opens companion/sql/harbour.db read-only.
If that file is missing, first follow Chapter17 and run sql/setup_database.py.

RUN
1. Open walkthrough.py in IDLE and choose Run > Run Module (F5).
2. Alternatively, open a terminal in this ch20 folder.
   Windows: py walkthrough.py
   macOS/Linux: python3 walkthrough.py
Use the Python command that already worked in your setup.
No network access or third-party package is required.

The .sql files hold inspectable questions. The supplied Python wrapper prints
results and checks the original expected values. Before editing, predict the
new result. After editing, compare it manually; an old assertion may now fail
because your intentional change needs a different expected answer. Do not
remove a failed check until you can explain the changed result.

EXPECTED RESULTS AND PRACTICE
20a preserves 101, 102 and 108; the inner join loses 108. 20b_wrong returns 1540 euros after repeating campaign costs; 20b_correct returns the actual 700. Change/predict/check: change only the wrong query to LEFT JOIN. It returns 1620, not 700: the repeated amounts remain, plus Autumn webinar's 80. Trace the contributions 900 + 240 + 400 + 80 before running change_check.sql.
