Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix the group_concat() function so that it inserts the separator string even if the initial content strings are empty. Ticket #3806. (CVS 6510) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
b83fbf15a3920755ed77dc9c91b4f00a |
User & Date: | drh 2009-04-15 15:16:53.000 |
Context
2009-04-16
| ||
00:24 | In a 3-fold compound SELECT make sure early code generation of the SELECTs to the right do not dereference non-existant columns in SELECTs on the left. (CVS 6511) (check-in: 414f340809 user: drh tags: trunk) | |
2009-04-15
| ||
15:16 | Fix the group_concat() function so that it inserts the separator string even if the initial content strings are empty. Ticket #3806. (CVS 6510) (check-in: b83fbf15a3 user: drh tags: trunk) | |
14:36 | Fix access violation on WinCE platforms. Ticket #3804. (CVS 6509) (check-in: e203ad400d user: shane tags: trunk) | |
Changes
Changes to src/func.c.
︙ | ︙ | |||
12 13 14 15 16 17 18 | ** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** ** $Id: func.c,v 1.233 2009/04/15 15:16:53 drh Exp $ */ #include "sqliteInt.h" #include <stdlib.h> #include <assert.h> #include "vdbeInt.h" /* |
︙ | ︙ | |||
1258 1259 1260 1261 1262 1263 1264 | if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); if( pAccum ){ sqlite3 *db = sqlite3_context_db_handle(context); pAccum->useMalloc = 1; pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; | | | 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 | if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum)); if( pAccum ){ sqlite3 *db = sqlite3_context_db_handle(context); pAccum->useMalloc = 1; pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; if( sqlite3_aggregate_count(context)>1 ){ if( argc==2 ){ zSep = (char*)sqlite3_value_text(argv[1]); nSep = sqlite3_value_bytes(argv[1]); }else{ zSep = ","; nSep = 1; } |
︙ | ︙ |
Changes to test/func.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing built-in functions. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing built-in functions. # # $Id: func.test,v 1.92 2009/04/15 15:16:53 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a table to work with. # do_test func-0.0 { |
︙ | ︙ | |||
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 | set result [md5 \ "this${midres}program${midres}is${midres}free${midres}software${midres}"] set sql "SELECT md5sum(t1$midargs) FROM tbl1" do_test func-24.7.$i { db eval $::sql } $result } # Use the test_isolation function to make sure that type conversions # on function arguments do not effect subsequent arguments. # do_test func-25.1 { execsql {SELECT test_isolation(t1,t1) FROM tbl1} } {this program is free software} | > > > > > > > > > > > > > > | 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 | set result [md5 \ "this${midres}program${midres}is${midres}free${midres}software${midres}"] set sql "SELECT md5sum(t1$midargs) FROM tbl1" do_test func-24.7.$i { db eval $::sql } $result } # Ticket #3806. If the initial string in a group_concat is an empty # string, the separate that follows should still be present. # do_test func-24.8 { execsql { SELECT group_concat(CASE t1 WHEN 'this' THEN '' ELSE t1 END) FROM tbl1 } } {,program,is,free,software} do_test func-24.9 { execsql { SELECT group_concat(CASE WHEN t1!='software' THEN '' ELSE t1 END) FROM tbl1 } } {,,,,software} # Use the test_isolation function to make sure that type conversions # on function arguments do not effect subsequent arguments. # do_test func-25.1 { execsql {SELECT test_isolation(t1,t1) FROM tbl1} } {this program is free software} |
︙ | ︙ |