project-m36 icon indicating copy to clipboard operation
project-m36 copied to clipboard

prevent With clause name shadowing

Open agentm opened this issue 3 years ago • 3 comments

Name shadowing can be quite a footgun. Example:

TutorialD (master/main): x:=with (x as true) x
("with type",Relation (attributesFromList []) (RelationTupleSet {asList = []}))
("with type",Relation (attributesFromList []) (RelationTupleSet {asList = []}))
TutorialD (master/main): :showexpr x
ERR: RelVarAlreadyDefinedError "x"

The original expression should almost certainly be rejected, but the relational expression validation is sound, so we would need to check that the new relvarname "x" is not mentioned in the with clause names.

I am toying with the idea of preventing name shadowing of relvars or other with clause macro names (even macros shadowing macros). It does seem that name shadowing can be sometimes useful when moving subexpressions around, but the risk and cost of mistakes here is very high.

Any objection?

agentm avatar Nov 21 '22 18:11 agentm

TutorialD (master/main): x:=with (x as true) x
TutorialD (master/main): :showexpr x
┌┐
││
├┤
└┘

It seems fine on my machine. I would like to give opinions but I found myself not understand the issue here at all. What's the risk?

YuMingLiao avatar Nov 22 '22 03:11 YuMingLiao

Indeed, it's just on a future branch, but what's the point of supporting that expression? It makes substitution much more difficult and optimizations have to track shadowed names recursively.

agentm avatar Nov 22 '22 04:11 agentm

I see. I can't think of a useful example either.

YuMingLiao avatar Nov 22 '22 04:11 YuMingLiao