From de1b48a013b6f4bdf68f7edf333db63a0994ef20 Mon Sep 17 00:00:00 2001 From: John Lee Date: Wed, 25 Oct 2017 22:17:47 +0100 Subject: Fix bug where .total used in value exprs breaks totals * Re-initialize (to VOID) totals for the account and its ancestors on adding postings. Otherwise the cache intended for use by recursive calls of C++ function total() in computing family (i.e. account hierarchy) totals is incorrectly retained from one top-level call to the next, causing inconsistent and broken behaviour. * Re-initialize (to false) calculated and gathered. Otherwise we won't e.g. recalculate stale totals for ancestor accounts (e.g. won't recalculate Assets:Savings total if Assets:Savings changes via a posting). Although the value expression total function is used by ledger itself in computing totals, this bug would only appear on use of .total in user-supplied value expressions computed *during parsing* of ledger files, rather than after parsing (I believe ledger only ever calls it for internal purposes after parsing is complete). It is possible this bug also affected other functions than total (perhaps even in circumstances other than analagous to that described in the preceding paragraph). I have not checked that. --- test/regress/total-1.test | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 test/regress/total-1.test (limited to 'test/regress/total-1.test') diff --git a/test/regress/total-1.test b/test/regress/total-1.test new file mode 100644 index 00000000..51448dd2 --- /dev/null +++ b/test/regress/total-1.test @@ -0,0 +1,28 @@ +; Test that calling total does not affect future calls to that function via a +; stale cache entry for the totalled account, because of a change to that same +; account + +2017-10-01 * Opening Balance + Assets:Current Account $1000.00 + Equity:Opening Balances + +2017-10-02 * Savings + Assets:Savings $100.00 + Assets:Current Account + +assert account("Assets:Current Account").total == $900.00 + +2017-10-03 * Savings + Assets:Savings $100.00 + Assets:Current Account + +assert account("Assets:Current Account").total == $800.00 + +test bal + $1000.00 Assets + $800.00 Current Account + $200.00 Savings + $-1000.00 Equity:Opening Balances +-------------------- + 0 +end test -- cgit v1.2.3