mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 05:48:56 +08:00 
			
		
		
		
	Interpret generate_series arguments as possibly NULL
This commit is contained in:
		| @@ -8,7 +8,6 @@ use std::marker::PhantomData; | ||||
| use std::os::raw::c_int; | ||||
|  | ||||
| use crate::ffi; | ||||
| use crate::types::Type; | ||||
| use crate::vtab::{ | ||||
|     eponymous_only_module, Context, IndexConstraintOp, IndexInfo, VTab, VTabConfig, VTabConnection, | ||||
|     VTabCursor, Values, | ||||
| @@ -198,21 +197,34 @@ impl SeriesTabCursor<'_> { | ||||
| unsafe impl VTabCursor for SeriesTabCursor<'_> { | ||||
|     fn filter(&mut self, idx_num: c_int, _idx_str: Option<&str>, args: &Values<'_>) -> Result<()> { | ||||
|         let mut idx_num = QueryPlanFlags::from_bits_truncate(idx_num); | ||||
|         let mut any_null = false; | ||||
|         let mut i = 0; | ||||
|         if idx_num.contains(QueryPlanFlags::START) { | ||||
|             self.min_value = args.get(i)?; | ||||
|             if let Some(min_value) = args.get(i)? { | ||||
|                 self.min_value = min_value; | ||||
|             } else { | ||||
|                 any_null = true; | ||||
|             } | ||||
|             i += 1; | ||||
|         } else { | ||||
|             self.min_value = 0; | ||||
|         } | ||||
|         if idx_num.contains(QueryPlanFlags::STOP) { | ||||
|             self.max_value = args.get(i)?; | ||||
|             if let Some(max_value) = args.get(i)? { | ||||
|                 self.max_value = max_value; | ||||
|             } else { | ||||
|                 any_null = true; | ||||
|             } | ||||
|             i += 1; | ||||
|         } else { | ||||
|             self.max_value = 0xffff_ffff; | ||||
|         } | ||||
|         if idx_num.contains(QueryPlanFlags::STEP) { | ||||
|             self.step = args.get(i)?; | ||||
|             if let Some(step) = args.get(i)? { | ||||
|                 self.step = step; | ||||
|             } else { | ||||
|                 any_null = true; | ||||
|             } | ||||
|             if self.step == 0 { | ||||
|                 self.step = 1; | ||||
|             } else if self.step < 0 { | ||||
| @@ -224,13 +236,11 @@ unsafe impl VTabCursor for SeriesTabCursor<'_> { | ||||
|         } else { | ||||
|             self.step = 1; | ||||
|         }; | ||||
|         for arg in args.iter() { | ||||
|             if arg.data_type() == Type::Null { | ||||
|                 // If any of the constraints have a NULL value, then return no rows. | ||||
|                 self.min_value = 1; | ||||
|                 self.max_value = 0; | ||||
|                 break; | ||||
|             } | ||||
|         if any_null { | ||||
|             // If any of the constraints have a NULL value, then | ||||
|             // return no rows. | ||||
|             self.min_value = 1; | ||||
|             self.max_value = 0; | ||||
|         } | ||||
|         self.is_desc = idx_num.contains(QueryPlanFlags::DESC); | ||||
|         if self.is_desc { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user