mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	As a result of confusion about whether the "char" type is signed or unsigned, scans for index searches like "col < 'x'" or "col <= 'x'" would start at the middle of the index not the left end, thus missing many or all of the entries they should find. Fortunately, this is not a symptom of index corruption. It's only the search logic that is broken, and we can fix it without unpleasant side-effects. Per report from Jason Kim. This has been wrong since btree_gin's beginning, so back-patch to all supported branches. Discussion: https://postgr.es/m/20210810001649.htnltbh7c63re42p@jasonk.me
		
			
				
	
	
		
			45 lines
		
	
	
		
			588 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			588 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| set enable_seqscan=off;
 | |
| CREATE TABLE test_char (
 | |
| 	i "char"
 | |
| );
 | |
| INSERT INTO test_char VALUES ('a'),('b'),('c'),('d'),('e'),('f');
 | |
| CREATE INDEX idx_char ON test_char USING gin (i);
 | |
| SELECT * FROM test_char WHERE i<'d'::"char" ORDER BY i;
 | |
|  i 
 | |
| ---
 | |
|  a
 | |
|  b
 | |
|  c
 | |
| (3 rows)
 | |
| 
 | |
| SELECT * FROM test_char WHERE i<='d'::"char" ORDER BY i;
 | |
|  i 
 | |
| ---
 | |
|  a
 | |
|  b
 | |
|  c
 | |
|  d
 | |
| (4 rows)
 | |
| 
 | |
| SELECT * FROM test_char WHERE i='d'::"char" ORDER BY i;
 | |
|  i 
 | |
| ---
 | |
|  d
 | |
| (1 row)
 | |
| 
 | |
| SELECT * FROM test_char WHERE i>='d'::"char" ORDER BY i;
 | |
|  i 
 | |
| ---
 | |
|  d
 | |
|  e
 | |
|  f
 | |
| (3 rows)
 | |
| 
 | |
| SELECT * FROM test_char WHERE i>'d'::"char" ORDER BY i;
 | |
|  i 
 | |
| ---
 | |
|  e
 | |
|  f
 | |
| (2 rows)
 | |
| 
 |