You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2011/01/24 19:26:43 UTC

svn commit: r1062911 - in /pig/trunk: ./ src/org/apache/pig/newplan/logical/expression/ src/org/apache/pig/newplan/logical/relational/ src/org/apache/pig/newplan/logical/rules/ test/org/apache/pig/test/

Author: daijy
Date: Mon Jan 24 18:26:43 2011
New Revision: 1062911

URL: http://svn.apache.org/viewvc?rev=1062911&view=rev
Log:
PIG-767: Schema reported from DESCRIBE and actual schema of inner bags are different

Modified:
    pig/trunk/CHANGES.txt
    pig/trunk/src/org/apache/pig/newplan/logical/expression/DereferenceExpression.java
    pig/trunk/src/org/apache/pig/newplan/logical/relational/LOCogroup.java
    pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java
    pig/trunk/src/org/apache/pig/newplan/logical/relational/LOInnerLoad.java
    pig/trunk/src/org/apache/pig/newplan/logical/rules/DuplicateForEachColumnRewrite.java
    pig/trunk/test/org/apache/pig/test/TestLogicalPlanMigrationVisitor.java
    pig/trunk/test/org/apache/pig/test/TestNewPlanLogToPhyTranslationVisitor.java
    pig/trunk/test/org/apache/pig/test/TestPigServer.java
    pig/trunk/test/org/apache/pig/test/TestSchema.java

Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Mon Jan 24 18:26:43 2011
@@ -86,6 +86,8 @@ PIG-1696: Performance: Use System.arrayc
 
 BUG FIXES
 
+PIG-767: Schema reported from DESCRIBE and actual schema of inner bags are different (daijy)
+
 PIG-1801: Need better error message for Jython errors (rding)
 
 PIG-1742: org.apache.pig.newplan.optimizer.Rule.java does not work

