Actually after examining a bit more, I found out the upgrade code and new setup code differ in results, mainly on constraints and indexes. The upgrade code and new setup code also have duplicates. There are also some hidden bugs like :
SpecialSql4(Access) = "CREATE TABLE " & strTablePrefix & "ALLOWED_MEMBERS ("
SpecialSql4(Access) = SpecialSql4(Access) & "MEMBER_ID INT NOT NULL, FORUM_ID INT NOT NULL, "
SpecialSql4(Access) = SpecialSql4(Access) & "CONSTRAINT " & strTablePrefix & "SnitzC373 PRIMARY KEY (MEMBER_ID, FORUM_ID) ) "
This is for "V3.1 Service Release 3 Beta 2" and nobody hits it of course
...
IMHO, it would be ideal to have procedures to create a table with constraints and (non-foreign) indexes. A procedure for creating a table could be called from new setup and upgrade code. I see a nice logic for upgrade which uses arrays passed as parameters for new column/table creation, alterations etc, but as they don't use the same methodology, the code gets bigger and hard to cope with. I'm sure it is a nightmare for the developers to release a new version (this is not to criticise, just to say "I feel your pain").