Project

General

Profile

Bug #6586

parser/conversion bug when a database alias is used

Added by Constantin Asofiei almost 2 years ago. Updated almost 2 years ago.

Status:
Test
Priority:
Normal
Target version:
-
Start date:
Due date:
% Done:

100%

billable:
No
vendor_id:
GCD
case_num:
version_reported:
version_resolved:

History

#2 Updated by Constantin Asofiei almost 2 years ago

There is a bug when parsing/converting a program which uses a database alias:

  • first program:
    create alias dictdb for database p2j_test.
    run dictdb.p.
    
  • second program:
    def var i as int.
    for each dictdb._file:
      i = i + 1.
    end.
    message i.
    
  • directory.hints:
    <hints>
       <alias name="dictdb" database="p2j_test"/>
    </hints>
    

The dictdb.p program converts like this:

@DatabaseReferences(aliases = 
{
   "p2j_test" 
}, tables = 
{
   "p2j_test._file" 
})
public class Dictdb
{
   MetaFile.Buf metaFile = RecordBuffer.define(MetaFile.Buf.class, "p2j_test", "metaFile", "_file");

Note how p2j_test is used instead of dictdb. This is incorrect.

The problem seems to be in SchemaDictionary.findTableInfo. I've added this code:

         NameNode dbNode  = node.getParent();

         // don't just use getAst() here, we need the AST for the backing table if this is a buffer
         // (this will work for both the simple case and the buffer case)
         Aast   ast   = getTable(node); 
         String sig   = ast != null ? (String) ast.getAnnotation("db_signature") : null;
         String sname = getQualifiedName(node);
         String bname = getRecordName(node, EntityName.TABLE, name);
         String dname = (dbNode != null) ? dbNode.getName() : "";

         String ldname = getLogicalDatabaseForTable(name, forceTemp, forcePersistent);   <--- new code starts here
         if (!ldname.equals(dname))
         {
            if (sname.startsWith(dname + "."))
            {
               sname = ldname + sname.substring(dname.length());
            }
            if (bname.startsWith(dname + "."))
            {
               bname = ldname + bname.substring(dname.length());
            }
            dname = ldname;
         }

but this abends the conversion.

This is because the 'sname' (which ends up in the schemaname annotation) is prefixed with dictdb instead of p2j_test. I'll leave that to use p2j_test, but now the DatabaseReferences.tables annotations will use p2j_test instead of dictdb.

I'm working on fixing the DatabaseReferences.tables annotation.

#3 Updated by Constantin Asofiei almost 2 years ago

  • Status changed from New to Review
  • Assignee set to Constantin Asofiei
  • % Done changed from 0 to 100

The fix is in 6129a/13954.

#4 Updated by Eric Faulhaber almost 2 years ago

  • Status changed from Review to Test

Constantin Asofiei wrote:

The fix is in 6129a/13954.

I'm assuming the premise is correct. The code changes look correct to implement the fix.

#5 Updated by Constantin Asofiei almost 2 years ago

getLogicalDatabaseForTable was previously being used (before findTableInfo was introduced), so yes, it makes sense. The RCODE-INFO:TABLE-LIST was an existing bug.

Also available in: Atom PDF