X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fpsql-reader.c;h=c6f03250ddced18199b64af59351e0da9f5e6814;hb=a49b940e58f148bf111c647d9b4822025636ff80;hp=630a720711ce14af83784137085cd8cb72f57ab2;hpb=6f3865480503c571963d8a2d1af858a4d72d4e88;p=pspp diff --git a/src/data/psql-reader.c b/src/data/psql-reader.c index 630a720711..c6f03250dd 100644 --- a/src/data/psql-reader.c +++ b/src/data/psql-reader.c @@ -252,7 +252,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) } { - int ver_num; + int ver_num = 0; const char *vers = PQparameterStatus (r->conn, "server_version"); sscanf (vers, "%d", &ver_num); @@ -303,12 +303,17 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) *dict = r->dict = dict_create (encoding); } + const int version = PQserverVersion (r->conn); + ds_init_empty (&query); /* - select count (*) from (select * from medium) stupid_sql_standard; - */ - ds_init_cstr (&query, - "BEGIN READ ONLY ISOLATION LEVEL SERIALIZABLE; " - "DECLARE pspp BINARY CURSOR FOR "); + Versions before 9.1 don't have the REPEATABLE READ isolation level. + However according to if the server is in the + "hot standby" mode then SERIALIZABLE won't work. + */ + ds_put_c_format (&query, + "BEGIN READ ONLY ISOLATION LEVEL %s; " + "DECLARE pspp BINARY CURSOR FOR ", + (version < 90100) ? "SERIALIZABLE" : "REPEATABLE READ"); ds_put_substring (&query, info->sql.ss); @@ -371,11 +376,11 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) int width = 0; int length ; - /* If there are no data then make a finger in the air + /* If there are no data then make a finger in the air guess at the contents */ if ( n_tuples > 0 ) length = PQgetlength (qres, 0, i); - else + else length = PSQL_DEFAULT_WIDTH; switch (type) @@ -539,7 +544,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) &psql_casereader_class, r); error: - dict_destroy (*dict); + dict_unref (*dict); psql_casereader_destroy (NULL, r); return NULL; @@ -835,8 +840,7 @@ set_value (struct psql_reader *r) case VARCHAROID: case BPCHAROID: case BYTEAOID: - memcpy (value_str_rw (val, var_width), vptr, - MIN (length, var_width)); + memcpy (val->s, vptr, MIN (length, var_width)); break; case NUMERICOID: