@@ -124,6 +124,7 @@ type Builder interface {
124124	// Deprecated: Use VirtualTableFromExpr(...).Remap() instead. 
125125	VirtualTableFromExprRemap (fieldNames  []string , remap  []int32 , values  ... expr.VirtualTableExpressionValue ) (* VirtualTableReadRel , error )
126126	VirtualTableFromExpr (fieldNames  []string , values  ... expr.VirtualTableExpressionValue ) (* VirtualTableReadRel , error )
127+ 	EmptyVirtualTable (fieldNames  []string , types  []types.Type ) (* VirtualTableReadRel , error )
127128	IcebergTableFromMetadataFile (metadataURI  string , snapshot  IcebergSnapshot , schema  types.NamedStruct ) (* IcebergTableReadRel , error )
128129	// Deprecated: Use Sort(...).Remap() instead. 
129130	SortRemap (input  Rel , remap  []int32 , sorts  ... expr.SortField ) (* SortRel , error )
@@ -568,7 +569,7 @@ func (b *builder) VirtualTableFromExpr(fieldNames []string, values ...expr.Virtu
568569
569570func  (b  * builder ) VirtualTableFromExprRemap (fieldNames  []string , remap  []int32 , values  ... expr.VirtualTableExpressionValue ) (* VirtualTableReadRel , error ) {
570571	if  len (values ) ==  0  {
571- 		return  nil , fmt .Errorf ("%w: must provide at least one set of values for virtual table " , substraitgo .ErrInvalidRel )
572+ 		return  nil , fmt .Errorf ("%w: must provide at least one set of values. Consider EmptyVirtualTable to construct rowless Virtual Table " , substraitgo .ErrInvalidArg )
572573	}
573574
574575	nfields  :=  len (fieldNames )
@@ -619,6 +620,21 @@ func (b *builder) VirtualTable(fields []string, values ...expr.StructLiteralValu
619620	return  b .VirtualTableRemap (fields , nil , values ... )
620621}
621622
623+ func  (b  * builder ) EmptyVirtualTable (fieldNames  []string , typeList  []types.Type ) (* VirtualTableReadRel , error ) {
624+ 	baseSchema  :=  types.NamedStruct {
625+ 		Names : fieldNames ,
626+ 		Struct : types.StructType {
627+ 			Nullability : types .NullabilityRequired ,
628+ 			Types :       typeList ,
629+ 		},
630+ 	}
631+ 	return  & VirtualTableReadRel {
632+ 		baseReadRel : baseReadRel {
633+ 			baseSchema : baseSchema ,
634+ 		},
635+ 	}, nil 
636+ }
637+ 
622638func  (b  * builder ) IcebergTableFromMetadataFile (metadataURI  string , snapshot  IcebergSnapshot , schema  types.NamedStruct ) (* IcebergTableReadRel , error ) {
623639	tableType  :=  & Direct {}
624640	tableType .MetadataUri  =  metadataURI 
0 commit comments