Merge 8e9c1358b5d22c7cac67ac2157f598b2ccb79a6c into 4e34a6d21b63e9a9b701a70be9759e5539bf26e9
This commit is contained in:
		
						commit
						755979ef13
					
				| @ -88,6 +88,7 @@ func (expr NamedExpr) Build(builder Builder) { | |||||||
| 		inName           bool | 		inName           bool | ||||||
| 		afterParenthesis bool | 		afterParenthesis bool | ||||||
| 		namedMap         = make(map[string]interface{}, len(expr.Vars)) | 		namedMap         = make(map[string]interface{}, len(expr.Vars)) | ||||||
|  | 		quotationMarks   byte | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	for _, v := range expr.Vars { | 	for _, v := range expr.Vars { | ||||||
| @ -124,6 +125,14 @@ func (expr NamedExpr) Build(builder Builder) { | |||||||
| 	name := make([]byte, 0, 10) | 	name := make([]byte, 0, 10) | ||||||
| 
 | 
 | ||||||
| 	for _, v := range []byte(expr.SQL) { | 	for _, v := range []byte(expr.SQL) { | ||||||
|  | 		if quotationMarks == v && (v == '"' || v == '\'') { | ||||||
|  | 			quotationMarks = 0 | ||||||
|  | 		} else if quotationMarks == 0 && (v == '"' || v == '\'') { | ||||||
|  | 			quotationMarks = v | ||||||
|  | 		} else if quotationMarks == '"' || quotationMarks == '\'' { | ||||||
|  | 			builder.WriteByte(v) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
| 		if v == '@' && !inName { | 		if v == '@' && !inName { | ||||||
| 			inName = true | 			inName = true | ||||||
| 			name = name[:0] | 			name = name[:0] | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								tests/raw_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								tests/raw_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | package tests_test | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	. "gorm.io/gorm/utils/tests" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestRawSelect(t *testing.T) { | ||||||
|  | 	users := []User{ | ||||||
|  | 		*GetUser("raw1", Config{}), | ||||||
|  | 		*GetUser("raw2", Config{}), | ||||||
|  | 		*GetUser("raw3", Config{}), | ||||||
|  | 		*GetUser("@name", Config{}), | ||||||
|  | 		*GetUser("@age", Config{}), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := DB.Create(&users).Error; err != nil { | ||||||
|  | 		t.Fatalf("errors happened when create users: %v", err) | ||||||
|  | 	} | ||||||
|  | 	tests := []struct { | ||||||
|  | 		TestName string | ||||||
|  | 		Sql      string | ||||||
|  | 		args     map[string]interface{} | ||||||
|  | 		Expect   []User | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			"raw_test1", | ||||||
|  | 			`select * from users where name like @name and age = 18`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"name": "raw1", | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[0], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"raw_test2", | ||||||
|  | 			`select * from users where name like @name and age = 18`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"name": "@name", | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[3], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"raw_test3", | ||||||
|  | 			`select * from users where name like @name and age = 18`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"name": "@age", | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[4], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"raw_test4", | ||||||
|  | 			`select * from users where name like 'raw3' and age = @age`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"age": 18, | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[2], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"raw_test5", | ||||||
|  | 			`select * from users where name like '@name' and age = @age`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"age": 18, | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[3], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"raw_test6", | ||||||
|  | 			`select * from users where name like '@age' and age = @age`, | ||||||
|  | 			map[string]interface{}{ | ||||||
|  | 				"age": 18, | ||||||
|  | 			}, | ||||||
|  | 			[]User{ | ||||||
|  | 				users[4], | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	for _, test := range tests { | ||||||
|  | 		t.Run(test.TestName, func(t *testing.T) { | ||||||
|  | 			var results []User | ||||||
|  | 			if err := DB.Raw(test.Sql, test.args).Scan(&results).Error; err != nil { | ||||||
|  | 				t.Errorf("errors %s: %v", test.TestName, err) | ||||||
|  | 			} else { | ||||||
|  | 				if len(results) != len(test.Expect) { | ||||||
|  | 					t.Errorf("errors %s: %v", test.TestName, err) | ||||||
|  | 				} else { | ||||||
|  | 					for i := 0; i < len(results); i++ { | ||||||
|  | 						CheckUser(t, results[i], test.Expect[i]) | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Rankgice
						Rankgice