~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_parse.cc

  • Committer: Brian Aker
  • Date: 2009-03-10 07:23:57 UTC
  • mfrom: (923.1.8 merge)
  • Revision ID: brian@tangent.org-20090310072357-8k8bx8wn56v7pwmw
Merge of the removal of dead COM code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
  { C_STRING_WITH_LEN("Quit") },
56
56
  { C_STRING_WITH_LEN("Init DB") },
57
57
  { C_STRING_WITH_LEN("Query") },
58
 
  { C_STRING_WITH_LEN("Field List") },
59
 
  { C_STRING_WITH_LEN("Create DB") },
60
 
  { C_STRING_WITH_LEN("Drop DB") },
61
 
  { C_STRING_WITH_LEN("Refresh") },
62
58
  { C_STRING_WITH_LEN("Shutdown") },
63
 
  { C_STRING_WITH_LEN("Processlist") },
64
59
  { C_STRING_WITH_LEN("Connect") },
65
 
  { C_STRING_WITH_LEN("Kill") },
66
60
  { C_STRING_WITH_LEN("Ping") },
67
 
  { C_STRING_WITH_LEN("Time") },
68
 
  { C_STRING_WITH_LEN("Change user") },
69
 
  { C_STRING_WITH_LEN("Connect Out") },
70
 
  { C_STRING_WITH_LEN("Set option") },
71
 
  { C_STRING_WITH_LEN("Daemon") },
72
61
  { C_STRING_WITH_LEN("Error") }  // Last command number
73
62
};
74
63
 
480
469
    }
481
470
    break;
482
471
  }
483
 
  case COM_CHANGE_USER:
484
 
  {
485
 
    status_var_increment(session->status_var.com_other);
486
 
    char *user= (char*) packet, *packet_end= packet + packet_length;
487
 
    /* Safe because there is always a trailing \0 at the end of the packet */
488
 
    char *passwd= strchr(user, '\0')+1;
489
 
 
490
 
 
491
 
    session->clear_error();                         // if errors from rollback
492
 
 
493
 
    /*
494
 
      Old clients send null-terminated string ('\0' for empty string) for
495
 
      password.  New clients send the size (1 byte) + string (not null
496
 
      terminated, so also '\0' for empty string).
497
 
 
498
 
      Cast *passwd to an unsigned char, so that it doesn't extend the sign
499
 
      for *passwd > 127 and become 2**32-127 after casting to uint32_t.
500
 
    */
501
 
    char db_buff[NAME_LEN+1];                 // buffer to store db in utf8
502
 
    char *db= passwd;
503
 
    char *save_db;
504
 
    /*
505
 
      If there is no password supplied, the packet must contain '\0',
506
 
      in any type of handshake (4.1 or pre-4.1).
507
 
     */
508
 
    if (passwd >= packet_end)
509
 
    {
510
 
      my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
511
 
      break;
512
 
    }
513
 
    uint32_t passwd_len= (session->client_capabilities & CLIENT_SECURE_CONNECTION ?
514
 
                      (unsigned char)(*passwd++) : strlen(passwd));
515
 
    uint32_t dummy_errors, save_db_length, db_length;
516
 
    int res;
517
 
    USER_CONN *save_user_connect;
518
 
    string old_username;
519
 
 
520
 
    db+= passwd_len + 1;
521
 
    /*
522
 
      Database name is always NUL-terminated, so in case of empty database
523
 
      the packet must contain at least the trailing '\0'.
524
 
    */
525
 
    if (db >= packet_end)
526
 
    {
527
 
      my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
528
 
      break;
529
 
    }
530
 
    db_length= strlen(db);
531
 
 
532
 
    char *ptr= db + db_length + 1;
533
 
    uint32_t cs_number= 0;
534
 
 
535
 
    if (ptr < packet_end)
536
 
    {
537
 
      if (ptr + 2 > packet_end)
538
 
      {
539
 
        my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
540
 
        break;
541
 
      }
542
 
 
543
 
      cs_number= uint2korr(ptr);
544
 
    }
545
 
 
546
 
    /* Convert database name to utf8 */
547
 
    db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
548
 
                             system_charset_info, db, db_length,
549
 
                             session->charset(), &dummy_errors)]= 0;
550
 
    db= db_buff;
551
 
 
552
 
    /* Save user and privileges */
553
 
    save_db_length= session->db_length;
554
 
    save_db= session->db;
555
 
    save_user_connect= session->user_connect;
556
 
 
557
 
    old_username= session->security_ctx.user;
558
 
    session->security_ctx.user.assign(user);
559
 
 
560
 
    /* Clear variables that are allocated */
561
 
    session->user_connect= 0;
562
 
    res= check_user(session, passwd, passwd_len, db);
563
 
 
564
 
    if (res)
565
 
    {
566
 
      session->security_ctx.user= old_username;
567
 
      session->user_connect= save_user_connect;
568
 
      session->db= save_db;
569
 
      session->db_length= save_db_length;
570
 
    }
571
 
    else
572
 
    {
573
 
      if (save_db)
574
 
        free(save_db);
575
 
 
576
 
      if (cs_number)
577
 
      {
578
 
        session->update_charset();
579
 
      }
580
 
    }
581
 
    break;
582
 
  }
583
472
  case COM_QUERY:
584
473
  {
585
474
    if (alloc_query(session, packet, packet_length))
625
514
    }
626
515
    break;
627
516
  }
628
 
  case COM_FIELD_LIST:                          // This isn't actually needed
629
 
  {
630
 
    char *fields, *packet_end= packet + packet_length, *arg_end;
631
 
    /* Locked closure of all tables */
632
 
    TableList table_list;
633
 
    LEX_STRING conv_name;
634
 
 
635
 
    /* used as fields initializator */
636
 
    lex_start(session);
637
 
 
638
 
    status_var_increment(session->status_var.com_stat[SQLCOM_SHOW_FIELDS]);
639
 
    memset(&table_list, 0, sizeof(table_list));
640
 
    if (session->copy_db_to(&table_list.db, &table_list.db_length))
641
 
      break;
642
 
    /*
643
 
      We have name + wildcard in packet, separated by endzero
644
 
    */
645
 
    arg_end= strchr(packet, '\0');
646
 
    session->convert_string(&conv_name, system_charset_info,
647
 
                        packet, (uint32_t) (arg_end - packet), session->charset());
648
 
    table_list.alias= table_list.table_name= conv_name.str;
649
 
    packet= arg_end + 1;
650
 
 
651
 
    if (!my_strcasecmp(system_charset_info, table_list.db,
652
 
                       INFORMATION_SCHEMA_NAME.c_str()))
653
 
    {
654
 
      ST_SCHEMA_TABLE *schema_table= find_schema_table(session, table_list.alias);
655
 
      if (schema_table)
656
 
        table_list.schema_table= schema_table;
657
 
    }
658
 
 
659
 
    session->query_length= (uint32_t) (packet_end - packet); // Don't count end \0
660
 
    if (!(session->query=fields= (char*) session->memdup(packet,session->query_length+1)))
661
 
      break;
662
 
    if (lower_case_table_names)
663
 
      my_casedn_str(files_charset_info, table_list.table_name);
664
 
 
665
 
    /* init structures for VIEW processing */
666
 
    table_list.select_lex= &(session->lex->select_lex);
667
 
 
668
 
    lex_start(session);
669
 
    session->reset_for_next_command();
670
 
 
671
 
    session->lex->
672
 
      select_lex.table_list.link_in_list((unsigned char*) &table_list,
673
 
                                         (unsigned char**) &table_list.next_local);
674
 
    session->lex->add_to_query_tables(&table_list);
675
 
 
676
 
    /* switch on VIEW optimisation: do not fill temporary tables */
677
 
    session->lex->sql_command= SQLCOM_SHOW_FIELDS;
678
 
    mysqld_list_fields(session,&table_list,fields);
679
 
    session->lex->unit.cleanup();
680
 
    session->cleanup_after_query();
681
 
    break;
682
 
  }
683
517
  case COM_QUIT:
684
518
    /* We don't calculate statistics for this command */
685
519
    net->error=0;                               // Don't give 'abort' message
699
533
    status_var_increment(session->status_var.com_other);
700
534
    session->my_ok();                           // Tell client we are alive
701
535
    break;
702
 
  case COM_PROCESS_INFO:
703
 
    status_var_increment(session->status_var.com_stat[SQLCOM_SHOW_PROCESSLIST]);
704
 
    mysqld_list_processes(session, NULL, 0);
705
 
    break;
706
 
  case COM_PROCESS_KILL:
707
 
  {
708
 
    status_var_increment(session->status_var.com_stat[SQLCOM_KILL]);
709
 
    ulong id=(ulong) uint4korr(packet);
710
 
    sql_kill(session,id,false);
711
 
    break;
712
 
  }
713
 
  case COM_SET_OPTION:
714
 
  {
715
 
    status_var_increment(session->status_var.com_stat[SQLCOM_SET_OPTION]);
716
 
    uint32_t opt_command= uint2korr(packet);
717
 
 
718
 
    switch (opt_command) {
719
 
    case (int) DRIZZLE_OPTION_MULTI_STATEMENTS_ON:
720
 
      session->client_capabilities|= CLIENT_MULTI_STATEMENTS;
721
 
      session->my_eof();
722
 
      break;
723
 
    case (int) DRIZZLE_OPTION_MULTI_STATEMENTS_OFF:
724
 
      session->client_capabilities&= ~CLIENT_MULTI_STATEMENTS;
725
 
      session->my_eof();
726
 
      break;
727
 
    default:
728
 
      my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
729
 
      break;
730
 
    }
731
 
    break;
732
 
  }
733
536
  case COM_SLEEP:
734
537
  case COM_CONNECT:                             // Impossible here
735
 
  case COM_TIME:                                // Impossible from client
736
538
  case COM_END:
737
539
  default:
738
540
    my_message(ER_UNKNOWN_COM_ERROR, ER(ER_UNKNOWN_COM_ERROR), MYF(0));
3178
2980
  I_List_iterator<Session> it(threads);
3179
2981
  while ((tmp=it++))
3180
2982
  {
3181
 
    if (tmp->command == COM_DAEMON)
3182
 
      continue;
3183
2983
    if (tmp->thread_id == id)
3184
2984
    {
3185
2985
      pthread_mutex_lock(&tmp->LOCK_delete);    // Lock from delete