Modified: pig/trunk/src/org/apache/pig/newplan/logical/expression/DereferenceExpression.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/expression/DereferenceExpression.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/expression/DereferenceExpression.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/expression/DereferenceExpression.java Mon Jan 24 18:26:43 2011
@@ -135,25 +135,24 @@ public class DereferenceExpression exten
         LogicalExpression successor = (LogicalExpression)plan.getSuccessors(this).get(0);
         LogicalFieldSchema predFS = successor.getFieldSchema();
         if (predFS!=null) {
-            if (columns.size()>1 || predFS.type==DataType.BAG) {
+            if (predFS.type==DataType.BAG) {
                 LogicalSchema innerSchema = null;
                 if (predFS.schema!=null) {
                     innerSchema = new LogicalSchema();
-                    LogicalSchema realSchema;
-                    if (predFS.schema.isTwoLevelAccessRequired()) {
-                        realSchema = predFS.schema.getField(0).schema;
-                    }
-                    else {
-                        realSchema = predFS.schema;
-                    }
-                    if (realSchema!=null) {
+                    // Get the tuple inner schema
+                    LogicalSchema origSchema = predFS.schema.getField(0).schema;;
+                    // Slice the tuple inner schema
+                    if (origSchema!=null) {
                         for (int column:columns) {
-                            innerSchema.addField(realSchema.getField(column));
+                            innerSchema.addField(origSchema.getField(column));
                         }
                     }
                 }
-                fieldSchema = new LogicalSchema.LogicalFieldSchema(null, innerSchema, predFS.type, 
-                        LogicalExpression.getNextUid());
+                LogicalSchema bagSchema = new LogicalSchema();
+                bagSchema.setTwoLevelAccessRequired(true);
+                bagSchema.addField(new LogicalSchema.LogicalFieldSchema(null, innerSchema, DataType.TUPLE, 
+                        LogicalExpression.getNextUid()));
+                fieldSchema = new LogicalSchema.LogicalFieldSchema(null, bagSchema, DataType.BAG, LogicalExpression.getNextUid());
             }
             else { // Dereference a field out of a tuple
                 if (predFS.schema!=null)

Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LOCogroup.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LOCogroup.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/relational/LOCogroup.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LOCogroup.java Mon Jan 24 18:26:43 2011
@@ -195,11 +195,18 @@ public class LOCogroup extends LogicalRe
                 generatedInputUids.put( counter, bagUid );
             }
             
-            LogicalFieldSchema newBagSchema = new LogicalFieldSchema(
-                    ((LogicalRelationalOperator)op).getAlias(), inputSchema, 
+            LogicalFieldSchema newTupleFieldSchema = new LogicalFieldSchema(
+                    null, inputSchema, DataType.TUPLE, LogicalExpression.getNextUid());
+            
+            LogicalSchema bagSchema = new LogicalSchema();
+            bagSchema.addField(newTupleFieldSchema);
+            bagSchema.setTwoLevelAccessRequired(true);
+            
+            LogicalFieldSchema newBagFieldSchema = new LogicalFieldSchema(
+                    ((LogicalRelationalOperator)op).getAlias(), bagSchema, 
                     DataType.BAG, bagUid);
 
-            fieldSchemaList.add( newBagSchema );
+            fieldSchemaList.add( newBagFieldSchema );
             counter ++;
         }
 

Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LOGenerate.java Mon Jan 24 18:26:43 2011
@@ -109,9 +109,11 @@ public class LOGenerate extends LogicalR
                                 if (fieldSchema.schema!=null) {
                                     if (fieldSchema.schema.isTwoLevelAccessRequired()) {
                                         //  assert(fieldSchema.schema.size() == 1 && fieldSchema.schema.getField(0).type == DataType.TUPLE)
-                                        innerFieldSchemas = fieldSchema.schema.getField(0).schema.getFields();
+                                        if (fieldSchema.schema!=null && fieldSchema.schema.getField(0).schema!=null)
+                                            innerFieldSchemas = fieldSchema.schema.getField(0).schema.getFields();
                                     } else {
-                                        innerFieldSchemas = fieldSchema.schema.getFields();
+                                        if (fieldSchema.schema!=null)
+                                            innerFieldSchemas = fieldSchema.schema.getFields();
                                     }
                                     for (LogicalSchema.LogicalFieldSchema fs : innerFieldSchemas) {
                                         fs.alias = fieldSchema.alias + "::" + fs.alias;

Modified: pig/trunk/src/org/apache/pig/newplan/logical/relational/LOInnerLoad.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/relational/LOInnerLoad.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/relational/LOInnerLoad.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/relational/LOInnerLoad.java Mon Jan 24 18:26:43 2011
@@ -70,12 +70,14 @@ public class LOInnerLoad extends Logical
             if (prj.getFieldSchema()!=null) {
                 if (prj.getFieldSchema().type==DataType.BAG && prj.getFieldSchema().schema!=null &&
                         prj.getFieldSchema().schema.isTwoLevelAccessRequired()) {
-                    schema = new LogicalSchema();
                     LogicalFieldSchema tupleSchema = prj.getFieldSchema().schema.getField(0);
-                    for (int i=0;i<tupleSchema.schema.size();i++)
-                        schema.addField(tupleSchema.schema.getField(i));
+                    if (tupleSchema!=null && tupleSchema.schema!=null) {
+                        schema = new LogicalSchema();
+                        for (int i=0;i<tupleSchema.schema.size();i++)
+                            schema.addField(tupleSchema.schema.getField(i));
+                        alias = prj.getFieldSchema().alias;
+                    }
                     sourceIsBag = true;
-                    alias = prj.getFieldSchema().alias;
                 }
                 else if (prj.getFieldSchema().type==DataType.BAG){
                     sourceIsBag = true;

Modified: pig/trunk/src/org/apache/pig/newplan/logical/rules/DuplicateForEachColumnRewrite.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/logical/rules/DuplicateForEachColumnRewrite.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/logical/rules/DuplicateForEachColumnRewrite.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/logical/rules/DuplicateForEachColumnRewrite.java Mon Jan 24 18:26:43 2011
@@ -102,9 +102,11 @@ public class DuplicateForEachColumnRewri
                             if (exp.getFieldSchema().schema!=null) {
                                 if (exp.getFieldSchema().schema.isTwoLevelAccessRequired()) {
                                     //  assert(fieldSchema.schema.size() == 1 && fieldSchema.schema.getField(0).type == DataType.TUPLE)
-                                    innerFieldSchemas = exp.getFieldSchema().schema.getField(0).schema.getFields();
+                                    if (exp.getFieldSchema().schema.getField(0).schema!=null)
+                                        innerFieldSchemas = exp.getFieldSchema().schema.getField(0).schema.getFields();
                                 } else {
-                                    innerFieldSchemas = exp.getFieldSchema().schema.getFields();
+                                    if (exp.getFieldSchema().schema!=null)
+                                        innerFieldSchemas = exp.getFieldSchema().schema.getFields();
                                 }
                             }
                         }

Modified: pig/trunk/test/org/apache/pig/test/TestLogicalPlanMigrationVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestLogicalPlanMigrationVisitor.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestLogicalPlanMigrationVisitor.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestLogicalPlanMigrationVisitor.java Mon Jan 24 18:26:43 2011
@@ -421,18 +421,19 @@ public class TestLogicalPlanMigrationVis
         assertEquals( false, uids.contains( schema.getField(0).uid ) );
         assertEquals( 0, schema.getField(0).alias.compareTo("group") );
         
-        
         assertEquals( DataType.BAG, schema.getField(1).type );
+        LogicalSchema bagSchema = schema.getField(1).schema;
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(1).schema.getField(0).type );
-        assertEquals( 0, schema.getField(1).schema.getField(0).alias.compareTo("name") );
-        assertEquals( loadSchema.getField(0).uid, schema.getField(1).schema.getField(0).uid );
-        assertEquals( DataType.INTEGER, schema.getField(1).schema.getField(1).type );
-        assertEquals( 0, schema.getField(1).schema.getField(1).alias.compareTo("age") );
-        assertEquals( loadSchema.getField(1).uid, schema.getField(1).schema.getField(1).uid );
-        assertEquals( DataType.FLOAT, schema.getField(1).schema.getField(2).type );
-        assertEquals( 0, schema.getField(1).schema.getField(2).alias.compareTo("gpa") );
-        assertEquals( loadSchema.getField(2).uid, schema.getField(1).schema.getField(2).uid );
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( loadSchema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.INTEGER, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("age") );
+        assertEquals( loadSchema.getField(1).uid, tupleSchema.getField(1).uid );
+        assertEquals( DataType.FLOAT, tupleSchema.getField(2).type );
+        assertEquals( 0, tupleSchema.getField(2).alias.compareTo("gpa") );
+        assertEquals( loadSchema.getField(2).uid, tupleSchema.getField(2).uid );
         
         uids.add(Long.valueOf( schema.getField(0).uid ) );
         assertEquals( false, uids.contains( schema.getField(1).uid ) );
@@ -481,17 +482,18 @@ public class TestLogicalPlanMigrationVis
         assertEquals( DataType.INTEGER, schema.getField(0).schema.getField(1).type );
         
         assertEquals( DataType.BAG, schema.getField(1).type );
+        LogicalSchema bagSchema = schema.getField(1).schema;
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(1).schema.getField(0).type );
-        assertEquals( 0, schema.getField(1).schema.getField(0).alias.compareTo("name") );
-        assertEquals( loadSchema.getField(0).uid, schema.getField(1).schema.getField(0).uid );
-        assertEquals( DataType.INTEGER, schema.getField(1).schema.getField(1).type );
-        assertEquals( 0, schema.getField(1).schema.getField(1).alias.compareTo("age") );
-        assertEquals( loadSchema.getField(1).uid, schema.getField(1).schema.getField(1).uid );
-        assertEquals( DataType.FLOAT, schema.getField(1).schema.getField(2).type );
-        assertEquals( 0, schema.getField(1).schema.getField(2).alias.compareTo("gpa") );
-        assertEquals( loadSchema.getField(2).uid, schema.getField(1).schema.getField(2).uid );
-        
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( loadSchema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.INTEGER, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("age") );
+        assertEquals( loadSchema.getField(1).uid, tupleSchema.getField(1).uid );
+        assertEquals( DataType.FLOAT, tupleSchema.getField(2).type );
+        assertEquals( 0, tupleSchema.getField(2).alias.compareTo("gpa") );
+        assertEquals( loadSchema.getField(2).uid, tupleSchema.getField(2).uid );
         
         // We are doing Uid tests at the end as the uids should not repeat
         uids.add(Long.valueOf( schema.getField(0).uid ) );
@@ -560,25 +562,29 @@ public class TestLogicalPlanMigrationVis
         assertEquals( 0, schema.getField(0).alias.compareTo("group") );
 
         assertEquals( DataType.BAG, schema.getField(1).type );
+        LogicalSchema bagSchema = schema.getField(1).schema;
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(1).schema.getField(0).type );
-        assertEquals( 0, schema.getField(1).schema.getField(0).alias.compareTo("name") );
-        assertEquals( loadSchema.getField(0).uid, schema.getField(1).schema.getField(0).uid );
-        assertEquals( DataType.INTEGER, schema.getField(1).schema.getField(1).type );
-        assertEquals( 0, schema.getField(1).schema.getField(1).alias.compareTo("age") );
-        assertEquals( loadSchema.getField(1).uid, schema.getField(1).schema.getField(1).uid );
-        assertEquals( DataType.FLOAT, schema.getField(1).schema.getField(2).type );
-        assertEquals( 0, schema.getField(1).schema.getField(2).alias.compareTo("gpa") );
-        assertEquals( loadSchema.getField(2).uid, schema.getField(1).schema.getField(2).uid );
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( loadSchema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.INTEGER, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("age") );
+        assertEquals( loadSchema.getField(1).uid, tupleSchema.getField(1).uid );
+        assertEquals( DataType.FLOAT, tupleSchema.getField(2).type );
+        assertEquals( 0, tupleSchema.getField(2).alias.compareTo("gpa") );
+        assertEquals( loadSchema.getField(2).uid, tupleSchema.getField(2).uid );
         
         assertEquals( DataType.BAG, schema.getField(2).type );
+        bagSchema = schema.getField(2).schema;
+        tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(2).schema.getField(0).type );
-        assertEquals( 0, schema.getField(2).schema.getField(0).alias.compareTo("name") );
-        assertEquals( load2Schema.getField(0).uid, schema.getField(2).schema.getField(0).uid );
-        assertEquals( DataType.CHARARRAY, schema.getField(2).schema.getField(1).type );
-        assertEquals( 0, schema.getField(2).schema.getField(1).alias.compareTo("blah") );
-        assertEquals( load2Schema.getField(1).uid, schema.getField(2).schema.getField(1).uid );        
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( load2Schema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("blah") );
+        assertEquals( load2Schema.getField(1).uid, tupleSchema.getField(1).uid );        
         
         
         // We are doing Uid tests at the end as the uids should not repeat                
@@ -650,28 +656,32 @@ public class TestLogicalPlanMigrationVis
                
 
         assertEquals( DataType.BAG, schema.getField(1).type );
+        LogicalSchema bagSchema = schema.getField(1).schema;
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(1).schema.getField(0).type );
-        assertEquals( 0, schema.getField(1).schema.getField(0).alias.compareTo("name") );
-        assertEquals( loadSchema.getField(0).uid, schema.getField(1).schema.getField(0).uid );
-        assertEquals( DataType.INTEGER, schema.getField(1).schema.getField(1).type );
-        assertEquals( 0, schema.getField(1).schema.getField(1).alias.compareTo("age") );
-        assertEquals( loadSchema.getField(1).uid, schema.getField(1).schema.getField(1).uid );
-        assertEquals( DataType.FLOAT, schema.getField(1).schema.getField(2).type );
-        assertEquals( 0, schema.getField(1).schema.getField(2).alias.compareTo("gpa") );
-        assertEquals( loadSchema.getField(2).uid, schema.getField(1).schema.getField(2).uid );
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( loadSchema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.INTEGER, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("age") );
+        assertEquals( loadSchema.getField(1).uid, tupleSchema.getField(1).uid );
+        assertEquals( DataType.FLOAT, tupleSchema.getField(2).type );
+        assertEquals( 0, tupleSchema.getField(2).alias.compareTo("gpa") );
+        assertEquals( loadSchema.getField(2).uid, tupleSchema.getField(2).uid );
         
         assertEquals( DataType.BAG, schema.getField(2).type );
+        bagSchema = schema.getField(2).schema;
+        tupleSchema = bagSchema.getField(0).schema;
         
-        assertEquals( DataType.CHARARRAY, schema.getField(2).schema.getField(0).type );
-        assertEquals( 0, schema.getField(2).schema.getField(0).alias.compareTo("name") );
-        assertEquals( load2Schema.getField(0).uid, schema.getField(2).schema.getField(0).uid );
-        assertEquals( DataType.INTEGER, schema.getField(2).schema.getField(1).type );
-        assertEquals( 0, schema.getField(2).schema.getField(1).alias.compareTo("age") );
-        assertEquals( load2Schema.getField(1).uid, schema.getField(2).schema.getField(1).uid );
-        assertEquals( DataType.CHARARRAY, schema.getField(2).schema.getField(2).type );
-        assertEquals( 0, schema.getField(2).schema.getField(2).alias.compareTo("blah") );
-        assertEquals( load2Schema.getField(2).uid, schema.getField(2).schema.getField(2).uid );        
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(0).type );
+        assertEquals( 0, tupleSchema.getField(0).alias.compareTo("name") );
+        assertEquals( load2Schema.getField(0).uid, tupleSchema.getField(0).uid );
+        assertEquals( DataType.INTEGER, tupleSchema.getField(1).type );
+        assertEquals( 0, tupleSchema.getField(1).alias.compareTo("age") );
+        assertEquals( load2Schema.getField(1).uid, tupleSchema.getField(1).uid );
+        assertEquals( DataType.CHARARRAY, tupleSchema.getField(2).type );
+        assertEquals( 0, tupleSchema.getField(2).alias.compareTo("blah") );
+        assertEquals( load2Schema.getField(2).uid, tupleSchema.getField(2).uid );        
         
         
         // We are doing Uid tests at the end as the uids should not repeat

