@@ -502,6 +502,19 @@ def get_ids():
502502
503503        self ._ids  =  get_ids ()
504504
505+     def  _values_query (self , query ):
506+         cr  =  self ._model .env .cr 
507+         cr .execute (format_query (cr , "WITH query AS ({}) SELECT count(*) FROM query" , query ))
508+         size  =  cr .fetchone ()[0 ]
509+ 
510+         def  get_values ():
511+             with  named_cursor (cr , itersize = self ._chunk_size ) as  ncr :
512+                 ncr .execute (query )
513+                 for  row  in  ncr .iterdict ():
514+                     yield  row 
515+ 
516+         return  size , get_values ()
517+ 
505518    def  _browse (self , ids ):
506519        next (self ._end (), None )
507520        args  =  self ._cr_uid  +  (list (ids ),)
@@ -593,6 +606,7 @@ def create(self, values, **kw):
593606                           `True` from Odoo 12 and above 
594607        """ 
595608        multi  =  kw .pop ("multi" , version_gte ("saas~11.5" ))
609+         size  =  kw .pop ("size" , None )
596610        if  kw :
597611            raise  TypeError ("Unknown arguments: %s"  %  ", " .join (kw ))
598612
@@ -605,7 +619,15 @@ def create(self, values, **kw):
605619        if  self ._strategy  ==  "multiprocessing"  and  not  multi :
606620            raise  ValueError ("The multiprocessing strategy only supports the multi version of `create`" )
607621
608-         size  =  len (values )
622+         if  isinstance (values , SQLStr ):
623+             size , values  =  self ._values_query (values )
624+ 
625+         if  size  is  None :
626+             try :
627+                 size  =  len (values )
628+             except  TypeError :
629+                 raise  ValueError ("When passing values as a generator, the size kwarg is mandatory" )
630+ 
609631        chunk_size  =  self ._superchunk_size  if  self ._strategy  ==  "multiprocessing"  else  self ._chunk_size 
610632        it  =  chunks (values , chunk_size , fmt = list )
611633        if  self ._logger :
0 commit comments