~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/function/str/load_file.cc

  • Committer: Prafulla Tekawade
  • Date: 2010-08-06 11:21:12 UTC
  • mto: (1711.1.21 build) (1725.1.1 build)
  • mto: This revision was merged to the branch mainline in revision 1714.
  • Revision ID: prafulla_t@users.sourceforge.net-20100806112112-7w5u0s3nx9u67nzt
Fix for Bug 586051

1. test_if_ref method which checks whether predicate is already evaluated
   due to ref/eq_ref access or not was incorrectly removing a predicate 
   that was not implicitly evaluated due to ref access (due to presence of filesort ?)
   It was field=NULL predicate.
   Such predicate should be kept and execution engine will filter out rows
   correctly. Removal of such predicate led to returning of rows which had
   NULL for join/predicate columns.
2. field COMP_OP NULL will always false for all fields except when COMP_OP
   is NULL-safe equality operator. Modified range optimizer to return zero
   row count in such cases.
   Query now does not even run. It returns zero result. As such Fix(1) is not
   required but we might hit that case in some other query (I have not tried it
   yet)
3. Fixed Field::val_str to print "NULL" for literal NULL instead of "0". It
   added lot of confusion while debugging.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <drizzled/session.h>
26
26
#include "drizzled/internal/my_sys.h"
27
27
 
28
 
#include <boost/filesystem.hpp>
29
 
 
30
28
#include <fcntl.h>
31
29
#include <sys/stat.h>
32
 
#include <iostream>
33
 
 
34
 
namespace fs=boost::filesystem;
35
 
using namespace std;
36
30
 
37
31
namespace drizzled
38
32
{
43
37
  String *file_name;
44
38
  int file;
45
39
  struct stat stat_info;
 
40
  char path[FN_REFLEN];
46
41
 
47
42
  if (!(file_name= args[0]->val_str(str)))
48
 
  {
49
 
    null_value = 1;
50
 
    return(0);
51
 
  }
 
43
    goto err;
52
44
 
53
 
  fs::path target_path(fs::system_complete(getDataHomeCatalog()));
54
 
  fs::path to_file(file_name->c_ptr());
55
 
  if (not to_file.has_root_directory())
56
 
  {
57
 
    target_path /= to_file;
58
 
  }
59
 
  else
60
 
  {
61
 
    target_path= to_file;
62
 
  }
 
45
  (void) internal::fn_format(path, file_name->c_ptr(), data_home_real, "",
 
46
                   MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
63
47
 
64
48
  /* Read only allowed from within dir specified by secure_file_priv */
65
 
  if (not secure_file_priv.string().empty())
66
 
  {
67
 
    fs::path secure_file_path(fs::system_complete(secure_file_priv));
68
 
    if (target_path.file_string().substr(0, secure_file_path.file_string().size()) != secure_file_path.file_string())
69
 
    {
70
 
      /* Read only allowed from within dir specified by secure_file_priv */
71
 
      my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv"); 
72
 
      null_value = 1;
73
 
      return 0;
74
 
    }
75
 
  }
 
49
  if (opt_secure_file_priv &&
 
50
      strncmp(opt_secure_file_priv, path, strlen(opt_secure_file_priv)))
 
51
    goto err;
76
52
 
77
 
  if (stat(target_path.file_string().c_str(), &stat_info))
78
 
  {
79
 
    my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr());
 
53
  if (stat(path, &stat_info))
80
54
    goto err;
81
 
  }
82
55
 
83
56
  if (!(stat_info.st_mode & S_IROTH))
84
57
  {
85
 
    my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr());
 
58
    /* my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr()); */
86
59
    goto err;
87
60
  }
88
 
 
89
61
  if (stat_info.st_size > (long) session.variables.max_allowed_packet)
90
62
  {
91
63
    push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
94
66
                        func_name(), session.variables.max_allowed_packet);
95
67
    goto err;
96
68
  }
97
 
 
98
 
  if (stat_info.st_size == 0)
99
 
  {
100
 
    goto err;
101
 
  }
102
 
 
103
69
  if (tmp_value.alloc((size_t)stat_info.st_size))
104
70
    goto err;
105
 
  if ((file = internal::my_open(target_path.file_string().c_str(), O_RDONLY, MYF(0))) < 0)
 
71
  if ((file = internal::my_open(file_name->c_ptr(), O_RDONLY, MYF(0))) < 0)
106
72
    goto err;
107
73
  if (internal::my_read(file, (unsigned char*) tmp_value.ptr(), (size_t)stat_info.st_size, MYF(MY_NABP)))
108
74
  {
109
75
    internal::my_close(file, MYF(0));
110
76
    goto err;
111
77
  }
112
 
  if (strlen(tmp_value.ptr()) == 0)
113
 
  {
114
 
    goto err;
115
 
  }
116
78
  tmp_value.length((size_t)stat_info.st_size);
117
79
  internal::my_close(file, MYF(0));
118
80
  null_value = 0;