Modified: pig/trunk/test/org/apache/pig/test/TestNewPlanLogToPhyTranslationVisitor.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestNewPlanLogToPhyTranslationVisitor.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestNewPlanLogToPhyTranslationVisitor.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestNewPlanLogToPhyTranslationVisitor.java Mon Jan 24 18:26:43 2011
@@ -69,6 +69,7 @@ import org.apache.pig.newplan.logical.ex
 import org.apache.pig.newplan.logical.expression.ProjectExpression;
 import org.apache.pig.newplan.logical.expression.SubtractExpression;
 import org.apache.pig.newplan.logical.expression.UserFuncExpression;
+import org.apache.pig.newplan.logical.relational.LOCogroup;
 import org.apache.pig.newplan.logical.relational.LOFilter;
 import org.apache.pig.newplan.logical.relational.LOForEach;
 import org.apache.pig.newplan.logical.relational.LOGenerate;
@@ -1371,4 +1372,47 @@ public class TestNewPlanLogToPhyTranslat
         assertTrue(foreach.getSchema().getField(0).alias.equals("a0"));
         assertTrue(foreach.getSchema().getField(1).alias.equals("a1"));
     }
+    
+    // See PIG-767
+    public void testCogroupSchema1() throws Exception {
+        LogicalPlanTester lpt = new LogicalPlanTester(pc);
+        lpt.buildPlan("a = load '1.txt' as (a0, a1);");
+        lpt.buildPlan("b = group a by a0;");
+        LogicalPlan plan = lpt.buildPlan("store b into 'empty';");  
+        
+        org.apache.pig.newplan.logical.relational.LogicalPlan newLogicalPlan = migratePlan(plan);
+        Operator store = newLogicalPlan.getSinks().get(0);
+        LOCogroup cogroup = (LOCogroup)newLogicalPlan.getPredecessors(store).get(0);
+        
+        LogicalSchema cogroupSchema = cogroup.getSchema();
+        assertEquals(cogroupSchema.getField(1).type, DataType.BAG);
+        assertTrue(cogroupSchema.getField(1).alias.equals("a"));
+        LogicalSchema bagSchema = cogroupSchema.getField(1).schema;
+        assertEquals(bagSchema.getField(0).type, DataType.TUPLE);
+        assertEquals(bagSchema.getField(0).alias, null);
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
+        assertEquals(tupleSchema.size(), 2);
+    }
+    
+    // See PIG-767
+    public void testCogroupSchema2() throws Exception {
+        LogicalPlanTester lpt = new LogicalPlanTester(pc);
+        lpt.buildPlan("a = load '1.txt' as (a0, a1);");
+        lpt.buildPlan("b = group a by a0;");
+        lpt.buildPlan("c = foreach b generate a.a1;");
+        LogicalPlan plan = lpt.buildPlan("store c into 'empty';");  
+        
+        org.apache.pig.newplan.logical.relational.LogicalPlan newLogicalPlan = migratePlan(plan);
+        Operator store = newLogicalPlan.getSinks().get(0);
+        LOForEach foreach = (LOForEach)newLogicalPlan.getPredecessors(store).get(0);
+        
+        LogicalSchema foreachSchema = foreach.getSchema();
+        assertEquals(foreachSchema.getField(0).type, DataType.BAG);
+        LogicalSchema bagSchema = foreachSchema.getField(0).schema;
+        assertEquals(bagSchema.getField(0).type, DataType.TUPLE);
+        assertEquals(bagSchema.getField(0).alias, null);
+        LogicalSchema tupleSchema = bagSchema.getField(0).schema;
+        assertEquals(tupleSchema.size(), 1);
+        assertTrue(tupleSchema.getField(0).alias.equals("a1"));
+    }
 }

