Query Tool. Specifically, a bug that works like this:
Working, debugged code:
A->B => Z
A=code (or other) that produces 2 datasets X,Y B=Query Tool operation that joins X & Y by specified match variables Z=final output
Without touching B, modify A to A', a buggy version that breaks X (specifically, in such a manner that it's missing the required match variable. Rerun:
A'->B => error message, B fails because it's missing a variable.
Realise error. Revert A' back to A and rerun:
A->B => Z' (no error messages, and in some cases no warnings)
But even though we've just undone the only thing we changed, Z' is not equal to Z. What happens is that when we attempt to run B on the broken input, it notices that one of the match variables is missing and helpfully deletes the requirement to join with that match variable. If this leaves you with no match variables specified, you'll get a warning about a Cartesian join, but if you had other matches based on variables still in the bad dataset, you won't even get that.
I discovered this the hard way, in a large and complex program where B was quite a few steps downstream from A. Found the original bug and fixed it in a few minutes, then spent hours trying to figure out why it wasn't working any more, because it's not exactly intuitive to look at the bit of the program that I hadn't modified (except indirectly and unknowingly).
no subject
Working, debugged code:
A->B => Z
A=code (or other) that produces 2 datasets X,Y
B=Query Tool operation that joins X & Y by specified match variables
Z=final output
Without touching B, modify A to A', a buggy version that breaks X (specifically, in such a manner that it's missing the required match variable. Rerun:
A'->B => error message, B fails because it's missing a variable.
Realise error. Revert A' back to A and rerun:
A->B => Z' (no error messages, and in some cases no warnings)
But even though we've just undone the only thing we changed, Z' is not equal to Z. What happens is that when we attempt to run B on the broken input, it notices that one of the match variables is missing and helpfully deletes the requirement to join with that match variable. If this leaves you with no match variables specified, you'll get a warning about a Cartesian join, but if you had other matches based on variables still in the bad dataset, you won't even get that.
I discovered this the hard way, in a large and complex program where B was quite a few steps downstream from A. Found the original bug and fixed it in a few minutes, then spent hours trying to figure out why it wasn't working any more, because it's not exactly intuitive to look at the bit of the program that I hadn't modified (except indirectly and unknowingly).