Modified: pig/trunk/test/org/apache/pig/test/TestPigServer.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestPigServer.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestPigServer.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestPigServer.java Mon Jan 24 18:26:43 2011
@@ -481,7 +481,7 @@ public class TestPigServer extends TestC
         InputStream fileWithStdOutContents = new DataInputStream( new BufferedInputStream( new FileInputStream(stdOutRedirectedFile)));
         BufferedReader reader = new BufferedReader(new InputStreamReader(fileWithStdOutContents));
         while ((s = reader.readLine()) != null) {
-            assertTrue(s.equals("c: {group: int,a: {field1: int,field2: float,field3: chararray},b: {field4: bytearray,field5: double,field6: chararray}}") == true);
+            assertTrue(s.equals("c: {group: int,a: {(field1: int,field2: float,field3: chararray)},b: {(field4: bytearray,field5: double,field6: chararray)}}") == true);
         }
         fileWithStdOutContents.close();
     }

Modified: pig/trunk/test/org/apache/pig/test/TestSchema.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestSchema.java?rev=1062911&r1=1062910&r2=1062911&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestSchema.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestSchema.java Mon Jan 24 18:26:43 2011
@@ -653,7 +653,7 @@ public class TestSchema extends TestCase
         Iterator<Tuple> it = pigServer.openIterator("c");
         while(it.hasNext()) {
             Tuple t = it.next();
-            assertEquals("{a: {f1: chararray,f2: int}}", t.get(0));
+            assertEquals("{a: {(f1: chararray,f2: int)}}", t.get(0));
         }
         cluster.shutDown();
     }